如何避免在自动化 UI 测试中损坏 CSS path/XPath 引用?

How to avoid broken CSS path/XPath references in automated UI tests?

我有一组 TestNG 测试,用于测试基于网络的 UI。

例如,一个典型的测试会点击不同的菜单和按钮,并断言结果是我们所期望的。

这些测试还在后台使用 Selenium。我在一个 class 中进行了测试,在另一个 class 中进行了网页模型。

要在网页中获取对 UI 组件(按钮、菜单等)的引用,我使用 CSS 或 XPath selector。这是在模型 class 中硬编码的。为了获取表示 UI 组件的对象,我在模型 class 中调用了一个 get 方法,其中 returns 一个对象用于 UI 组件,使用 css select或。然后使用该对象,我可以单击 select、deselect 或对该组件执行任何操作。

一切正常,除非 css select 或更改。

有没有办法避免这种情况?

我在想,如果我可以通过每个步骤或单击手动重复测试,并记录所用元素的 css selector,这会比调试测试更快,手动找出 page/javascript 中的新元素名称并更新模型 css selectors.

或者有什么方法可以链接网页开发,自动更新页面变化的模型代码,这样变化就不会破坏测试?

谢谢!

如果您使用具有有意义的 ids and/or CSS classes 的相关元素来创建稳健的 HTML,则对UI 需要调整测试选择器的地方。 (你选择什么样的命名系统由你决定,重要的是它应该是系统的,它应该反映组件的含义而不是它应该如何显示。所以input200pxwidebold不是一个好的CSS class 名字,而 mainMenuItem 可能是。)

一般来说,如果您发现自己不得不调整单元测试的负载以涵盖 SUT(被测系统)中最微小的变化,那么您的测试的脆弱性就是一个迹象(或者如果您有异味like)设计应该改进一下。

我不确定是否存在这样的工具,但到目前为止我知道有 none。我知道 QTP 有一个内置功能,您可以在其中更新最新的 elements/recordings。但是,Selenium 中没有这样的机制。

在选择器方面,ids一直是最好的选择。这是 Selenium 核心团队和所有其他使用它的自动化工程师的建议。请参阅 SeleniumHQ 提出的建议。 我强烈同意他们的观点,因为 id 是唯一的(即使有时我遇到了重复的 id,这通常是开发人员的错)并且即使元素的位置或此类发生变化(可能),也没有机会破坏您的测试打破其他选择器,例如 xpath/css.

我也同意,在某些情况下,id 可能不是一个选项。在那种情况下,您必须非常小心地编写选择器。使用高效的选择器,您可以 avoid/minimize 像这种特定情况一样失败的机会。

例如 Google 搜索输入标签的绝对 xpath:

html/body/div[1]/div[3]/form/div[2]/div[2]/div[1]/div[1]/div[3]/div/div[3]/div/input[3]

但是,您需要避免这样的选择器,并编写一个不依赖于每个标签或 html 结构的选择器。

我可以为同一个元素写一个如下:

//*[@id='gs_htif0']

相同的概念适用于 cssSelector。此外,考虑使用 xpath 基于文本的搜索,即使这不是首选。

我过去为简化 paths/selectors 的维护所做的一件事是将它们作为字符串保存在一个或多个文件中,由您的模型导入。此 path/selector 字符串文件可能是 Java 中的属性文件。让您的开发团队自己维护这些路径,这样当他们更改 GUI 时,他们也会更新此文件。

是的,这是必须完成的另一件事,但它确实使自动化测试的维护更容易一些。

需要注意的是,有时 GUI 会发生变化,导致控件消失或类型发生变化,在这些情况下,新的定位器将无济于事。