我使用Protractor进行e2e测试。
我需要在innerhtml内容的基础上获得一个元素。但我不知道该怎么做。
在html代码中,它看起来像是:
<div class="scroll" style="-webkit-transform: translate3d(0px, 0px, 0px) scale(1);">
<label class="item item-radio" ng-repeat="locale in locales">
<input type="radio" name="group" ng-checked="false" ng-click="updateLocale(locale)">
<div class="item-content ng-binding">
English (USA)
</div>
<i class="radio-icon ion-checkmark"></i>
</label>
现在我需要元素&#34; 输入&#34;基于&#34; 英语(美国)的内部HTML。
我测试的是:
var languageOption = element(by.className('input div item-content ng-binding').getText()).toBe('English (USA)');
我总是收到错误&#34; 没有方法&#39; getText&#39; &#34; 我做错了什么?
答案 0 :(得分:1)
非常难,所以你必须为ng-repeat中的每个输入元素(或其他元素)创建唯一的ID。
我是这样做的:
<input id="locale{{$index}}"...>
您可以根据需要定义第一个。通过上面的解决方案,我得到了这个:
locale0 locale1 locale2 ......等等
然后你可以得到这样的元素:
element(by.id('locale0'));
答案 1 :(得分:1)
我建议你使用map然后过滤。使用map返回div和输入的文本,然后根据div文本过滤地图的结果。
it('should ...', function() {
var localeToLookFor = 'English (USA)';
// Use map to return the text and the input.
$$('.item.item-radio').map(function(row) {
return {
text: row.$('item-content').getText(),
input: row.$('input');
}
}).then(function(rows) {
// Here you have an array with elements.
// Array.<{text: string, input: WebElement}>
// Find the text you are looking for and return.
for (var i = 0; i < rows.length; i++) {
if (rows[i].text === localeToLookFor) {
return rows[i];
}
}
throw Error('Could not find element');
}).then(function(radioInput) {
// Here you should have a WebElement with the radio.
});
});