如何在UI自动化测试中创建稳定的定位器?
如何在UI自动化测试中创建稳定的定位器?
- 前言
- 1. 避免使用绝对路径
- 2. 避免在定位器中使用索引
- 3. 避免多个类名的定位器
- 4. 避免动态和自动生成的ID
- 5. 确保定位器唯一
- 6. 处理隐藏元素的策略
- 7. 谨慎使用基于文本的定位器
- 8. 使用AI创建稳定的定位器
- 总结
前言
- 在自动化测试中,创建稳定的定位器至关重要。脆弱的定位器经常导致测试失败,增加了维护难度,并可能引起不必要的错误;
- 为了确保自动化测试的稳定性和可维护性,测试人员需要避免一些常见的陷阱,并根据最佳实践设计更为可靠的定位器;
- 本文将探索如何通过一些策略,帮助你避免这些问题,并选择高效、稳定的定位器,从而提升测试的稳定性。
1. 避免使用绝对路径
在XPath或CSS选择器中,使用绝对路径定位元素是很常见的做法,然而,这种方法的稳定性较差。当页面布局发生变化时,绝对路径会频繁失效。这是因为它们依赖于元素的精确层级关系,一旦元素的层级发生调整,定位器就会失效。相反,使用相对路径能带来更多的好处:
- 保持稳定性:即使页面结构略有变化,相对定位器仍然有效,因为它们不依赖于元素的精确层级。
- 易于阅读和维护:如果页面上的元素发生位置变化,相对定位器不会受到影响。
示例:
不推荐的定位器:
XPath:/html/body/div[1]/div[2]/button
CSS:html > body > div:nth-child(2) > button
推荐的定位器:
XPath://button[@data-qa='submit-button']
CSS:button[data-qa='submit-button']
2. 避免在定位器中使用索引
在XPath或CSS选择器中使用索引进行定位,容易导致测试的不稳定性。因为当页面上的元素被添加或删除时,索引位置会发生变化,导致定位器失效。此外,使用索引的定位器难以理解和调试,特别是在页面元素较多的情况下。
示例:
不推荐的定位器:
XPath://div[2]/div[5]
CSS:div:nth-child(7)
推荐的定位器:
XPath://div[contains(@class, 'input-large')]
CSS:div[class*="input-large"]
3. 避免多个类名的定位器
CSS类名经常变化,尤其是在响应式设计、框架更新和代码重构过程中。因此,依赖多个类名作为定位器的元素会增加维护难度。为了减少这种风险,可以优先选择使用单一、稳定的类名,或者更可靠的属性进行定位。
示例:
不推荐的定位器:
XPath://div[@class='col-xs-1 col-sm-7 col-md-5 itemx ng-scope input-large']
CSS:div.col-xs-1.col-sm-7.col-md-5.itemx.ng-scope.input-large
推荐的定位器:
XPath://div[contains(@class, 'input-large')]
CSS:div[class*="input-large"]
4. 避免动态和自动生成的ID
对于复杂或基于组件的应用程序,框架会为元素生成动态 ID。这些ID在每次页面加载、会话或组件顺序发生变化时都会改变,这使得自动化测试中很难通过ID来准确定位元素。如果可能的话,最好使用专门为测试设计的自定义属性,或者选择有意义且唯一的属性进行定位。
示例:
不推荐的定位器:
XPath://button[@class='btn-primary-1850']
CSS:button.btn-primary-1850
推荐的定位器:
XPath://button[@data-qa='submit-button']
CSS:button[data-qa="submit-button"]
5. 确保定位器唯一
非唯一的定位器会匹配页面上的多个元素,这可能导致测试失败。因为自动化脚本可能会选中错误的元素,或者与隐藏的或禁用的元素交互。确保每个定位器唯一,能精确地标识页面上的一个元素。
解决策略:
- 使用父子关系定位:通过元素之间的层级关系来定义元素。例如,在两个表单中,你可以通过表单ID来定位特定的输入框。
<!-- 第一个表单 -->
<form id="login-form"><input type="email" id="email" /><input type="password" id="password" /><button id="submit-button">登录</button>
</form><!-- 第二个表单 -->
<form id="signup-form"><input type="email" id="email" /><input type="password" id="password" /><button id="submit-button">注册</button>
</form>
通过定位父级元素,如//form[@id='login-form']//input[@id='email'],可以确保定位的是正确的元素。
6. 处理隐藏元素的策略
在自动化测试中,隐藏元素可能会干扰定位器的正确性。以下是一些处理隐藏元素的策略:
- 检查元素属性:检查元素的
aria-hidden属性、display属性等,判断其是否隐藏。 - 创建基于可见性的定位器:利用唯一属性来选择可见元素。
<button class="submit-button hidden" data-qa="submit-button">提交</button>
<button class="submit-button" data-qa="submit-button">提交</button>
CSS选择器:
button.submit-button:not(.hidden)
这种方式可以确保只选择可见的按钮。
7. 谨慎使用基于文本的定位器
基于文本的定位器,如button[text()='提交'],可以在页面文本内容发生变化时变得不稳定。原因可能有很多,包括内容更新、页面本地化、多语言支持等。因此,文本内容的定位器应该谨慎使用。
解决方案:
可以考虑使用预加载的测试数据策略,提前知道页面上将出现哪些文本内容,从而创建可靠的定位器。
8. 使用AI创建稳定的定位器
AI技术已经被引入到自动化测试中,用来生成更加稳定和可靠的定位器。通过训练模型来自动识别页面元素和生成有效的定位器,AI能够帮助我们避免手动选择错误的元素,并提高定位器的稳定性。
示例:

总结
在自动化测试中,创建稳定、唯一且可靠的定位器就像在复杂的城市中寻找最合适的路线。通过准确使用定位器,我们能够确保测试脚本能够稳定运行,让测试脚本将变得更加可靠、易于维护,并且能够适应页面的变化。
相关文章:
如何在UI自动化测试中创建稳定的定位器?
如何在UI自动化测试中创建稳定的定位器? 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…...
【5G】5G技术组件 5G Technology Components
5G的目标设置非常高,不仅在数据速率上要求达到20Gbps,在容量提升上要达到1000倍,还要为诸如大规模物联网(IoT, Internet of Things)和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...
四十一:Web传递消息时的编码格式
在现代Web应用中,数据在客户端和服务器之间的传递往往需要经过特定的编码方式。不同类型的数据(如文本、图像、文件等)需要用不同的编码格式进行表示,以确保信息的准确性与安全性。本文将介绍Web传递消息时常用的几种编码格式&…...
【细如狗】记录一次使用MySQL的Binlog进行数据回滚的完整流程
文章目录 1 事情起因2 解决思路3 利用binlog进行数据回滚 3.1 确认是否启用Binlog日志3.2 确认是否有binlog文件3.3 找到误操作的时间范围3.4 登录MySQL服务器查找binlog文件 3.4.1 查询binlog文件路径3.4.2 找到binlog文件3.4.3 确认误操作被存储在哪一份binlog文件中 3.5 查…...
什么是云原生数据库 PolarDB?
云原生数据库 PolarDB 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计,结合分布式存储和计算分离的技术优势,为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...
Kafka Stream实战教程
Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出,可以让开发者轻松地对实时数据进行处理,比如计数、聚合、…...
BEPUphysicsint定点数3D物理引擎使用
原文:BEPUphysicsint定点数3D物理引擎使用 - 哔哩哔哩 上一节給大家介绍了BEPUphysicsint的一些基本的情况,这节课我们来介绍它的基本使用,本节主要从以下5个方面来介绍: (1) 创建一个物理世界Space,并开启模拟迭代; (2) 添加一个物理物体…...
Splatter Image运行笔记
文章标题:Splatter Image: Ultra-Fast Single-View 3D Reconstruction 1. 环境配置 下载Splatter Image代码 git clone https://github.com/szymanowiczs/splatter-image.git 创建环境 conda create --name splatter-image python3.8 激活环境 conda activat…...
python爬虫--某房源网站验证码破解
文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…...
Micropython编译ESP32C3开发板版本过程详细步骤步骤
一、环境说明 开发板:合宙ESP32-C3 工作机器CPU:AMD64 操作系统:Windows10 2004(19041.508) 使用WSL2安装Linux系统 Linux:Ubuntu 24.04.1 LTS python:python 3.12.3(Windows和…...
【开源免费】基于SpringBoot+Vue.JS大创管理系统(JAVA毕业设计)
博主说明:本文项目编号 T 081 ,文末自助获取源码 \color{red}{T081,文末自助获取源码} T081,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
mysql 和 tidb的区别
MySQL 和 TiDB 是两种常见的关系型数据库管理系统,但它们的设计理念和适用场景有显著区别。以下从架构、性能、扩展性、适用场景等方面进行对比: 架构设计 MySQL 单机架构为主,可通过主从复制实现读写分离或高可用。分布式支持依赖外部组件&…...
传输层5——TCP可靠传输的实现(重点!!)
TCP协议如何实现可靠传输?确保接收方收到数据? 需要依靠几个结构: 以字节为单位的滑动窗口 这其中包括发送方的发送窗口和接收方的接收窗口 下面的描述,我们指定A为发送端口,B为接收端口 TCP的可靠传输就是靠着滑动窗口…...
基于Python实现web网页内容爬取
文章目录 1. 网页分析2. 获取网页信息2.1 使用默认的urllib.request库2.2 使用requests库1.3 urllib.request 和 requests库区别 2. 更改用户代理3. BeautifulSoup库筛选数据3.1 soup.find()和soup.find_all() 函数 4. 抓取分页链接参考资料 在日常学习和工作中,我们…...
Centos7和9安装mysql5.7和mysql8.0详细教程(超详细)
目录 一、简介 1.1 什么是数据库 1.2 什么是数据库管理系统(DBMS) 1.3 数据库的作用 二、安装MySQL 1.1 国内yum源安装MySQL5.7(centos7) (1)安装4个软件包 (2)找到4个软件包…...
星闪WS63E开发板的OpenHarmony环境构建
目录 引言 关于SDK 安装步骤 1. 更新并安装基本依赖 2. 设置 Python 3.8 为默认版本 3. 安装 Python 依赖 4. 安装有冲突的包 5. 设置工作目录 6. 设置环境变量 7. 下载预构建文件以及安装编译工具 8. 编译工程 nearlink_dk_3863 设置编译产品 编译 制品存放路径…...
MongoDB数据建模小案例
MongoDB数据建模小案例 朋友圈评论内容管理 需求 社交类的APP需求,一般都会引入“朋友圈”功能,这个产品特性有一个非常重要的功能就是评论体系。 先整理下需求: 这个APP希望点赞和评论信息都要包含头像信息: 点赞列表,点赞用户的昵称,头像;评论列表,评论用户的昵称…...
MySQL(库的操作)
目录 1. 创建数据库 2. 删除数据库 3. 查看数据库 4. 修改数据库 5. 备份和恢复 6. 查看连接情况 1. 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] 1. 大写的是关键字 2. [ ]可带可不带 3. db_name 数据…...
【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 🏳️🌈 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…...
java中23种设计模式的优缺点
文兴一言 设计模式分为创建型模式、结构型模式和行为型模式。以下是每种设计模式及其优缺点的详细介绍: 一、创建型模式 简单工厂模式 优点:通过一个共同的工厂类来创建对象,将对象的创建逻辑封装在一个地方,客户端只需要与工厂…...
独立开发者利用Taotoken统一API开发跨模型内容生成应用案例
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者利用Taotoken统一API开发跨模型内容生成应用案例 应用场景类,一位独立开发者希望构建一个能同时调用多种大模…...
Superpower ChatGPT:浏览器扩展如何重塑AI对话管理与提示词工作流
1. 项目概述:Superpower ChatGPT,一个浏览器扩展的深度剖析如果你和我一样,每天都要和ChatGPT打上几个小时的交道,那你肯定也经历过这样的抓狂时刻:想找三天前那段关于Python代码优化的对话,却要在历史记录…...
STM32F103C8T6与DHT11单总线通信:从时序解析到数据校验的实战指南
1. 认识STM32F103C8T6与DHT11这对黄金搭档 第一次接触嵌入式开发的朋友可能会觉得,让单片机读取温湿度数据是个复杂的事情。但当你用STM32F103C8T6这颗性价比超高的Cortex-M3内核芯片,搭配DHT11这个经典温湿度传感器时,事情就变得简单多了。…...
初创公司如何利用Taotoken快速构建AI产品原型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司如何利用Taotoken快速构建AI产品原型 对于资源有限的初创团队而言,验证产品想法、快速推出原型是生存和发展的…...
开源工具LMAO:通过浏览器自动化免费调用ChatGPT与Copilot API
1. 项目概述与核心价值如果你和我一样,是个喜欢折腾各种AI工具,但又对官方API的付费门槛、调用限制或者复杂的申请流程感到头疼的开发者,那么今天聊的这个项目,你一定会感兴趣。它叫LLM-API-Open,圈内朋友喜欢叫它LMAO…...
AI技能包实战:用cc-skills打造专业级AI编程助手
1. 项目概述:为你的AI助手装上“专业工具箱”如果你和我一样,每天都在和Claude、Cursor、Copilot这类AI编程助手打交道,那你肯定遇到过这样的场景:想让AI帮你写一篇符合公司技术博客规范的PR稿,或者生成一段精准的Prom…...
告别繁琐操作:一键下载国家中小学智慧教育平台电子课本的智能解决方案
告别繁琐操作:一键下载国家中小学智慧教育平台电子课本的智能解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内…...
解密智能图片分层:掌握Layerdivider提升设计效率的实战指南
解密智能图片分层:掌握Layerdivider提升设计效率的实战指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 在数字创意领域,我们常…...
别再复制粘贴了!手把手教你用MATLAB/Simulink把低通滤波器写成C代码(附避坑指南)
从MATLAB到嵌入式C:低通滤波器工程化实现全指南 在嵌入式系统开发中,数字滤波器的实现往往成为算法落地的关键瓶颈。许多工程师能够熟练使用MATLAB设计出完美的滤波器模型,却在将其转化为实际可用的C代码时频频碰壁——仿真曲线平滑优美&…...
LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧
LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer…...
