Как установить переменную, эквивалентную одному объекту массива при переборе массива? - PullRequest
0 голосов
/ 27 мая 2019

нубский вопрос. Мне нужно передать 3000+ URL-адресов с листа CSV в Selenium. Мне нужно, чтобы Selenium перешел к каждой из этих ссылок, очистил информацию и затем поместил эту информацию в CSV.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я помещаю свои CSV-URL-адреса в массив, я не могу передать один единственный объект (URL) в Selenium за раз.

Я знаю, что мне, вероятно, нужна какая-то петля. Я попытался настроить циклы и выбрать из массива, используя .map, .select. и просто цикл.

urls.map do |url|
    @driver.navigate.to #{url}
    name = @driver.find_element(:css, '.sites-embed- 
footer>a').attribute('href')
    puts name
    kb_link = name
    kb_array.push(kb_link)
    puts 'urls is #{n}'
end

В приведенном выше примере Selenium возвращает сообщение об ошибке «неверный URL». Дебаггинг с Pry говорит мне, что мой объект 'url' - это не один URL, а все же весь массив.

Как настроить Selenium на посещение каждого URL из массива один за другим?

РЕДАКТИРОВАТЬ: ---------------- Итак, после обширного устранения ошибок с Pry, я обнаружил пару проблем. Сначала было то, что мой CSV передавал вложенный массив в мой цикл, который вызывал ошибку URL. Мне пришлось сгладить массив и удалить его из гнезда, чтобы обойти эту проблему.

После этого мне пришлось встроить спасение в мой цикл, чтобы мой скрипт не умирал, когда натолкнулся на страницу без искомого элемента CSS.

Вот завершенный цикл.

begin
        @urls1.each do |url|
          @driver.navigate.to(url)
          @driver.manage.timeouts.implicit_wait = 10

          name = @driver.find_element(:css, '.sites-embed- 
          footer>a').attribute('href')
          puts name
          kb_link = name
          kb_array.push(kb_link)
          puts 'done'

         rescue Selenium::WebDriver::Error::NoSuchElementError
         puts 'no google doc'
         x = 'no google doc'
         kb_array.push(x)
         next
    end

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Прежде всего, нет смысла использовать map, если вы не используете результат блока где-либо. map, примененный к Enumerable, возвращает новый массив, и вы ничего не делаете с возвращенным массивом (который в вашем случае будет содержать только возвращаемые значения puts, обычно это ноль, так что вы получите обратно просто массив нулей с побочным эффектом, что что-то записывается в стандартный вывод.

Если вас интересуют только побочные эффекты, each или each_with_index следует использовать для прохождения Enumerable. Учитывая проблемы с map и с each, мне интересно, каково реальное содержание вашего объекта urls. Вы когда-нибудь проверяли это? Вы могли бы сделать

p urls

перед входом в цикл. С 3000 URL-адресов результат будет огромным, но, возможно, вы сможете запустить его на более простом примере с меньшим количеством URL-адресов.

0 голосов
/ 27 мая 2019

Как насчет использования .each?

Пример:

array = [1, 2, 3, 4, 5, 6]
array.each { |x| puts x }

В вашем коде:

urls.each do |url|
    @driver.navigate.to #{url}
    name = @driver.find_element(:css, '.sites-embed-footer>a').attribute('href')
    puts name
    kb_link = name
    kb_array.push(kb_link)
    puts 'urls is #{n}'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...