📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在测试自动化中,创建稳定的选择器对于确保可靠性非常重要。脆弱的定位器通常会导致频繁的测试失败,并可能带来维护挑战。在本文中,我们将探讨最佳实践,以帮助你避免常见的陷阱并开发有弹性、高效的选择器,从而增强测试的稳定性。
避免在XPath或CSS中使用绝对路径
当添加或删除元素时,页面布局发生变化时,绝对路径很容易中断,从而导致维护时间的浪费。而相对定位器则带来了一些好处:
即使页面结构略有变化,也能保持稳定,因为它们不依赖于元素的精确层次结构。
易于阅读和维护。如果元素在 DOM 中的位置发生变化,则无需更新定位器。
XPath
Avoid: /html/body/div[1]/div[2]/button
Preferred: //button[@data-qa='submit-button']
CSS
Avoid: html>body>div:nth-child(2)>button
Preferred: button[data-qa='submit-button']
避免在定位器中使用索引
使用索引作为定位器可能会使测试不稳定,因为添加或删除元素会改变定位器的准确性,从而导致测试中断。此外,索引使得很难识别所引用的元素。另一方面,没有索引的定位器不太容易因微小的结构变化而中断。此外,即使添加或删除了其他元素,也易于维护。
XPath
Avoid: //div[2]/div[5]
CSS
Avoid: div:nth-child(7)
避免在定位器中使用多个类
由于样式、响应式设计、框架更新和代码重构,CSS 类可能会频繁更改。因此,在定位器中使用多个类会增加维护工作量。此外,定位器中的多个类会使理解更加困难。相反,请使用更具弹性的定位器,专注于唯一属性或单个类(如果一致)。
XPath
Avoid: //div[@class='col-xs-1 col-sm-7 col-md-5 itemx ng-scope input-large']
Preferred: //div[contains(@class, 'input-large')]
CSS
Avoid: div.col-xs-1.col-sm-7.col-md-5.itemx.ng-scope.input-large
Preferred: div[class*="input-large"]
避免在定位器中使用动态和自动生成的 ID
框架会为复杂或基于组件的应用程序的元素生成动态 ID。自动生成的 ID 对测试自动化来说是一个挑战,因为每次加载页面、新会话或组件顺序时,它们的值都可能发生变化。如果可能,一种解决方案是使用专为测试设计的自定义属性。或者使用有意义且独特的属性。
XPath
Avoid: //button[@class='btn-primary-1850']
Preferred: //button[@data-qa='submit-button']
CSS
Avoid: button.btn-primary-1850
Preferred: button[data-qa="submit-button"]
这些随机数在表示系统内有意义的值(例如 ID 或唯一标识符)时非常有用。通过预加载测试数据策略,这些数字可用于创建稳定的定位器。
确保定位器是唯一的
非唯一定位器是指与页面上的多个元素匹配的定位器。这可能会导致测试失败,因为自动化脚本可能会选择错误的元素(例如单击错误的按钮),或者与不打算交互的隐藏或禁用元素进行交互。
确保每个定位器都唯一地标识元素。以下是解决常见问题的一些策略:
使用父子关系来定义元素之间的相互关系。通过根据元素的层次结构定位元素来导航 DOM:
<!-- First form with id "login-form" -->
<form id="login-form">
<input type="email" id="email" />
<input type="password" id="password" />
<button id="submit-button">Log In</button>
</form>
<!-- Second form with id "signup-form" -->
<form id="signup-form">
<input type="email" id="email" />
<input type="password" id="password" />
<button id="submit-button">Sign Up</button>
</form>
//form[@id='login-form']//input[@id='email']
处理隐藏元素的策略:
检查两个元素:打开页面检查器并检查可见和隐藏元素的 HTML 结构。
比较属性:寻找属性、可见性指标(例如 aria-hidden 或 display)的差异。
使用可见性属性创建定位器:使用唯一属性来选择可见元素。
<button class="submit-button hidden" data-qa="submit-button">Submit</button>
<button class="submit-button" data-qa="submit-button">Submit</button>
CSS: button.submit-button:not(.hidden)
如果有多个父节点需要评估属性唯一性,可以使用开发人员工具中的“复制 OuterHTML”选项。然后,将 HTML 代码粘贴到diffchecker.com等差异工具中,以快速比较并识别它们之间的差异。
另一种解决方案是将所有元素(可见和隐藏)存储在 Web 元素集合中,然后以编程方式过滤可见元素。
谨慎使用基于文本的定位器
应谨慎使用基于文本的定位器(例如依赖于元素内可见文本的定位器,例如button[text()=‘Submit’]),因为页面上的文本内容可能会频繁更改。文本可能发生变化的一些原因如下:
本地化:网站提供多种语言的内容。
内容更新:网站定期更新其内容,包括标签、描述和其他元素,以反映新信息或设计变化。
个性化内容:一些网站根据用户偏好(客户)个性化内容和文本。
基于文本的定位器采用预加载测试数据策略非常有效,因为需要提前知道预期的文本,才能创建可靠的定位器。
使用人工智能创建定位器
我们还可以使用 AI 创建稳定的定位器,类似于 Mark Winteringham 在 @test-automation-experience YouTube 频道的 60 秒会议期间演示的方法。接下来是提示:
你是一位专业的自动化 Java 开发人员。获取由三个哈希分隔的 HTML,并将其转换为 Java Selenium 页面对象。在输出类之前,请检查所有 CSS 选择器是否正确。
(此处为 HTML)
—马克·温特林汉姆
结论
总之,创建稳定且唯一的定位器就像在城市中导航,有多个路线通往同一目的地。通过使用精确、独特且可感知上下文的定位器,可以确保测试具有清晰、可靠的路径,就像跟随标记清晰的路标一样,可以毫无困惑地到达目的地。
另外网友补充:
使用语义定位器,比如 {button ‘OK’}(可参考https://github.com/google/semantic-locators了解相关内容)或者类似的概念。它们易于编写和维护,还有一个 Chrome 扩展程序可以用来查看特定元素的相关情况。
Playwright 和其他工具中也有类似的功能 —— 利用元素角色和文本:
await page.getByRole (‘link’, { name: ‘Get started’})
这些方式没那么晦涩难懂,对专业熟练度的要求也没那么高,而且即便页面重写,它们通常也不会改变。
祝使用愉快!
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】