我正试图从中收集一些数据
https://www.91mobiles.com/phonefinder.php
我必须等待ajax调用才能获取“下一步”按钮,但是WebDriverWait似乎已被忽略(没有命中)而没有断点。 过去,它曾经工作了2周,但现在却没有。
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
...
预先感谢
答案 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正常工作,但是如您所见,我已对其进行了更改,使其更简单易读。