在页面完全加载之前,如何使硒单击元素和刮擦数据?我的互联网连接非常糟糕,因此有时会永远完全加载页面,无论如何是否存在?
用硒4(2024年7月7日)
更新page_load_strategy
page_load_strategy现在是一个属性。因此,使用Selenium V 4.6 及以下的最小代码块 page_load_strategy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
# options.page_load_strategy = 'none'
options.page_load_strategy = 'eager'
# options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
Chromedriver 77.0 (支持Chrome版本77)现在支持 eager
as pageloadstrategy 。。
解决问题1902:支持急切的页面加载策略[PRI-2]
当您提到click on elements and scrape data before the page has fully loaded
的问题时,在这种情况下,我们可以帮助属性 pageLoadStrategy
。当Selenium默认加载页面/URL时,它遵循默认配置, pageLoadStrategy
设置为 normal
。硒可以从不同的 Document readiness state
开始执行下一行代码。当前,硒支持3个不同的 Document readiness state
我们可以通过 pageLoadStrategy
进行配置,如下所示:
-
none
(UNDEFENINE) -
eager
(页面变为互动) -
normal
(完成页面加载)
这是配置 pageLoadStrategy
的代码块:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
binary = r'C:Program FilesMozilla Firefoxfirefox.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")
更新2022:现在,Chromedriver支持了这种行为。请参阅 @未检测到的答案。如果您必须使用"无" pageloadstrategy(例如,如果您不想等待页面互动)。
)。旧答案:
我们可以使用"无" pageloadstrategy并实现自定义等待功能,直到我们的特定元素可以相互作用。
初始化Chromedriver时,将Pageloadstrategy添加到所需的功能中:
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"] = "eager" # Waits for page to be interactive
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"))
)
现在,您可以在完整加载页面之前开始与元素进行交互!
与使用Chrome的人相同。帽子。完美工作。加快了我的时间。
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"] = "eager" # Do not wait for full page load
driver = webdriver.Chrome(desired_capabilities=caps, executable_path="path/to/chromedriver.exe")