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() 代码解释
login函数: 实现具体的登录操作,加入等待页面加载的逻辑。 WebDriverWait和expected_conditions来等待特定元素的出现,避免因页面加载缓慢导致的异常。NoSuchElementException、WebDriverException和TimeoutException异常,并返回False表示登录失败。main函数中实现重试逻辑,最多尝试登录三次,每次失败后等待3秒再重试。异常处理
通过这种方式,可以更全面地处理登录过程中可能遇到的异常,并实现自动重试机制,提高登录操作的成功率和稳定性。
使用装饰器可以使代码更加简洁和模块化:
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