当前位置: 首页 > 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;客户端只需要与工厂…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...