需求:
Python代码,使用Selenium进行网页自动化操作,页面元素找不到超时时,每隔5秒钟刷新一次页,在这5秒内再找元素,如果刷新了页面5次后还找不到,重启驱动后,继续每隔5秒钟刷新一次页,在这5秒内再找元素,如果刷新了页面5次后还找不到,重启驱动后,继续,就这样大循环三次后还找不到,退出驱动。
完整代码
1. 安装必要的库
确保你已经安装了Selenium和webdriver_manager
:
pip install selenium webdriver_manager
2. 完整代码示例
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
def get_webdriver():
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
return webdriver.Chrome(ChromeDriverManager().install(), options=options)
def retry_with_refresh_and_restart(func):
def wrapper(*args, **kwargs):
max_refresh_retries = 5
max_driver_restarts = 3
delay = 5
driver = args[0]
for restart_attempt in range(max_driver_restarts):
for refresh_attempt in range(max_refresh_retries):
try:
return func(*args, **kwargs)
except (NoSuchElementException, TimeoutException) as e:
print(f"Exception: {e}. Refresh attempt {refresh_attempt + 1} of {max_refresh_retries}.")
driver.refresh()
time.sleep(delay)
print("Max refresh attempts reached. Restarting driver...")
driver.quit()
driver = get_webdriver()
args = (driver,) + args[1:] # 更新driver参数
raise Exception(f"Failed to complete the operation after {max_driver_restarts} driver restarts and {max_refresh_retries} refresh attempts each.")
return wrapper
@retry_with_refresh_and_restart
def login(driver, url, username, password):
driver.get(url)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, 'username')))
username_field = driver.find_element(By.NAME, 'username')
username_field.send_keys(username)
password_field = driver.find_element(By.NAME, 'password')
password_field.send_keys(password)
login_button = driver.find_element(By.NAME, 'login')
login_button.click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'logout')))
print("Logged in successfully!")
if __name__ == "__main__":
url = 'http://example.com/login'
username = 'your_username'
password = 'your_password'
driver = get_webdriver()
try:
login(driver, url, username, password)
except Exception as e:
print(f"Failed to login: {e}")
finally:
driver.quit()
关键点说明
- 获取浏览器驱动:
get_webdriver
函数设置了浏览器选项并返回一个Chrome驱动实例。 - 重试和刷新机制:
retry_with_refresh_and_restart
装饰器在捕获到NoSuchElementException
或TimeoutException
时,每隔5秒刷新一次页面,最多刷新5次。如果仍然找不到元素,则重启驱动并继续尝试。这个过程最多会重复3次。 - 登录函数:
login
函数执行实际的登录操作,包括打开URL、输入用户名和密码、点击登录按钮,并等待登录成功的元素出现。
通过这种方式,程序在遇到页面元素找不到的情况时,会刷新页面并重新尝试操作,如果达到最大重试次数,还会重启驱动并继续尝试,从而提高操作的成功率。