【完整代码】Python代码,实现selenium页面元素找不到超时时,刷新驱动和刷新页面,若能找到,继续执行下一步

需求:

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()

关键点说明

  1. 获取浏览器驱动get_webdriver函数设置了浏览器选项并返回一个Chrome驱动实例。
  2. 重试和刷新机制retry_with_refresh_and_restart装饰器在捕获到NoSuchElementExceptionTimeoutException时,每隔5秒刷新一次页面,最多刷新5次。如果仍然找不到元素,则重启驱动并继续尝试。这个过程最多会重复3次。
  3. 登录函数login函数执行实际的登录操作,包括打开URL、输入用户名和密码、点击登录按钮,并等待登录成功的元素出现。

通过这种方式,程序在遇到页面元素找不到的情况时,会刷新页面并重新尝试操作,如果达到最大重试次数,还会重启驱动并继续尝试,从而提高操作的成功率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚务必早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值