📜  如果在 Selenium 中混合隐式等待和显式等待会发生什么 (1)

📅  最后修改于: 2023-12-03 14:53:22.619000             🧑  作者: Mango

Selenium 中的隐式等待和显式等待

介绍

Selenium 是一个用于自动化浏览器操作的工具,它提供了丰富的 API,可用于编写测试脚本和进行网络爬虫等任务。其中,隐式等待和显式等待是两种常用的等待方式,用于处理页面加载和元素定位的问题。

隐式等待(Implicit Waits)

隐式等待是一种全局设定,它会在查找元素时等待一段时间,如果在指定时间内找到了元素,则立即执行相应的操作,如果超过指定时间仍未找到元素,则抛出 NoSuchElementException 异常。

在 Selenium 中,可以使用 driver.implicitly_wait(time_to_wait) 方法来设置隐式等待的时间,默认为 0 秒。例如,设置隐式等待时间为 10 秒:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)
显式等待(Explicit Waits)

显式等待是针对特定元素的等待方式,可以根据某个条件来等待元素的出现或消失。在 Selenium 中,可以使用 WebDriverWait 类来实现显式等待。

以下是一个显式等待的示例,等待直到页面标题包含特定的关键字:

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
title_contains_keyword = EC.title_contains("Selenium")
element = wait.until(title_contains_keyword)

在上面的示例中,WebDriverWait(driver, timeout) 构造方法接收一个 WebDriver 对象和超时时间,并返回一个 WebDriverWait 实例。然后,可以使用 until() 方法来指定等待条件,这里使用了 title_contains() 方法来检查页面标题是否包含关键字 "Selenium",并等待直到找到符合条件的元素。如果超过指定的等待时间,将会抛出 TimeoutException 异常。

混合使用隐式等待和显式等待

在 Selenium 中,混合使用隐式等待和显式等待是可行的,但需要注意一些问题。由于隐式等待是全局设定,它适用于所有的元素操作,而显式等待是针对特定元素的等待,对于某个特定元素操作可以使用显式等待,而对于其他元素操作可以使用隐式等待。

但是,需要注意的是,如果显式等待时间设置得过长,可能会导致整个脚本的运行时间增加,所以需要权衡等待时间的长短。此外,由于隐式等待是全局设定,它会影响到整个 WebDriver 对象的生命周期,所以建议在创建 WebDriver 对象之后立即进行设置,避免可能的意外行为。

例如,可以在创建 WebDriver 对象后立即设置隐式等待时间为 10 秒,并在需要的地方使用显式等待来等待特定元素的出现或消失:

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

driver = webdriver.Chrome()
driver.implicitly_wait(10)

wait = WebDriverWait(driver, 10)
title_contains_keyword = EC.title_contains("Selenium")
element = wait.until(title_contains_keyword)

# 进行其他操作
总结

Selenium 中的隐式等待和显式等待是两种常用的等待方式,用于处理页面加载和元素定位的问题。隐式等待是全局设定,适用于所有元素操作,而显式等待是针对特定元素的等待。混合使用隐式等待和显式等待可以更灵活地控制脚本的执行逻辑,但需要权衡等待时间的长短,并在适当的时候设置隐式等待时间。