【问题标题】:How to maintain HTML locators for automation如何维护 HTML 定位器以实现自动化
【发布时间】:2021-05-03 21:10:48
【问题描述】:

ui 自动化失败的主要原因之一是需要不断更新的定位器更改。维护定位器的最佳方法是什么,这样我就不必在每次定位器更改时都更新测试自动化代码。

【问题讨论】:

  • 您的定位器多久更换一次?您的问题并未具体说明问题所在。
  • 这不是关于多久一次的问题,而是当他们这样做时,所有依赖于定位器的团队都需要手动更新。我将我的 Page 对象作为 npm 包/maven 包共享给使用我们的 ui 来创建自动化的其他团队。我的提议将帮助团队继续使用当前版本,而无需更新其版本以仅更改定位器。

标签: selenium selenium-webdriver protractor webdriver ui-automation


【解决方案1】:

最佳实践是使用页面对象模型。这个想法的核心是您网站上的每个页面都由您的测试项目中的一个类表示。该页面的所有定位器都应位于该类中。用户可能在该页面上执行的所有操作都将由该类中的方法表示。因此,当该页面在网站上更新时,您就可以确切地知道去哪里进行更改......相应的类。

如果您的每个测试都包含定位器,则页面重新设计涉及搜索与该页面接触的每个测试并更新定位器。如果您使用页面对象模型并且重新设计了页面,则打开该页面的类,更新定位器就完成了。使用页面对象模型时,方法 #1 可能需要数小时的工作时间......而且您不会错误地错过更新测试。

一些参考
Page object models from selenium.dev
Using Page Objects to Organize Tests from protractortest.org

我还想知道您是否正在创建次优定位器,这导致您必须比您应该更频繁地更新定位器。如果页面的微小更改迫使您更新未直接受更新影响的元素的定位器,那么您可能使用的是从工具复制的 XPath,而不是手工制作的 XPath。这可能会导致大量不必要的定位器更新。如果是这种情况,我会建议大量阅读。阅读大量有关如何创建良好定位器的文章。在大多数情况下避免使用 XPath 定位器。查找具有 ID、名称等的元素并使用它们。学习如何编写 CSS 选择器……网上有很多关于该主题的好文章。 Selenium 贡献者通常避免使用 XPath。它们速度较慢,语法更加复杂和冗长,并且支持不如 CSS 选择器。一般来说,XPaths 应该只在必要时使用……当您必须通过包含的文本定位元素或执行一些复杂的 DOM 遍历时。

如果你能掌握这两件事,你的自动化将会更简洁、更容易阅读、更容易维护......并且需要更少的维护。

【讨论】:

  • 是的,我的意思是在页面对象类中使用定位器文件(根据最初提到的“它可以在需要定位器的任何自动化脚本中使用”)。我必须与其他团队共享我的页面对象。如果我在课堂上有定位器,我需要发布一个新版本,并且下游团队必须就他们方面的更改和更新进行沟通。此解决方案适用于我不必发布并记住更新团队并且还必须为不同环境维护版本的定位器更改。
  • 我想我不明白这种方法。为什么不只拥有一个包含页面对象和测试的项目。您的团队和任何其他编写自动化的团队只会将测试添加到单个项目中。现在,页面对象的更新会自动“交付”给所有团队,并且您的脚本的修复也将修复其他团队的脚本。
  • 如果由于某种原因不允许您在同一个项目中进行不同团队的测试(这对我来说似乎很奇怪并且适得其反,但也许有充分的理由?),您可以创建一个项目那不过是页面对象。您团队的测试项目将引入该项目,然后编写自动化。其他团队将拥有自己的项目,并且也会引入页面对象项目。这样,当需要更新时,您(或其他团队的人)更新页面对象项目,然后每个人都拉入更新,您将所有测试分开。
  • 如果 ui 开发分布在各个团队中,每个团队只知道他们正在开发的功能,并依赖 lti 承包商来传递数据并从另一个团队启动 ui [link](shorturl.at /bozOW),当每个团队都有自己的开发、发布周期和维护自己的环境时,端到端自动化就成了一个挑战。
  • 使用来自其他团队的页面对象会有所帮助,但是当发生持续部署时,每次都需要更新页面对象,并且大多数时间定位器都会发生变化。我说的是使用页面对象,但维护页面对象中使用的定位器作为 UI 资产的一部分,当 UI 更改时会部署这些定位器。可能您没有遇到过这个问题,但是我相信在这种情况下工作过的人会有所帮助。
【解决方案2】:

阅读此What is the Page Object Pattern in Selenium WebDriver?

Page Objects 和 PageFactory 在 Selenuim Wiki 上。

Selenium 官方网站上的页面Object Design Pattern。

还有其他方法,但长期以来,这一种是最常见的。

【讨论】:

    【解决方案3】:

    每个人都提到了页面对象模型,但是如果定位器经常更改,那将无法解决问题。您仍然需要 fo 到每个对象并更新定位器

    我会在应用程序方面寻找解决方案。例如,要求开发人员添加不属于 css 的唯一属性,但可以通过自动化使用。您可以随意调用它们,例如test-id,然后您甚至可以声明自己的locator strategy in protractor,让您的生活更简单

    如果您需要更多信息查找protractor data hooks

    【讨论】:

    • 是的,这也是我提议的。我提到保留一个包含应用程序资产的文件,该文件可能包含自动化所需的任何内容,您是说将这些文件与 html 的一部分保持相同。
    【解决方案4】:
    1. 为每个 ui 创建一个通用的 locator.json 文件,该文件提供在 ui 上执行操作所需的定位器,并且是 ui 资产的一部分,可以通过使用域和路径直接访问文件来加载
    2. 在 ui 应用程序中编写单元/e2e 测试以使用上述定位器,使其在部署更改之前始终有效
    3. 当定位器更改时,只有这些测试需要更新,而您的实际 e2e 验证测试不需要更新。

    通过使用这种方法,团队无需担心定位器更改,并且可以依靠此文件在每个环境中提供更新的定位器。 它可以用于需要定位器的任何自动化脚本中。 跨应用程序 ui 自动化执行变得更加可靠并避免误报。

    示例定位器 json 文件: http://www.myappquality.com/asset/locators.json

    【讨论】:

    • 将定位器添加到不同的文件只会增加框架的复杂性,您可以将其保留在同一页面对象中
    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2021-05-03
    • 2014-02-10
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多