等到页面用 Selenium WebDriver for Python 加载

新手上路,请多包涵

我想抓取无限滚动实现的页面的所有数据。以下python代码有效。

 for i in range(100):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)

这意味着每次我向下滚动到底部时,我都需要等待 5 秒,这通常足以让页面完成加载新生成的内容。但是,这可能没有时间效率。页面可能会在 5 秒内完成加载新内容。每次向下滚动时,如何检测页面是否完成加载新内容?如果我能检测到这一点,我可以在知道页面完成加载后再次向下滚动以查看更多内容。这样更省时。

原文由 apogne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 697
2 个回答

webdriver 将默认通过 .get() 方法等待页面加载。

正如@user227215 所说,您可能正在寻找一些特定元素,您应该使用 WebDriverWait 等待页面中的元素:

 from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
delay = 3 # seconds
try:
    myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
    print "Page is ready!"
except TimeoutException:
    print "Loading took too much time!"

我用它来检查警报。您可以使用任何其他类型的方法来查找定位器。

编辑1:

我应该提到 webdriver 默认会等待页面加载。它不等待加载内部框架或 ajax 请求。这意味着当您使用 .get('url') 时,您的浏览器将等待页面完全加载,然后转到代码中的下一个命令。但是当您发布 ajax 请求时, webdriver 不会等待,您有责任等待适当的时间来加载页面或页面的一部分;所以有一个名为 expected_conditions 的模块。

原文由 Zeinab Abbasimazar 发布,翻译遵循 CC BY-SA 3.0 许可协议

试图将 --- 传递给 presence_of_element_located find_element_by_id 的构造函数(如 接受的答案 所示)导致 NoSuchElementException 被提升。我不得不使用 fragles 评论 中的语法:

 from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get('url')
timeout = 5
try:
    element_present = EC.presence_of_element_located((By.ID, 'element_id'))
    WebDriverWait(driver, timeout).until(element_present)
except TimeoutException:
    print "Timed out waiting for page to load"

这与 文档中的示例 相匹配。这是 By 文档 的链接。

原文由 user3657941 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题