Как заставить браузер ждать с Capybara & Kimurai? - PullRequest
1 голос
/ 06 августа 2020

Я просматриваю [эту страницу] [1], чтобы найти подробную информацию о школах, которые содержатся в CSS селекторах .box .column, содержащихся в div .schools, который загружается динамически и занимает некоторое время появляются. Я сделал это с драгоценным камнем watir , и у меня не было проблем. Вот код для справки.

    browser = Watir::Browser.new
    browser.goto('https://educationdestinationmalaysia.com/schools/pre-university')
    js_doc = browser.element(css: '.schools').wait_until(&:present?)
    schools_list = Nokogiri::HTML(js_doc.inner_html)
    school_cards = schools_list.css('.box .columns .column:nth-child(2)')

Сейчас я пытаюсь добиться того же с драгоценным камнем kimurai, но я не очень хорошо знаком с Capybara.

Что я пробовал

  • Изменение максимального времени ожидания по умолчанию
  def parse(response, url:, data: {})
       Capybara.default_max_wait_time = 20
       puts browser.has_css?('div.schools')
   end 
  • using_wait_time
  browser.using_wait_time(20) do
     puts browser.has_css?('.schools')
   end
  • Передача аргумента wait в has_css?
   browser.has_css?('.schools', wait: 20)

Спасибо за чтение! [1]: https://educationdestinationmalaysia.com/schools/pre-university

1 Ответ

2 голосов
/ 06 августа 2020

Ваш код Watir

js_doc = browser.element(css: '.schools').wait_until(&:present?)

возвращает элемент, но в коде Capybara вы вызываете методы предиката (has_ css?, Has_xpath?, Has_selector? И т. Д. c), которые просто вернуть истину или ложь. Эти методы предиката будут ждать, только если Capybara.predicates_wait истинно. Есть ли конкретная c причина, по которой вы используете предикаты? Вместо этого вы можете просто find интересующий вас элемент, который будет ждать до Capybara.default_max_wait_time, или вы можете указать настраиваемую опцию ожидания. «Эквивалент» вашего примера Watir

js_doc = browser.element(css: '.schools').wait_until(&:present?)
schools_list = Nokogiri::HTML(js_doc.inner_html)
school_cards = schools_list.css('.box .columns .column:nth-child(2)'

при условии, что для Capybara.default_max_wait_time установлено значение, достаточно высокое для вашего приложения и настройки тестирования

school_cards = browser.find('.schools').all('.box .columns .column:nth-child(2)')

Если вам действительно нужно продлите время ожидания одной из находок, которые вы могли бы сделать

school_cards = browser.find('.schools', wait: 10).all('.box .columns .column:nth-child(2)')

, чтобы подождать до 10 секунд появления элемента .schools. Его также можно просто свернуть в

school_cards = browser.all('.schools .box .columns .column:nth-child(2)')

, который также будет ждать (до Capybara.default_max_wait_time) хотя бы одного подходящего элемента, прежде чем вернуть его, хотя в зависимости от вашего точного HTML

school_cards = browser.all('.schools .column:nth-child(2)')

может быть таким же хорошим, но менее fr agile

Примечание: вы должны использовать движок Kimurai, который поддерживает JS - https://github.com/vifreefly/kimuraframework#available -двигатели - иначе вы не сможете взаимодействовать с сайтами Dynami c

...