【问题标题】:How to avoid broken CSS path/XPath references in automated UI tests?如何在自动化 UI 测试中避免损坏的 CSS 路径/XPath 引用?
【发布时间】:2015-07-17 06:16:09
【问题描述】:

我有一组用于测试基于 Web 的 UI 的 TestNG 测试。

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

这些测试也在后台使用 Selenium。我在一个班级进行了测试,在另一个班级进行了网页模型。

为了在网页中获取对 UI 组件(按钮、菜单等)的引用,我使用 CSS 或 XPath 选择器。这是在模型类中硬编码的。为了获取表示 UI 组件的对象,我在模型类中调用 get 方法,该方法使用 css 选择器返回 UI 组件的对象。然后使用该对象,我可以单击、选择、取消选择或对组件执行任何操作。

这一切都很好,除非 css 选择器发生变化。

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

我在想是否可以通过每个步骤或单击手动重复测试,并记录所用元素的 css 选择器,这比调试测试更快,找出页面中的新元素名称/javascript 手动更新模型 css 选择器。

或者有没有办法链接网页开发,针对页面的变化自动更新模型代码,这样变化就不会破坏测试?

谢谢!

【问题讨论】:

    标签: user-interface testing selenium xpath testng


    【解决方案1】:

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

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

    我也同意在某些情况下 id 可能不是一个选项。在这种情况下,您必须非常小心地编写选择器。使用高效的选择器,您可以避免/最大限度地减少这种特定情况下的失败机会。

    以谷歌搜索输入标签的绝对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 文本的搜索,即使这不应该是首选。

    【讨论】:

    • 谢谢。在对此进行了更多研究之后,ids 似乎是最好的方法,但由于各种原因我实际上不能使用它们。但精心挑选的 CSS 选择器似乎是一个不错的选择。
    【解决方案2】:

    如果您使用具有有意义的ids 和/或 CSS 类的相关元素创建健壮的 HTML,那么您需要调整测试选择器的 UI 更改将很少。 (你选择什么样的命名系统取决于你,重要的是它应该是系统的,它应该反映组件的含义而不是它应该如何显示。所以input200pxwidebold不是一个好的CSS类名,而mainMenuItem 可能是。)

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

    【讨论】:

      【解决方案3】:

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

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

      需要注意的是,有时 GUI 会发生更改,导致控件消失或更改类型,在这些情况下,新的定位器不会帮助您。

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 2013-04-26
        • 2021-02-13
        相关资源
        最近更新 更多