Python - Selenium WebDriverWait не работает без точки останова - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь собрать некоторые данные из

https://www.91mobiles.com/phonefinder.php

Мне нужно подождать ajax-вызова, чтобы получить кнопку «Далее», но WebDriverWait, похоже, игнорируется (не попадает) безточка останова.Раньше он работал 2 недели назад, но теперь это не так.

  • Я думал, что это веб-драйвер -> перейти на Chrome вместо Firefox, но результат тот же
  • Обновите все пакеты до последних -> одинаковые
  • Пытался использовать C # с той же реализацией -> работает, не знаю почему => заверните, возможно, проблема не в их веб-сайте

Синтаксис C #:

Driver.ExecuteScript("window.scrollTo({ top: document.body.scrollHeight || document.documentElement.scrollHeight, behavior: 'smooth' });");

Wait.Until(s => s.FindElement(By.CssSelector('div#finder_pagination>div.listing-btns>div.listing-btns4>span')));

Driver.ExecuteScript("window.scrollTo({ top: 0, behavior: 'smooth' });");
// Work as expected
...

Синтаксис Python:

# Scroll to bottom for AJAX loading
self.browser.execute_script('window.scrollTo({ top: document.body.scrollHeight || document.documentElement.scrollHeight, behavior: "smooth" });')

# timeout is 30 seconds, execution will be delayed until the 'NEXT' button found
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div#finder_pagination>div.listing-btns>div.listing-btns4>span')))

# after that, scroll back to top
self.browser.execute_script('window.scrollTo({ top: 0, behavior: "smooth" });')
# The web does not wait, it scroll right away and execute the next code
...

Заранее спасибо

1 Ответ

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

Ваш код отлично работает с моей стороны, но здесь, где я считаю, может возникнуть проблема. В вашем wait.until() вы используете presence_of_element_located.

Как вы заявили, он работал раньше и больше не работает. Я предполагаю, что элемент найден, но не был полностью загружен, после чего вы вызвали прокрутку сверху, которая не заставила элемент появиться.

Другой метод ЕС - visibility_of_element_located. Эта логика будет использовать ту же логику, что и присутствие ..., но вернет элемент только тогда, когда он станет видимым, используя

is_disaplayed()

Измените код, чтобы использовать вместо этого метод:

driver.get('https://www.91mobiles.com/phonefinder.php')
driver.execute_script('window.scrollTo({ top: document.body.scrollHeight || document.documentElement.scrollHeight, behavior: "smooth" });')
wait = WebDriverWait(driver, 30)
# timeout is 30 seconds, execution will be delayed until the 'NEXT' button found
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#finder_pagination .listing-btns4')))

# after that, scroll back to top
driver.execute_script('window.scrollTo({ top: 0, behavior: "smooth" });')

Ваш css_selector работал, но, как вы можете видеть, я изменил его на более простой и читаемый.

...