selenium.webdriver.support.wait在python中的异常处理与重试机制
发布时间:2023-12-25 08:36:43
selenium.webdriver.support.wait是Selenium库中的一个类,用于等待条件的满足。它提供了异常处理和重试机制,可以在特定条件发生之前等待,并在等待过程中处理异常。
下面是一个使用selenium.webdriver.support.wait进行异常处理和重试的例子:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
def retry(func, max_retries=3, delay=1):
def wrapper(*args, **kwargs):
for i in range(max_retries):
try:
return func(*args, **kwargs)
except TimeoutException:
print(f'Retrying {func.__name__} ({i+1}/{max_retries})')
time.sleep(delay)
raise TimeoutException(f'Retries exceeded for {func.__name__}')
return wrapper
@retry
def find_element(driver, by, value):
return driver.find_element(by, value)
driver = webdriver.Chrome()
driver.get("https://www.example.com")
wait = WebDriverWait(driver, 10)
try:
# 使用wait.until等待条件满足
element = wait.until(EC.presence_of_element_located((By.ID, "myElement")))
print("Element found")
except TimeoutException:
print("Element not found")
# 使用重试机制查找元素
element = find_element(driver, By.ID, "myElement")
print("Element found")
driver.quit()
在上面的例子中,我们首先定义了一个retry装饰器函数,用于添加重试机制。它接受一个函数作为参数,并在函数执行时捕获TimeoutException异常。如果捕获到异常,则等待一段时间后再次执行函数,最多重试max_retries次。如果重试次数超过限制,则抛出TimeoutException异常。
然后,我们使用retry装饰器修饰了find_element函数,该函数使用driver.find_element方法来查找页面上的元素。如果在指定时间内找不到元素,会抛出TimeoutException异常。修饰后的find_element函数将自动进行重试,最多重试3次。
在主程序中,我们首先使用wait.until方法等待条件(EC.presence_of_element_located((By.ID, "myElement")))满足,如果在等待时间内条件不满足,则抛出TimeoutException异常。
接着,我们使用修饰后的find_element函数查找指定的元素,如果在3次重试后仍然找不到元素,则抛出TimeoutException异常。
最后,我们关闭浏览器。
通过使用selenium.webdriver.support.wait的异常处理和重试机制,我们可以优雅地处理元素查找等待的过程,增加脚本的稳定性和可靠性。
