欢迎访问宙启技术站
智能推送

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的异常处理和重试机制,我们可以优雅地处理元素查找等待的过程,增加脚本的稳定性和可靠性。