阅读量:0
文章目录
思路一:使用添加异常重试机制 [常用]
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def login(driver, username, password): try: # 访问登录页面 driver.get("https://example.com/login") # 等待页面加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username"))) # 输入用户名 username_field = driver.find_element(By.ID, "username") username_field.send_keys(username) # 输入密码 password_field = driver.find_element(By.ID, "password") password_field.send_keys(password) # 点击登录按钮 login_button = driver.find_element(By.ID, "loginButton") login_button.click() # 等待页面加载完成并检查是否登录成功 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton"))) print("登录成功") return True except NoSuchElementException as e: print(f"登录失败,未找到元素: { e}") except WebDriverException as e: print(f"登录失败,Web驱动异常: { e}") except TimeoutException as e: print(f"登录失败,操作超时: { e}") return False def main(): # 设置WebDriver driver = webdriver.Chrome() # 根据实际使用的浏览器选择对应的驱动 username = "your_username" password = "your_password" max_retries = 3 for attempt in range(max_retries): print(f"尝试登录次数: { attempt + 1}") if login(driver, username, password): break else: print("登录失败,重试中...") time.sleep(3) # 等待一段时间后重试 driver.quit() if __name__ == "__main__": main()
代码解释
- 导入库: 引入必要的Selenium库、WebDriver等待机制、预期条件以及异常处理模块。
login
函数: 实现具体的登录操作,加入等待页面加载的逻辑。- 使用
WebDriverWait
和expected_conditions
来等待特定元素的出现,避免因页面加载缓慢导致的异常。 - 捕获
NoSuchElementException
、WebDriverException
和TimeoutException
异常,并返回False
表示登录失败。
- 使用
- 重试机制: 在
main
函数中实现重试逻辑,最多尝试登录三次,每次失败后等待3秒再重试。 - WebDriver设置: 根据实际使用的浏览器选择对应的WebDriver(如Chrome、Firefox等)。
异常处理
- NoSuchElementException: 当无法找到指定的元素时抛出。
- WebDriverException: 当Web驱动程序出现问题时抛出。
- TimeoutException: 当等待操作超时时抛出。
通过这种方式,可以更全面地处理登录过程中可能遇到的异常,并实现自动重试机制,提高登录操作的成功率和稳定性。
思路二:使用装饰器实现重试机制 [常用]
使用装饰器可以使代码更加简洁和模块化:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import functools def retry_on_exception(max_retries, exceptions, delay=3): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except exceptions as e: print(f"Exception: { e}. Retrying { attempt + 1}/{ max_retries}...") time.sleep(delay) print("Max retries reached. Exiting.") return