如何在 Selenium 中进行等待

Posted on Wed, 25 Dec 2024 16:13:32 +0800 by LiangMingJian


强制等待

直接使代码停止执行。

import time

time.sleep(3)

隐式等待

设置一个全局隐性等待时间,如果在等待时间内找到了就执行下一步,未找到则报错。隐式等待在设置一次后,会对所有元素生效。需要注意的是,在使用隐式等待时,即使需要的某个元素已经出现了,仍然要等其他元素加载完毕,才能执行下一步,这是它的缺点。

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get("https://www.jd.com")
driver.implicitly_wait(3)  # 设置隐式等待时间
driver.quit()

显式等待

每隔一段时间检查一下,条件成立则执行下一步,若到达设置的最长时间还未满足,则抛出超时异常。 需要注意的是,显示等待需要用到 WebDriverWait 类,配合该类的 until()until_not() 方法来判断是否执行下一步,通常结合断言工具 expected_conditions (EC)来使用。


from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.jd.com")
WebDriverWait(driver, 10,2).until(EC.presence_of_element_located((By.id, 'key')))
# 每隔 2s 判断元素是否出现,2 可以不设置,默认为 0.5s 轮询一次,最长 10s,超时未出现则报错

Ex.页面的加载状态

Web 的页面属性 document.readyState 描述当前页面的加载状态,该属性有三个值:loading(正在加载)、interactive(可交互)、complete(完成)。默认情况下,在 document.readyState 为 complete 之前,WebDriver 都将延迟 driver.get() 的响应或 driver.navigate().to() 的调用。

对此,WebDriver 支持三种页面加载策略,通过属性 pageLoadStrategy 来描述,该属性有三种取值:normal(等待整个页面完全加载)、eager(待整个页面加载,但无关 CSS,图片)、none(仅等待至初始页面下载完成)。

默认情况下,当 Selenium WebDriver 加载页面时,遵循 normal 的页面加载策略,始终加载所有内容。但某些时候,你可以在页面访问缓慢时,停止下载其他资源,例如图片或 CSS。

from selenium import webdriver

options = Options()
options.page_load_strategy = 'normal' # normal eager none 默认normal
driver = webdriver.Chrome(options=options)
driver.get("https://www.baidu.com")
print(driver.capabilities)

此外,你还可以使用 set_page_load_timeout() 主动设置加载超时时间,手动结束页面加载,然后执行代码。

from selenium import webdriver
 
try:
    driver.set_page_load_timeout(10) # 设置页面加载时间,超时没完成则捕获异常
    driver.get("https://www.geeksforgeeks.org/")
except Exception as e:
    print(e)
    print("超时,直接进入下一步")
 
driver.find_element(By.XPATH, input).send_keys("python")