UI自动化测试 —— web端元素获取元素等待实践!

前言

Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。

目的:

  1. 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下都能正常工作。

  2. 验证应用程序的功能是否符合需求规格说明书。

  3. 提高测试效率,减少重复劳动。

  4. 提前发现潜在的缺陷,降低修复成本。

这里分享web端元素获取&元素等待

图片

01、元素获取

为什么要学习获取元素信息的方法

主要为了获取相关的信息进行断言,判断自动化用例最终的执行结果。

获取元素常用的方法:

  • size 获取元素的大小 返回的是一个字典,里面包含 元素高度和宽度的值

  • text 获取元素的文本内容

  • get_attribute("attribute") 获取元素对应属性名称的属性值 , attribute表示的是属性名

  • is_displayed() 判断元素是否可见 返回值为true或者false

  • is_enabled() 判断元素是否可用,返回值为true或者false

  • is_selected() 判断复选框或者单选框是否被选中,返回值为true或者false

示例代码:

# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome() # 打开百度网站driver.get("https://www.baidu.com") # 最大化浏览器窗口time.sleep(3)driver.maximize_window() # 获取百度输入框的大小size = driver.find_element(By.CLASS_NAME, "s_ipt").sizeprint(size) # 获取超链接"hao123网站"的文本内容text = driver.find_element_by_link_text("hao123").textprint(text) # 获取超链接"hao123网站"的地址address = driver.find_element(By.LINK_TEXT, "hao123").get_attribute("href")print(address) # 判断文库超链接是否可见,默认是Falseresult = driver.find_element(By.XPATH, "//*[@class ='s-bri c-font-normal c-color-t'] ").is_displayed()print("文库超链接可见:", result) # 判端百度一下按钮是否可用,默认是Falseresult = driver.find_element(By.ID, "su").is_enabled()print("'百度一下'按钮可用", result) # 点击页面右上角【登录】按钮,进入登录页面driver.find_element(By.ID, "s-top-loginbtn").click() # 注意需要等待几秒等待元素出现,否则会报错time.sleep(5) # 判断页面中"阅读并接受"前的复选框是否选中result = driver.find_element_by_css_selector(".pass-checkbox-input").is_selected()print("页面中'阅读并接受'前的复选框已选中", result) # 等待3Stime.sleep(3) # 关闭浏览器窗口driver.quit()

图片

02 元素等待

元素等待是指在自动化测试过程中,为了等待某个元素出现或者满足某种条件而暂停脚本执行的一种技术。在定位页面元素时,如果没有找到该元素,会在指定时间内一直等待的过程。以下是常用的三种元素等待类型:

  • 隐式等待:在一段时间内检查网页是否加载完成,如果加载完成,则进行下一步操作;如果在设置的时间内没有加载完成,则会报超时加载。

  • 显式等待:在指定的时间内等待某个特定元素的出现,如果该元素在指定时间内出现,则立即执行相应的操作;如果超过等待时间元素仍未出现,则抛出异常。

  • 强制等待:使用time.sleep()方法,使程序在指定的时间内暂停执行。但如果等待时间设置过短,元素可能还未加载完成,程序会报错;如果等待时间设置过长,会浪费时间,降低代码整体的运行效率。

2.1. 隐式等待

概念:在查找元素时自动等待一定的时间,以确保元素已经加载完成。如果在定位过程中找到了元素,直接返回该元素,继续后面的操作,如果超过了指定时间,就会抛出 NoSuchElementException 异常。

隐式等待实现方式:

driver.implicitlty_wait(timeout) # timeout表示的是最长的等待时间 单位为S

隐式等待的优点是简单易用,只需要设置一次,对所有的元素定位的方法都是有效的,不需要明确指定等待某个特定元素的出现。它适用于大多数情况,但在某些复杂的网页结构或网络延迟较高的情况下,可能需要使用显式等待来更精确地控制等待时间。

代码示例:

# 导包import timefrom selenium import  webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome() # 设置隐式等待时间为5秒driver.implicitly_wait(5) # 打开要百度网站driver.get("https://www.baidu.com") # 点击右上角"设置",点击"搜索设置"driver.find_element(By.ID, 's-usersetting-top').click()driver.find_element_by_link_text("搜索设置").click() # 注意下面这段代码,如果设置等待时间为0就会报错# 判断"全部语言"单选框是否被选中driver.find_element_by_css_selector("[for = 'SL_0']").is_selected() # 等待3Stime.sleep(3) # 退出浏览器驱动driver.quit()

2.2. 显示等待

概念:显示等待是指在执行某个操作之前,等待特定条件的满足。例如定位指定元素时,如果能找到该元素,那么就直接返回该元素,如果找不到,那么每隔指定的时间再去定位该元素,如果超出最长等待时间,那么就抛出TimeOutException。

其工作原理如下:

  1. 设置等待时间和条件:指定一个等待时间和一个条件,在规定时间内,每隔一段固定时间查看下条件是否成立。

  2. 检查条件是否成立:如果条件在等待时间内成立,程序将继续执行;否则,将提示一个超时异常。

显示等待的实现:

导入WebDriverWait等待类

WebDriverWait(driver, timeout, poll_frequency=0.5).until(lambda x:x.find_element(By.ID, "userA"))

  • driver 指的是浏览器驱动对象

  • timeout 表示的是最长等待时间

  • poll_frequency 表示的是检测的间隔时间,默认是0.5

  • until until方法跟上匿名函数来实现元素定位。

代码示例:

# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWait # 实例化浏览器驱动driver = webdriver.Chrome()driver.maximize_window() # 打开测试网站driver.get("https://www.baidu.com") # 点击右上角"设置"driver.find_element(By.ID, 's-usersetting-top').click() # 点击"搜索设置"driver.find_element_by_link_text("搜索设置").click() # 显示等待判断"全部语言"单选框是否被选中# element = driver.find_element(By.CSS_SELECTOR, "[for = 'SL_0']").is_selected() 注意如果用这行代码代替下面一行代码,会报错element = WebDriverWait(driver, 5, 0.5).until(lambda x: x.find_element(By.CSS_SELECTOR, "[for = 'SL_0']"))result = element.is_selected()print("'全部语言'单选框被选中:", result) # 等待3Stime.sleep(3) # 退出浏览器驱动driver.quit()

2.3. 强制等待

强制等待就是让代码休眠,不做任何的操作

time.sleep(time) time单位为S

常用的场景:

在 UI 自动化中,一般在以下情况下可能需要使用强制等待:

  • 网络延迟或加载缓慢:当网络连接较慢或页面加载时间较长时,元素可能需要一些时间才能完全显示或可用。在这种情况下,强制等待可以给系统一些时间来完成加载。

  • 不稳定的环境或外部因素:如果自动化测试在不稳定的环境中运行,例如网络连接不稳定或系统资源有限,强制等待可以提供一定的容错性,以确保操作有足够的时间完成。

  • 已知的固定时间延迟(某些操作可能具有已知的固定时间延迟):

  1. 例如在提交表单后等待服务器响应。在这种情况下,使用强制等待可以模拟这种延迟。

  2. 当要获取元素的文本内容时,而元素的文本内容是需要通过后台接口请求并渲染的,此时,如果使用隐式等待或显示等待是没有办法获取到文本内容,所以需要使用强制等待。

  3. 当要操作的元素已经存在,但是有其他的元素需要等待且与该操作的元素有业务关联,如果使用隐式等待或显示等待对该元素进行操作的话,是没有办法进行的,也需要使用强制等待。

代码示例(此代码仅为演示代码,场景需根据实际场景进行判断):

# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome()driver.maximize_window() # 打开测试网站driver.get("https://www.baidu.com") # 通过name定位到输入框并输入"新闻"time.sleep(2)element = driver.find_element(By.NAME, 'wd')element.send_keys("新闻") # 点击"百度一下"按钮:element = driver.find_element(By.ID, 'su')element.click()time.sleep(3) # 退出浏览器,释放资源driver.quit()

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

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

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

相关文章

java xml 转json json 转 json对象

xml 转json 在Java中将XML转换为JSON是一个常见的需求,尤其是在处理Web服务或数据交换时。有多种库可以帮助你完成这项任务,但其中最流行和广泛使用的一个是org.json(虽然它本身不直接支持XML到JSON的转换,但可以通过解析XML然后…

JavaScript 在 VSCode 中的开发体验

JavaScript 在 VSCode 中的开发体验 JavaScript 是一种广泛使用的编程语言,它让网页变得生动有趣。而 VSCode(Visual Studio Code)则是一款非常流行的代码编辑器,以其强大的功能和灵活性著称。在这篇文章中,我们将探讨在 VSCode 中使用 JavaScript 进行开发的体验,包括其…

Soul Machines——AI生成虚拟主播或虚拟人,模拟真人交互

一、Soul Machines介绍 Soul Machines 致力于开发高度逼真的虚拟人和数字化身,通过结合人工智能、计算机图形学和面部动画技术,打造具有情感交互能力的虚拟角色。这些虚拟角色可以应用于客户服务、教育、健康护理等领域,为用户提供更具人性化…

Redis多线程特性

Redis6.0版本之前是用单线程模型,6.0版本为什么使用多线程? Redis几乎不存在CPU成为性能瓶颈的情况,主要受限于内存和网络IO 内存优化 内存淘汰策略增加内存硬件 网络IO优化 Redis 在处理客户端的请求时,包括获取 (socket 读…

【前缀和算法】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇我们来赏析前缀和算法的进阶题目。 🏠 和可被K整除的子数组 📌 题目解析 和可被k整除的子数组 📌 …

记一次ssh伪终端修改为shell

问题 用户ssh进行连接后,默认为伪终端。 解决办法,可以先拿到终端shell,查看用户是否为/bin/bash: 不是/bin/bash,使用如下命令进行修改: chsh -s /bin/bash rootservice sshd restart

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中,我手动对各个因子进行了回测,但是数据结果并不是十分理想,难道基本面指标真的和股票走势关系不大么? 这里我还是准备再测试一下,策略如下: (1)首先我获取了一下…

codeforces Round 970 (Div. 3)(A-F)

文章目录 [Codeforces Round 970 (Div. 3)](https://codeforces.com/contest/2008)A-[Sakurakos Exam](https://codeforces.com/contest/2008/problem/A)B-[Square or Not](https://codeforces.com/contest/2008/problem/B)C-[Longest Good Array](https://codeforces.com/cont…

Ubuntu上安装配置(jdk/tomcat/ufw防火墙/mysql)+mysql卸载

jdk安装 1.上传jdk压缩包 详情: 下载rz服务(lrzsz):sudo apt install lrzsz(在主用户root就不用sudo)下载压缩包:rz 2.解压jdk压缩包 : 详情: 在压缩包所在位置(解压压缩使用看Li…

测试人如何高效地设计自动化测试框架?

关于测试框架的好处,比如快速回归提高测试效率,提高测试覆盖率等这里就不讨论了。这里主要讨论自动化框架包含哪些内容,以及如何去设计一个测试框架。 什么是自动化测试框架? 它是由一个或多个自动化测试基础模块、自动化测试管…

Qt22双缓冲机制

Qt22双缓冲机制 知识点drawwidgetdrawwidget.hdrawwidget.cpp mainwindowmainwindow.hmainwindow.cpp main.cpp运行图 知识点 双缓冲就是在内存区申请一块缓存;然后显卡直接从这块内存读取数据.。 这样就不用鼠标边画,经过IO来读取这个环节;…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入,并且数据量较大。因为数据不规则,所以只能使用POI进行自定义读取,但是发现数据量大之后,读取数据非常耗时。后面换成EasyExcel,性能起飞。 1. Excel样板 如上图,需要…

【C++】汇编分析,函数是如何调用,传参,返回

传参 有的是用寄存器传参,有的用push传参 我在MSVC编译测出来的是PUSH传参(debug模式),具体过程如下 long func(long a, long b, long c, long d,long e, long f, long g, long h) {long sum;sum (a b c d e f g h);ret…

VMware安装windows虚拟机详细过程

目录 准备工作配置虚拟机为虚拟机设置操作系统镜像安装windows10 准备工作 安装好VMware软件并激活,激活码自行查找 准备好系统镜像文件,可以在MSDN中下载,地址:https://next.itellyou.cn/ 配置虚拟机 选择自定义 默认 选择稍后…

骨灵冷火!Solon Cloud Gateway 照面发布

骨灵冷火,是练药的好火哟。极冷,又极热。在冰冻中被烧死:) 1、认识 Solon Cloud Gateway Solon Cloud Gateway 是基于 Solon Cloud、Vert.X 和 Solon Rx(reactive-streams) 接口实现。小特点: 纯响应式的接口体验流…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…

速盾:便宜的高防 CDN 推荐,高防 CDN 能抵御 DDoS 吗?

在当今网络环境下,DDoS(分布式拒绝服务)攻击已经成为了网站面临的主要威胁之一。为了保护网站的安全稳定运行,许多站长开始寻找高防 CDN(内容分发网络)服务。那么,有没有便宜的高防 CDN 推荐呢&…

13.DataLoader 的使用

DataLoader 的使用 dataset:告诉程序中数据集的位置,数据集中索引,数据集中有多少数据(想象成一叠扑克牌)dataloader:加载器,将数据加载到神经网络中,每次从dataset中取数据&#x…

给自己复盘用的tjxt笔记day12第二部分

面试问题 1.你们的优惠券规则是如何编码实现的? 答:我们的优惠规则是基于策略模式来定义的。在初期做调研的时候也考虑过规则引擎,不过考虑到我们的优惠规则并不复杂,而且规则引擎太重,增加了学习和维护成本&#xf…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度(16位)数据宽度配置中提供可选的ECC支持。这种配置下,外部DRAM DDR设备需要26位,其中16位用于数据,10位用于ECC。每个数据字节使用独立的5位ECC字段,这种模式提供了单错误纠正和双错误检测的…