如何在量角器中识别没有明显可识别的页面元素属性

How to identify page elements in protractor with no obvious identifiable property

背景

我有一些(AngularJS模板)HTML如下:

<div class="data-handler-container">
    <div class="row">
        <div class="data-handler" ng-if="dataController.showDistance()">
            <p>{{ 'Item Count' | translate}}
            <p class="metric">{{dataController.project.item_total | converter:dataController.user.unit | number: 6}}<span class="unit">{{dataController.user.unit}}</span></p>
        </div>

        <div class="data-handler">
            <p>{{ 'Total Time' | translate}}</p>
            <p class="metric">{{dataController.project.time_total | format:'time':'hh:mm:ss'}}</p>
        </div>
    </div>
</div>

我现在正在使用量角器编写端到端测试。我需要确定指标元素,以便我可以访问测试中的值。

我认为在这种情况下我不能简单地使用 class,因为第一个元素在 ng-if 中,所以可能不存在。我必须通过 class 进行识别,然后在我的测试中编写一些逻辑来计算返回数组中的项目 - 并根据计数匹配它们。在这个例子中,它不会太复杂,但在其他情况下它会很笨重。

我可以 select 具有特定值的项目之后的段落 - 所以 Total Time 例如,这可行,但似乎不太理想。如果另一个页面元素具有相同的文本怎么办 - 我的测试需要再次更新。

据我所知,我无法按型号识别项目,因为它们是通过过滤器传递的,而且我不想指定所有过滤器等...作为 select 的一部分或者.

问题

  1. 是否有理想的方法来确定测试指标?
  2. 如果没有理想的方法,不操纵HTML最好的方法是什么?
  3. 如果更改 HTML 可以,最好的方法是什么?
  4. 通常可以更改 HTML 以使测试更容易识别组件吗?
  1. Is there n ideal way to identify the metrics for testing?

我会选择 by.binding 定位器作为部分匹配:

var itemTotalElm = element(by.binding('dataController.project.item_total'));
var timeTotalElm = element(by.binding('dataController.project.time_total'));
  1. If there is no ideal way, what is the best way without manipulating the HTML?

我发现的最佳方法是使用 Andres chrome extension tool elementor。您会惊讶于该工具可以如此轻松地帮助您确定最佳定位器,甚至可以向您显示与当前页面相匹配的总页数。

  1. What is the best way if changing HTML is ok?

我相信自动化测试的 QA 应该能够并鼓励更新 HTML 源代码,只要他遵循一些良好的实践,例如添加 html class 以 e2e- 开头的名称,以便开发人员了解选择器的用途,例如

<p class="metric e2e-item_total">

然后你可以用

定位它
var itemTotalElm = $('.metric.e2e-item_total');
  1. Is it ok in general to alter HTML to make it easier for tests to identify components?

在 3 plus 中的回答会补充说,只要没有好的选择器可用,就应该只更新基础 HTML,所以在这种情况下 by.binding 就足够了。

如果您希望在您的测试中添加像 "if there are more than 5 total items tests this else test that" 这样的逻辑,这可能表明您对场景测试数据的控制不佳。如果您不能确定当前被测页面的状态,那么您如何可靠地端到端地发现错误?我的意思是,如果您对当前状态做出反应,这意味着您没有事先正确验证它,您可能会错过正确播种测试数据的机会,这也有助于以后重现错误。