Python-Selenium WebDriverWait在没有断点的情况下不起作用

时间:2019-05-30 04:21:58

标签: python-3.x selenium python-3.7 webdriverwait

我正试图从中收集一些数据

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 :(得分:0)

您的代码可以正常工作,但我认为可能会导致问题。 在您的wait.until()中,您正在使用presence_of_element_located

正如您所说,它以前曾在工作,现在不再工作。我的猜测是找到了该元素但未完全加载该元素,然后您调用了在顶部滚动,但没有使该元素出现。

EC的另一种方法是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正常工作,但是如您所见,我已对其进行了更改,使其更简单易读。