量角器:在innerhtml的基础上获取元素

时间:2015-02-18 12:50:01

标签: javascript protractor

我使用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; 我做错了什么?

2 个答案:

答案 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.
  });
});