【问题标题】:Don't wait for a page to load using Selenium in Python不要等待在 Python 中使用 Selenium 加载页面
【发布时间】:2018-03-01 12:30:49
【问题描述】:

如何让 selenium 在页面完全加载之前点击元素并抓取数据?我的互联网连接非常糟糕,所以有时需要很长时间才能完全加载页面,这有什么问题吗?

【问题讨论】:

标签: python selenium selenium-webdriver webdriver pageloadstrategy


【解决方案1】:

ChromeDriver 77.0(支持 Chrome 77 版)现在支持 eager 作为 pageLoadStrategy

已解决的问题 1902:支持急切页面加载策略 [Pri-2]


当您质疑在这种情况下提到 click on elements and scrape data before the page has fully loaded 时,我们可以借助属性 pageLoadStrategy。当 Selenium 默认加载页面/url 时,它遵循默认配置,将 pageLoadStrategy 设置为 normal。 Selenium 可以从不同的 Document readiness state 开始执行下一行代码。目前 Selenium 支持 3 种不同的 Document readiness state,我们可以通过 pageLoadStrategy 配置如下:

  1. none(未定义)
  2. eager(页面变为交互式)
  3. normal(完成页面加载)

这是配置pageLoadStrategy的代码块:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
caps = DesiredCapabilities().FIREFOX
# caps["pageLoadStrategy"] = "normal"  #  complete
caps["pageLoadStrategy"] = "eager"  #  interactive
# caps["pageLoadStrategy"] = "none"   #  undefined
driver = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")
driver.get("https://google.com")

【讨论】:

  • 太棒了!是否可以使用 Chrome 作为浏览器来实现?
  • @nonein 使用DesiredCapabilities,您可以使用任何浏览器 Chrome、IE、Safari、Edge 等来实现它。如果它满足您的问题,请接受答案。
  • 我是否也只是简单地将能力=上限添加到 chrome 中?还是我使用参数函数?
  • 是否也可以使用完全等待页面加载的策略?
【解决方案2】:

对于 Chromedriver,它的工作原理与 @DebanjanB 的答案相同,但是“渴望”页面加载策略是 not yet supported

所以对于 chromedriver 你会得到:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().CHROME
# caps["pageLoadStrategy"] = "normal"  #  Waits for full page load
caps["pageLoadStrategy"] = "none"   # Do not wait for full page load
driver = webdriver.Chrome(desired_capabilities=caps, executable_path="path/to/chromedriver.exe")

请注意,当使用“无”策略时,您很可能必须实现自己的等待方法来检查您需要的元素是否已加载。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

WebDriverWait(driver, timeout=10).until(
    ec.visibility_of_element_located((By.ID, "your_element_id"))
)

现在您可以在页面完全加载之前开始与您的元素进行交互!

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多