selenium自动化测试入门 —— 设置等待时间

time.sleep(3) 固定等待3秒

driver.implicitly_wait(10) 隐性的等待,对应全局

WebDriverWait( driver, timeout).until(‘有返回值的__call__()方法或函数’) 显性的等待,对应到元素

一、time.sleep(seconds) 固定等待

import time
time.sleep(3) #等待3秒

time.sleep(seconds) seconds参数为整数,单位(秒)。

它是Python的time提供的休眠方法。

常用于短时间的等待,为了自动测试用例的执行效率固定等待的时间需要控制在3秒内。在用例中尽量少用固定等待。

二、智能隐性的等待implicitly_wait(回应超时等待)

driver.implicitly_wait(time_to_wait)

回应超时等待,隐性的,设置后对应的是全局,如查找元素。

driver.implicitly_wait(10)  # 设置全局隐性等待时间,单位秒

每次driver执行 找不到元素都会等待设置的时间,它的值设置的过长对用例执行效率有很大的影响,必须在执行完成之后还原回来。driver.implicitly_wait() 要慎之又慎的使用。

driver对它的默认值为0,driver.implicitly_wait(0)能还原隐性等待的设置时间。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

三、智能显性等待WebDriverWait

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

参数说明:

driver 为webdriver驱动
timeout 最长超时时间,单位(秒)
poll_frequency 循环查找元素每次间隔的时间,默认0.5秒
ignored_exceptions 超时后需要输出的异常信息

WebDriverWait()下面有两个方法可用until()和until_not()

WebDriverWait(driver, timeout).until(method, message='')

method 函数或者实例__call__()方法返回True时停止,否则超时后抛出异常。

参数说明:

method 在等待时间内调用的方法或者函数,该方法或函数需要有返回值,并且只接收一个参数driver。
message 超时时抛出TimeoutException,将message传入异常显示出来

WebDriverWait(driver, timeout).until_not(method, message='')

于上面的until() 相反,until_not 中的method函数或者实例__call__()方法返回False结束,否则抛出异常。

until方法使用的method 的函数或者类__call()__方法详解:

函数我们一般采用匿名函数lambda 。

lambda driver:driver.find_element(<定位元素>) # 当定位的元素时为True,无元素时为False。如示例1、2:

WebDriverWait示例1:

WebDriverWait(driver,5).until(lambda driver:driver.find_element_by_id('query'))

5秒内等待元素(id='query')出现,lambda driver:driver.find_element_by_id('query') 为一个匿名函数,只有一个driver参数,返回的是查找的元素对象。

WebDriverWait示例2:

WebDriverWait(driver, 5).until_not(lambda driver:driver.find_element_by_name('query'))

5秒内等待元素消失,同示例1 until_not 要求无元素返回即元素不存在于该页面。

定义类中的__call()__方法。

class wait_element(object):def __init__(self, locator):self.locator = locatordef __call__(self, driver):return driver.find_element(self.locator)WebDriverWait(driver, 5).until(wait_element((By.ID, 'query')))  # 等待元素出现
WebDriverWait(driver, 5).until_not(wait_element((By.ID, 'query')))  # 等待元素消失

wait_element类中__init__()方法接收需要定位的元素,__call__()方法中只能有唯一变量driver,并且返回元素对象。

这样做是是不是很麻烦,其实selenium提供的一个库进行操作,expected_conditions库。引入位置

from selenium.webdriver.support import expected_conditions as ec,它囊括了我们需要使用等待的所有情况。

四、expected_conditions 类库

from selenium.webdriver.support import expected_conditions as ec  # 引入包

下面示例都是以搜狗搜索首页为例。

方法中参数说明 locator=(By.ID, 'id') 表示使用By方法定位元素的元组,element表示获取的webElement元素对象。

ec.title_is(‘title’) 判断页面标题等于title

ec.title_contains(‘title’) 判断页面标题包含title

WebDriverWait(driver, 10).until(ec.title_is('搜狗搜索引擎 - 上网从搜狗开始'))  # 等待title 于参数相等
WebDriverWait(driver, 10).until(ec.title_contains('搜狗搜索引擎'))  # 等待title 包含 参数的内容

ec.presence_of_element_located(locator) 等待locator元素是否出现

ec.presence_of_all_elements_located(locator) 等待所有locator元素是否出现

WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.ID, 'query')))
WebDriverWait(driver, 10).until(ec.presence_of_all_elements_located((By.ID, 'query')))

ec.visibility_of_element_located(locator) 等待locator元素可见

ec.invisibility_of_element_located(locator) 等待locator元素隐藏

ec.visibility_of(element) 等待element元素可见

WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.ID, ''stb'')))  # 等待元素可见
WebDriverWait(driver, 10).until(ec.invisibility_of_element_located((By.ID, ''stb'')))  # 等待元素隐藏
WebDriverWait(driver, 10).until(ec.visibility_of(driver.find_element_by_link_text('高级搜索')))  # 等待元素可见

ec.text_to_be_present_in_element(locator,text) 等待locator的元素中包含text文本

ec.text_to_be_present_in_element_value(locator,value) 等待locator元素的value属性为value

WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element((By.ID, 'erwx'), '搜索APP'))  # 等待元素中包含搜索APP文本
WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element_value((By.ID, 'query'),'selenium'))  # 等待元素的值为 selenium,一般用于输入框

ec.frame_to_be_available_and_switch_to_it(locator) 等待frame可切入

WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it((By.ID, 'frame')))
WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it('frameid'))
ec.alert_is_present() 等待alert弹出窗口出现
WebDriverWait(driver, 10).until(ec.alert_is_present())

ec.element_to_be_clickable(locator) 等待locator元素可点击

WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.ID, 'kw')))

等待元素被选中,一般用于复选框,单选框

ec.element_to_be_selected(element) 等待element元素是被选中

ec.element_located_to_be_selected(locator) 等待locator元素是被选中ec.element_selection_state_to_be(element, is_selected) 等待element元素的值被选中为is_selected(布尔值)

ec.element_located_selection_state_to_be(locator,is_selected) 等待locator元素的值是否被选中is_selected(布尔值)

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec  # 引入包
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.maximize_window() 
driver.get(r'https://www.baidu.com/') 
driver.find_element_by_link_text('设置').click()
WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.LINK_TEXT, '搜索设置')))  # 等待搜索可点击,不可缺少
driver.find_element_by_link_text('搜索设置').click()
element = driver.find_element_by_id('s1_1')
WebDriverWait(driver, 2).until(ec.element_to_be_selected(element))  # element被选中
WebDriverWait(driver, 10).until(ec.element_located_to_be_selected((By.ID, 'SL_0'))) # id=’SL_0’ 被选中
WebDriverWait(driver, 10).until(ec.element_selection_state_to_be(element,True )) # element 被选中
WebDriverWait(driver, 10).until(ec.element_located_selection_state_to_be((By.ID, 'SL_1'), False)) #  id=’SL_1’不被选中
time.sleep(3)
driver.quit()

五、什么时候使用等待

固定等待sleep与隐性等待implicitly_wait尽量少用,它会对测试用例的执行效率有影响。

显性的等待WebDriverWait可以灵活运用,什么时候需要用到?

1、页面加载的时候,确认页面元素是否加载成功可以使用WebDriverWait

2、页面跳转的时候,等待跳转页面的元素出现,需要选一个在跳转前的页面不存在的元素

3、下拉菜单的时候,如上百度搜索设置的下拉菜单,需要加上个时间断的等待元素可点击

4、页面刷新的时候

总之,页面存在改变的时候;页面上本来没的元素,然后再出现的元素

END今天的分享就到此结束了,点赞关注不迷路

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

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

相关文章

axios 全局错误处理和请求取消

这两个功能都是用拦截器实现。 前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 全局错误处理 在构造函数中&#xff0c;添加一个响应拦截器即可。在构造函数中注册拦截器的好处是&#xff0c;无论怎么实例化封装类&#xff0c…

基础课19——客服系统知识库的搭建流程

1.收集整理业务数据 注意&#xff1a;我们在做业务数据收集时&#xff0c;往往是甲方提供给我们的&#xff0c;这时就需要确定一个标准&#xff0c;否则对知识库梳理工作会带来很大的难度&#xff0c;建议和甲方沟通确认一个双方都统一的知识库原材料。 2.创建知识库 在创建知…

Docker基础(简单易懂)

目录 一、docker是什么 核心概念 二、docker安装 1、卸载docker 2、使用yum 安装 三、docker常用命令 1、帮助命令 2、镜像命令 1&#xff09;查看镜像 2&#xff09;查询镜像 3&#xff09;拉取镜像 4&#xff09;删除镜像 3、容器命令 四、容器数据卷 五、Dock…

深度学习之基于Tensorflow人脸面部表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的人脸面部表情识别系统是一种基于深度学习技术的图像处理应用&#xff0c;该系统主要通过人脸图像数…

CoCa论文笔记

摘要 计算机视觉任务中&#xff0c;探索大规模预训练基础模型具有重要意义&#xff0c;因为这些模型可以可以极快地迁移到下游任务中。本文提出的CoCa&#xff08;Contrastive Captioner&#xff09;&#xff0c;一个极简设计&#xff0c;结合对比损失和captioning损失预训练一…

Zabbix如何监控腾讯云NAT网关

1、NAT网关介绍 NAT 网关&#xff08;NAT Gateway&#xff09;是一种支持 IP 地址转换服务&#xff0c;提供网络地址转换能力&#xff0c;主要包括SNAT&#xff08;Source Network Address Translation&#xff0c;源网络地址转换&#xff09;和DNAT&#xff08;Destination N…

如何使用Python和Matplotlib创建双Y轴动态风格折线图 | 数据可视化教程

前言 我的科研论文中需要绘制一个精美的折线图&#xff0c;我的折线图中有三条曲线&#xff0c;分别表示期望角速度指令信号&#xff0c;和实际的角速度信号&#xff0c;还有实际的航向角信号&#xff0c;现在我已经拥有了数据&#xff0c;使用Python中matplotlib.plt.plot来直…

Java线程的基本概念和五种状态

1. 线程 1.1 创建线程 创建线程通常有以下三种方式&#xff1a; 实现 Runnable 接口&#xff0c;并重写其 run 方法&#xff1a; public class J1_Method01 {public static void main(String[] args) {System.out.println("Main线程的ID为&#xff1a;" Thread.curr…

公安涉密视频会议建设方案

公安涉密视频会议建设方案的制定需要考虑多方面因素。其一般是在复杂涉密网络环境中部署&#xff0c;怎样的内部保密部署方可保障涉密会议最大程度的加密进行呢&#xff1f;以下是从不同维度建设方案&#xff0c;可以根据实际应用场景进行相应的修改以及配置与之匹配的视频会议…

〔001〕虚幻 UE5 发送 get、post 请求、读取 json 文件

✨ 目录 🎈 安装 varest 扩展🎈 开启 varest 扩展🎈 发送 get 请求🎈 发送 post 请求🎈 读取 json 文件🎈 安装 varest 扩展 打开 虚幻商城,搜索 varest 关键字进行检索, varest 是一个 api 调用插件,支持 http/https 请求,也支持 json 文件的读取,最关键是该…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

动态路由协议OSPF优化提速特性

1.OSPF协议通信过程与部署&#xff1b; 2.OSPF协议在项目上的应用场景&#xff1b; 3.OSPF有哪些优化特性&#xff1f; - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由协议 - 理解魏 运行在路由器的一个软件 - 目的&#xff1a;为了帮助路由器和路由器彼…

Spring Boot 常见面试题

目录 1.Spring Boot 快速入门什么是 Spring Boot&#xff1f;有什么优点&#xff1f;Spring Boot 与 Spring MVC 有什么区别&#xff1f;Spring 与 Spring Boot 有什么关系&#xff1f;✨什么是 Spring Boot Starters?Spring Boot 支持哪些内嵌 Servlet 容器&#xff1f;如何设…

【LeetCode刷题-队列】--933.最近的请求次数

933.最近的请求次数 class RecentCounter {Queue<Integer> queue new LinkedList<>();public RecentCounter() {}public int ping(int t) {queue.offer(t);while(t - queue.peek() > 3000){queue.poll();}return queue.size();} }/*** Your RecentCounter obje…

游戏在小米设备上因自适应刷新率功能,帧率减半

1&#xff09;游戏在小米设备上因自适应刷新率功能&#xff0c;帧率减半 2&#xff09;Lua在计算时出现非法值&#xff0c;开启Debugger之后不再触发 3&#xff09;如何在Unity中实现液体蔓延的效果 这是第357篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

R语言gplots包的颜色索引表--全平台可用

R语言gplots包的颜色索引表–全平台可用

花了三年时间开发的开源项目,终于500 个 Star 了!快收藏

waynboot-mall 商城项目从疫情开始初期着手准备&#xff0c;到现在已经经过了 3 年多的时间&#xff0c;从项目初期到现在&#xff0c;一个人持续迭代&#xff0c;修复漏洞&#xff0c;添加功能&#xff0c;经历了前端开发工具从 vue2、vue-cli 切换到 vue3、vite 的转变&#…

JavaScript 自定义对象

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-定义对象</title> </head><body&g…

leetCode 137. 只出现一次的数字 II + 位运算 + 模3加法器 + 真值表(数字电路) + 有限状态机

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 常规解法&#xff1a;哈希&#xff08;hash&#xff09; …

NSSCTF第十页(2)

[HNCTF 2022 WEEK3]ssssti 题目提示是jinja2模板 怎么感觉之前做过&#xff0c;看到了注入 随便进行一下注入&#xff0c;发现了过滤 大致的黑名单 " _ args -- 无法使用 request.args os -- 无法导入os 不允许post -- 无法使用 request.value 正常用的payloa…