【进阶】Python使用selenium 访问网页完成登录操作页面异常时——最全重试机制汇总

文章目录

      • 思路一:使用添加异常重试机制 [常用]
      • 思路二:使用装饰器实现重试机制 [常用]
      • 思路三:使用更复杂的异常处理和恢复机制
      • 思路四:结合日志记录与重试
      • 思路五:使用递归实现重试机制
      • 思路六:结合外部配置文件管理重试参数
      • 思路七:使用自定义异常类来处理特定错误
      • 思路八:使用外部库如 `tenacity` 处理重试

思路一:使用添加异常重试机制 [常用]

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 timedef 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 Trueexcept NoSuchElementException as e:print(f"登录失败,未找到元素: {e}")except WebDriverException as e:print(f"登录失败,Web驱动异常: {e}")except TimeoutException as e:print(f"登录失败,操作超时: {e}")return Falsedef main():# 设置WebDriverdriver = webdriver.Chrome()  # 根据实际使用的浏览器选择对应的驱动username = "your_username"password = "your_password"max_retries = 3for attempt in range(max_retries):print(f"尝试登录次数: {attempt + 1}")if login(driver, username, password):breakelse:print("登录失败,重试中...")time.sleep(3)  # 等待一段时间后重试driver.quit()if __name__ == "__main__":main()

代码解释

  1. 导入库: 引入必要的Selenium库、WebDriver等待机制、预期条件以及异常处理模块。
  2. login函数: 实现具体的登录操作,加入等待页面加载的逻辑。
    • 使用WebDriverWaitexpected_conditions来等待特定元素的出现,避免因页面加载缓慢导致的异常。
    • 捕获NoSuchElementExceptionWebDriverExceptionTimeoutException异常,并返回False表示登录失败。
  3. 重试机制: 在main函数中实现重试逻辑,最多尝试登录三次,每次失败后等待3秒再重试。
  4. 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 functoolsdef 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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java小白入门到实战应用教程-运算符详解

Java小白入门到实战应用教程-运算符 上节回顾 在上节的内容中我们了解了变量和基本数据类型的内容,现在回顾一下上节课的内容。 声明变量的语法为: 数据类型 变量名; 其中在java中一共有8中基本数据类型,分别是:b…

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统

PACS,即图像存储与传输系统,是应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动,集成了医疗设备,图像存储和分发,数字图像在重要诊断和会诊时的显示&a…

【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解

具有 GPIO 控制器和连接器的硬件配置的备树&#xff08;Device Tree&#xff09;代码讲解 背景 -学习Linux设备树 代码 soc {soc_gpio1: gpio-controller1 {#gpio-cells <2>;};soc_gpio2: gpio-controller2 {#gpio-cells <2>;}; };connector: connector {#gpi…

零侵入零代码零配置全自动接口文档生成可在线调试框架doc-apis它来了!

近期开源了一款全自动零侵入零代码零配置接口文档生成框架doc-apis,实测只要代码符合规范,即可生成多端多语种多格式的接口文档,适合敏捷开发,欢迎大家试用,另外也恳请大家帮忙点一下star,帮助开源项目走得更远,让更多人知道,非常感谢! # 官方地址 | Official website --- **…

OD C卷 - 宽度最小的子矩阵

宽度最小的子矩阵 &#xff08;100&#xff09; 给定一个n行 * m列的矩阵&#xff1b;给定一个k个整数的数组k_list&#xff1b;在n*m的矩阵中找一个宽度最小的子矩阵&#xff0c;该子矩阵包含k_list中所有的整数&#xff1b; 输入描述&#xff1a; 第一行输入n,m 两个整数&am…

Redis的五种数据类型与命令

目录 引言 一 Redis的特性 二 Redis的安装 三 Redis的优点 四 Redis的五种数据类型与命令 五 Redis的配置文件 引言 Redis是什么&#xff1f; Remote Dictionary Service(远程字典服务器) Redis 是一个开源的(BSD许可)的&#xff0c;C语言编写的&#xff0c;高性能的数…

计算机网络实验-RIP配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 路由信息协议&#xff08;Routing Information Protocol&#xff0c;RIP&#xff09;是一种基于距离向量&#xff08;Distance-Vector&…

unity2D游戏开发06稳定,材质,碰撞器

稳定性 在操控玩家时,我们会发现玩家移动时,摄像头会有抖动,这是摄像机过度精确造成的。 创建名为RoundCameraPos的C#脚本,用Visual Studio打开 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine;//导入Cinemac…

rust 初探 -- use

rust 初探 – use Package, Crate, 定义 Module use 关键字 作用&#xff1a;将路径引入到作用域内&#xff0c;其依旧遵循私有性规则&#xff0c;也即只用 pub 的部分引入进来才能使用 use crate::front_of_house::hosting; // 绝对路径 // use front_of_house::hosting; …

【Python机器学习】使用Matplotlib注解绘制树形图

通过数据集可以创建树&#xff0c;但是字典的表示形式非常不易于理解&#xff0c;而且直接绘制图形也比较困难。但是通过Matplotlib库可以绘制树形图。 决策树的主要优点就是直观、易于理解&#xff0c;如果不能将其直观的显示出来&#xff0c;就无法发挥其优势。 Matplotlib…

基于JSP、java、Tomcat三者的项目实战--校园交易网(2)登录,注册功能实现

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 OK&#xff0c;那我们进入正题&#xff0c;随着前面一篇博客的尚未完结基于JSP、java、Tomcat三者的项目实战--校园交易网&#xff08;2&#xff09;登录功能…

微软蓝屏事件:网络安全的多维挑战与应对策略

一、引言 1. 事件概述&#xff1a;微软蓝屏事件的影响与范围 微软蓝屏事件&#xff0c;这一近期震动全球科技界的重大事件&#xff0c;起因于一次看似平常的软件更新。美国电脑安全技术公司“众击”发布的更新包中隐藏着一个致命的“缺陷”&#xff0c;这个缺陷如同潜伏的病毒…

函数图像是如何画出来的(LiveCharts2)

大火的人工智能本质上就是一些简单的函数的组合&#xff0c;比如f(x)kxb&#xff0c;只是可能不只有x,还会x1&#xff0c;x2&#xff0c;…xn&#xff0c;只是维数不同&#xff0c;当维数很多的时候自然就需要方程组才能求解&#xff0c;维数越多自然需要的算力就越多。于是就有…

简单小案例分析

一、容器和实例关系 <div class"app"><h1>Hello,{{name}}</h1> </div> <div class"app"><h1>Hello,{{name}}</h1> </div><script>//创建Vue实例new Vue({el:".app", //el用于指定当前V…

easyExcel 3.x以上版本导入数据后,再把错误信息导出,外加自定义RGB背景色、行高、宽度等

easyExcel 3.x以上版本导入数据后&#xff0c;再把错误信息导出&#xff0c;外加自定义RGB背景色 背景 由于项目中用的easypoi导入的数据量大了&#xff0c;会导致OOM的问题&#xff0c;所以要求更换为easyExcel框架做导入。话不多说&#xff0c;这里只做一个导入的示例&…

DP学习——享元模式

学而时习之&#xff0c;温故而知新。 享元模式 名词解析 有必要解释下“享元”两字&#xff0c;英文原文是flyweight pattern——轻量级模式&#xff0c;但是翻译过来的“享元”两字太牛逼了——褒贬不一&#xff0c;翻译的他妈都不认识。 享元的高雅在于: 享:共享/共用 元:…

VB中如何定义和使用数组

在VB&#xff08;Visual Basic&#xff09;中&#xff0c;数组是一种数据结构&#xff0c;用于存储相同类型的数据项集合。这些数据项可以通过索引&#xff08;通常是整数&#xff09;来访问。VB提供了多种方式来定义和使用数组。 定义数组 在VB中&#xff0c;你可以使用Dim语…

Retrieval-Augmented Evaluation方法评估模型幻觉

测试大模型的幻觉 Factuality prompt 1:建立factuality prompt测试集合 “Factuality prompt”是指用于引导语言模型生成与事实相符的文本的输入提示,它通过提供明确的问题或句子,帮助模型聚焦于生成准确的信息,从而提高生成内容的事实准确性。如果一个factuality promp…

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQLMongo&#xff0c;部署安装好之后我本来是找了一个web端的在线连接数据库的工具&#xff0c;但是使用过程中并不丝滑&#xff0c;最终还是选择了使用 DBeaver &#xff0c;然后发现 mongo 还需要许可&#xff0c;又折…

PyQt5 + selenium,自动票务工具,演唱会门票,学习使用

PyQt5 selenium&#xff1b;在damai工具的基础上加入了UI界面&#xff0c;并将应用做了打包工作&#xff0c;主要是方便不会/不想折腾环境的用户使用&#xff0c;抢票的核心代码来自由于原作者不再维护&#xff0c;自己修改了部分代码。 安装教程 解压安装包到任意位置&…