当前位置: 首页 > news >正文

如何在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. 处理隐藏元素的策略

在自动化测试中,隐藏元素可能会干扰定位器的正确性。以下是一些处理隐藏元素的策略:

  1. 检查元素属性:检查元素的aria-hidden属性、display属性等,判断其是否隐藏。
  2. 创建基于可见性的定位器:利用唯一属性来选择可见元素。
<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自动化测试中创建稳定的定位器&#xff1f; 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…...

【5G】5G技术组件 5G Technology Components

5G的目标设置非常高&#xff0c;不仅在数据速率上要求达到20Gbps&#xff0c;在容量提升上要达到1000倍&#xff0c;还要为诸如大规模物联网&#xff08;IoT&#xff0c; Internet of Things&#xff09;和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...

四十一:Web传递消息时的编码格式

在现代Web应用中&#xff0c;数据在客户端和服务器之间的传递往往需要经过特定的编码方式。不同类型的数据&#xff08;如文本、图像、文件等&#xff09;需要用不同的编码格式进行表示&#xff0c;以确保信息的准确性与安全性。本文将介绍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 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计&#xff0c;结合分布式存储和计算分离的技术优势&#xff0c;为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…...

BEPUphysicsint定点数3D物理引擎使用

原文&#xff1a;BEPUphysicsint定点数3D物理引擎使用 - 哔哩哔哩 上一节給大家介绍了BEPUphysicsint的一些基本的情况&#xff0c;这节课我们来介绍它的基本使用,本节主要从以下5个方面来介绍: (1) 创建一个物理世界Space&#xff0c;并开启模拟迭代; (2) 添加一个物理物体…...

Splatter Image运行笔记

文章标题&#xff1a;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开发板版本过程详细步骤步骤

一、环境说明 开发板&#xff1a;合宙ESP32-C3 工作机器CPU&#xff1a;AMD64 操作系统&#xff1a;Windows10 2004&#xff08;19041.508&#xff09; 使用WSL2安装Linux系统 Linux&#xff1a;Ubuntu 24.04.1 LTS python&#xff1a;python 3.12.3&#xff08;Windows和…...

【开源免费】基于SpringBoot+Vue.JS大创管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 081 &#xff0c;文末自助获取源码 \color{red}{T081&#xff0c;文末自助获取源码} T081&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

mysql 和 tidb的区别

MySQL 和 TiDB 是两种常见的关系型数据库管理系统&#xff0c;但它们的设计理念和适用场景有显著区别。以下从架构、性能、扩展性、适用场景等方面进行对比&#xff1a; 架构设计 MySQL 单机架构为主&#xff0c;可通过主从复制实现读写分离或高可用。分布式支持依赖外部组件&…...

传输层5——TCP可靠传输的实现(重点!!)

TCP协议如何实现可靠传输&#xff1f;确保接收方收到数据&#xff1f; 需要依靠几个结构&#xff1a; 以字节为单位的滑动窗口 这其中包括发送方的发送窗口和接收方的接收窗口 下面的描述&#xff0c;我们指定A为发送端口&#xff0c;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. 抓取分页链接参考资料 在日常学习和工作中&#xff0c;我们…...

Centos7和9安装mysql5.7和mysql8.0详细教程(超详细)

目录 一、简介 1.1 什么是数据库 1.2 什么是数据库管理系统&#xff08;DBMS&#xff09; 1.3 数据库的作用 二、安装MySQL 1.1 国内yum源安装MySQL5.7&#xff08;centos7&#xff09; &#xff08;1&#xff09;安装4个软件包 &#xff08;2&#xff09;找到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岗位招聘数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…...

java中23种设计模式的优缺点

文兴一言 设计模式分为创建型模式、结构型模式和行为型模式。以下是每种设计模式及其优缺点的详细介绍&#xff1a; 一、创建型模式 简单工厂模式 优点&#xff1a;通过一个共同的工厂类来创建对象&#xff0c;将对象的创建逻辑封装在一个地方&#xff0c;客户端只需要与工厂…...

【JavaEE】多线程(7)

一、JUC的常见类 JUC→java.util.concurrent&#xff0c;放了和多线程相关的组件 1.1 Callable 接口 看以下从计算从1加到1000的代码&#xff1a; public class Demo {public static int sum;public static void main(String[] args) throws InterruptedException {Thread …...

如何高效的向AI大模型提问? - 提示工程Prompt Engineering

大模型的输入&#xff0c;决定了大模型的输出&#xff0c;所以一个符合要求的提问Prompt起到关键作用。 以下是关于提示工程Prompt Engineering主要方法的详细表格&#xff0c;包括每种方法的优点、缺点、应用场景以及具体示例&#xff1a; 主要方法优点缺点应用场景示例明确性…...

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片&#xff0c;分为通用、动漫、人物三大类&#xff0c;可以按屏幕比例和分辨率检索&#xff0c;满足你对壁纸的各种…...

EasyExcel注解使用

上接《Springboot下导入导出excel》&#xff0c;本篇详细介绍 EasyExcel 注解使用。 1. ExcelProperty value&#xff1a;指定写入的列头&#xff0c;如果不指定则使用成员变量的名字作为列头&#xff1b;如果要设置复杂的头&#xff0c;可以为value指定多个值order&#xff…...

Visual Basic 6 关于应用的类库 - 开源研究系列文章

上次整理VB6的原来写的代码&#xff0c;然后遇到了关于应用窗体的显示问题。VB6不比C#&#xff0c;能够直接反射调用里面的方法&#xff0c;判断是否显示关于窗体然后显示。以前写过一个VB6插件的例子&#xff0c;不过那个源码不在&#xff0c;所以就找了度娘&#xff0c;能够象…...

C#泛型

泛型是一种非常强大的特性&#xff0c;它允许程序员编写灵活的代码&#xff0c;同时保持类型安全。泛型的核心思想是允许类或方法在定义时不指定具体的数据类型&#xff0c;而是在实际使用时指定。这意味着你可以创建一个可以与任何数据类型一起工作的类或方法 泛型类通过在类…...

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print&#xff1a; println&#xff1a; printf&#xff1a; 总结&#xff1a; 代码展示&#xff1a; 二、格式化占位符 %s&#xff1a;用于格式化字符串。 %d&#xff1a;用于格式化整数。 %f&#xff1a;用于格式化浮点数。 %v&#xff1…...

React Native的router解析

写在前面 React Native&#xff08;简称RN&#xff09;是一个由Facebook开发的开源框架&#xff0c;用于构建跨平台的移动应用程序。在RN中&#xff0c;路由&#xff08;router&#xff09;是非常重要的概念&#xff0c;它允许我们在不同的屏幕之间进行导航和切换。 以下是RN…...

Linux update-alternatives 命令详解

1、查看所有候选项 sudo update-alternatives --list &#xff08;java筛选​​​​​​​sudo update-alternatives --list java&#xff09; 2、​​​​​​​更换候选项 sudo update-alternatives --config java 3、自动选择优先级最高的作为默认项 sudo update-alterna…...

【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ libcurl.so.4&#xff1a; sudo apt install curl -y LIBFFI_BASE_7.0: conda install libffi3.3 -y libssl.so.3: sudo apt install -y openssl li…...