如何在量角器中识别没有明显可识别的页面元素属性
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 的一部分或者.
问题
- 是否有理想的方法来确定测试指标?
- 如果没有理想的方法,不操纵HTML最好的方法是什么?
- 如果更改 HTML 可以,最好的方法是什么?
- 通常可以更改 HTML 以使测试更容易识别组件吗?
- 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'));
- If there is no ideal way, what is the best way without manipulating the HTML?
我发现的最佳方法是使用 Andres chrome extension tool elementor。您会惊讶于该工具可以如此轻松地帮助您确定最佳定位器,甚至可以向您显示与当前页面相匹配的总页数。
- 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');
- 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" 这样的逻辑,这可能表明您对场景测试数据的控制不佳。如果您不能确定当前被测页面的状态,那么您如何可靠地端到端地发现错误?我的意思是,如果您对当前状态做出反应,这意味着您没有事先正确验证它,您可能会错过正确播种测试数据的机会,这也有助于以后重现错误。
背景
我有一些(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 的一部分或者.
问题
- 是否有理想的方法来确定测试指标?
- 如果没有理想的方法,不操纵HTML最好的方法是什么?
- 如果更改 HTML 可以,最好的方法是什么?
- 通常可以更改 HTML 以使测试更容易识别组件吗?
- 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'));
- If there is no ideal way, what is the best way without manipulating the HTML?
我发现的最佳方法是使用 Andres chrome extension tool elementor。您会惊讶于该工具可以如此轻松地帮助您确定最佳定位器,甚至可以向您显示与当前页面相匹配的总页数。
- 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');
- 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" 这样的逻辑,这可能表明您对场景测试数据的控制不佳。如果您不能确定当前被测页面的状态,那么您如何可靠地端到端地发现错误?我的意思是,如果您对当前状态做出反应,这意味着您没有事先正确验证它,您可能会错过正确播种测试数据的机会,这也有助于以后重现错误。