Selenium三种等待方式的使用!
UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1、有frame;2、没有设置等待。
因为代码运行速度和浏览器加载渲染速度,不是一个量级,所以导致了这种情况发生。在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间:显式等待、隐式等待、强制等待。
一、显示等待
定义:等待某个条件成立时继续执行,否则在达到最大时长时抛出异常(TimeoutException);
WebDriverWait类是由webdriver提供的等待方法,配合该类提供的until()和until_not()方法一起使用,就可以根据判断条件而灵活进行等待,格式如下:
1 WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)2 driver:浏览器驱动3 timeout:最长超时时间4 poll_frequency:检测间隔时间,默认0.5s5 ignored_exceptions:超时后的异常信息,默认情况抛出NoSuchElementException异常6 WebDriverWait()一般由until()或until_not方法配合使用,下面是这两种方法的说明:7 until(method,message=''):调用该方法提供的驱动程序作为一个参数,直到返回值为True;8 until_not(method,message=''):调用该方法提供的驱动程序作为一个参数,直到返回值为Flase;
示例代码如下:
1 # coding = utf-82 from selenium import webdriver3 from selenium.webdriver.support.wait import WebDriverWait4 from selenium.webdriver.support import expected_conditions as EC5 from selenium.webdriver.common.by import By67 driver = webdriver.Chrome("F:\安装工具\python\chromedriver.exe")8 driver.implicitly_wait(10)9 driver.get('http://www.cnblogs.com/imyalost/')10 locator = (By.LINK_TEXT, '老_张')1112 try:13 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))14 print(driver.find_element_by_link_text('老_张').get_attribute('href'))15 finally:16 driver.close()
代码解析:
本例中,通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在;
上面的例子中,同时使用了隐性等待和显性等待,但是需要注意的是:等待的最长时间取两者之中的最大值;
expected_conditions类提供的预期条件判断方法如下:
1 title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值2 title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值3 presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该元素一定可见4 visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于05 visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了6 presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是‘column-md-3‘,那么只要有1个元素存在,这个方法就返回True7 text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串8 text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串9 frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False10 invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见11 element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable12 staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False13 element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表14 element_selection_state_to_be : 判断某个元素的选中状态是否符合预期15 element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator16 alert_is_present : 判断页面上是否存在alert
二、隐式等待
定义:通过设定的时长等待页面元素加载完成,再执行下面的代码,如果超过设定时间还未加载完成,则继续执行下面的代码(注意:在设定时间内加载完成则立即执行下面的代码);
隐式等待的方法为:implicitly_wait,示例代码如下:
1 # coding = utf-82 from selenium import webdriver34 driver = webdriver.Chrome("F:\安装工具\python\chromedriver.exe")5 driver.implicitly_wait(10) # 隐性等待,最长等10秒6 driver.get('http://www.cnblogs.com/imyalost/')78 print(driver.current_url)9 driver.quit()
代码解析:
本例中,设置的等待时长为10秒,但这10秒并非一个固定时间,并不影响脚本执行速度;其次,隐式等待对整个driver的周期都起作用,因此只需要设置一次即可。
三、强制等待
即sleep()方法,由python中的time模块提供,强制让代码等待xxx时间,无论前面的代码是否执行完成或者还未完成,都必须等待设定的时间。
示例代码如下:
1 # coding = utf-82 from selenium import webdriver3 from time import sleep45 driver = webdriver.Chrome("F:\安装工具\python\chromedriver.exe")6 driver.get('http://www.cnblogs.com/imyalost/')78 sleep(5)910 print(driver.current_url)11 driver.quit()
代码解析:
本例中,设置强制等待时间为5秒,5秒之后,打印获取到的当前页面的url,然后关闭窗口。这种强制等待的方法,在debug时候很有用,不过建议慎用这种方法,因为太死板,严重影响程序执行速度!
以上三种等待方法,在具体的场景中需要根据情况选择合适的方法,灵活运用!
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:
Selenium三种等待方式的使用!
UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1、有frame;2、没有设置等待。 因为代码运行速度和浏览器…...
websockets怎么工作的呢?
WebSockets是一种在单个TCP连接上进行全双工通信的协议,使得客户端和服务器之间的数据交换变得更加简单,并允许服务端主动向客户端推送数据。下面是WebSockets的工作原理: 1. **握手阶段**: - 客户端发起一个HTTP请求到服务器&…...
栈 数组和链表实现
stack 栈 LIFO后进先出 应用 实现递归 编辑器的撤回工作(按下ctrl z) 数组实现 // 列表的插入和删除从一端实现 那么就得到了栈 // array和linked lists//stack-Array based implementation #include<stdio.h> #include<stdlib.h> #def…...
如何备份和恢复华为手机?
智能手机已成为我们日常生活中不可或缺的一部分,它们存储着大量敏感数据。因此,确保数据安全,定期备份至关重要,以防手机意外丢失、损坏或被盗。 如果您拥有华为设备,并且正在寻找如何将华为手机备份到PC的方法&#…...
微波电路S参数测量实验方案
一、实验目的 用矢量分析仪测S参数,验证电磁波,检测电磁波在波导中的传播模式。 二、实验内容 用矢量分析仪测试微波滤波器的二端口S参数, 三、基本 四、实验步骤 1对矢量网络分析仪进行参数设置 2矢量网络分析仪进行校准 单端口校准…...
SpringTask Cron表达式
Cron表达式格式 1.Cron表达式格式 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 秒 分 时 一个月第几天 月 一个星期第几天 年 &…...
docker与docker-compose安装
1.1 安装工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm21.2 添加docker的yum库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast1.3 安装Docker sudo yum install docke…...
跨境反向海淘系统:业务流程解析与未来发展展望
随着全球化的深入发展和互联网技术的飞速进步,跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中,反向海淘系统以其独特的优势,逐渐崭露头角,成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…...
Python语言字母:深度解析与魅力探索
Python语言字母:深度解析与魅力探索 Python,作为一种广泛使用的编程语言,其字母背后蕴含着丰富的内涵和深厚的魅力。本文将从四个方面、五个方面、六个方面和七个方面,深入剖析Python语言字母所蕴含的秘密和魅力,带您…...
基于JSP技术的社区疫情防控管理信息系统
你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:JSP 数据库:MySQL 技术:JSPJavaBeans 工具:MyEclipse、Tomcat、Navicat 系统展示 首页 用户注册与登录界…...
区间预测 | Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测
Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测 目录 Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序…...
Spring MVC中,一个HTTP请求可能会被多个Handler处理
在Spring MVC中,一个HTTP请求可能会被多个Handler处理。这些Handler可能是HandlerInterceptor,ControllerAdvice,或者是具体的Controller。以下是这些Handler的执行顺序: 1. HandlerInterceptor的preHandle方法 当一个HTTP请求到…...
Vue3 时间格式化
1、基础使用 https://juejin.cn/post/6933548549321785352 2、template里面直接使用 $dayjs(info.patientBirthday).format("YYYY-MM-DD") 3、script里面使用 import { ref, reactive, getCurrentInstance } from "vue"; const { proxy } getCurren…...
SVN中trunk,branch,tag
SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤_svn 分支-CSDN博客 场景: 项目的1.0版本已经完成开发,测试,并上线了. 接到了新需求,要修改多个文件的代码. 你写了一段时间的时候,用户或测试人员反馈, 1.0版本有重大bug要修复,修复好后立刻上线. 此时应该怎么…...
React ahooks库和React Query库使用场景分析
文章目录 前言一、在一个前台项目中,如区块链项目,需大量轮询接口,这时候哪个好二、ahooks一般可以用在什么项目上三、推荐react-query一些常用的hook四、推荐ahooks一些常用的hook总结 前言 ahooks和react-query都是好用的react库ÿ…...
国产AI大模型哪家强?从投资者角度简单横评5款大模型!
前言01 国产AI大模型哪家强? 我平时主要使用“腾讯元宝、Kimi”这2款AI大模型,对于其他国产知名AI大模型的表现,我同样充满好奇。 本次从个人投资者的角度,结合非控股子公司的问题,来测试各AI大模型的实力。本次测试…...
uc/OS-III多任务程序
目录 一、基于STM32CubeMX建立工程二、获取uC/OS-III源码三、代码移植1.复制uC/OS-III文件到工程文件夹2.工程组件和头文件路径的添加打开工程,添加一下六个组添加文件到分组添加头文件路径 3.文件内容的修改启动文件app_cfg.hincludes.hbsp.c和bsp.hlib_cfg.happ.c…...
6月13日在线研讨会 | 多产品多流程多团队的ALM选择方案
随着汽车产业步入“软件定义汽车”时代,传统汽车产业的硬件中心模式逐渐被软件与服务的核心地位所取代,这是一场对汽车设计、制造及运营的全方位重塑。在这一转型过程中,如何高效管理汽车的整个生命周期成为了一项全新挑战。在此背景下&#…...
Maven使用${revision}实现多模块版本统一管理及注意事项
在 Maven 中,确实可以利用 ${revision} 来实现多模块项目的版本统一管理,尤其是在使用一些高级特性如 Maven Release Plugin 或者是在 CI/CD 流程中动态设置版本时。${revision} 是一个特殊的变量,它允许你在构建时动态地使用或设定项目的版本…...
vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)
我的vue2项目出现了一个超级恶心的bug 过程: 1 操作流程:页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果:返回页面后页面没有刷新导致用户名还显示着,页面没有发生任何变化&a…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
