使用Protractor,如何根据文本在列表中选择DOM对象?

时间:2015-07-16 07:07:54

标签: javascript angularjs protractor cucumberjs

我正在尝试根据产品清单从产品清单中选择产品。

我想要做的是“如果列表中的某个项目的标题与”鸡胸肉(200g)相匹配“,请点击按钮。

有人知道如何在量角器中写这个吗?

我正在努力弄清楚什么是返回,什么是承诺,什么不是,以及如何在做任何事情之前等到我有结果。

dom结构看起来像

<li ng-repeat="item in filteredItems" class="ng-scope">
  <div class="product">
    <h3 class="product-title text-uppercase ng-binding" ng-bind="item.name">Chicken Breast (200g)</h3>
    <div class="pad-top-10">
      <button class="btn btn-default btn-xs" type="button" ng-click="addItem(item)">
        <span class="product-add-label">Add Item</span>
      </button>
    </div>
  </div>
</li>

到目前为止我已经尝试过了:

this.Given(/^I can see "([^"]*)" on the page$/, function (productName, done) {
  element.all(by.repeater('item in filteredItems')).then(function (products) {
    for(var i = 0; i < products.length; i++){
      var title = products[i].element(by.css('.product-title'));
      title.getText().then(function (text) {
        if (text.toLowerCase() === productName.toLowerCase()) {
          console.log(text);
          // products[i] shows as undefined
          console.log(products[i]);
          done();
        }
      })
    }
  });
});

2 个答案:

答案 0 :(得分:0)

这是不可测试的,但可能有所帮助:

git ls-files --modified

答案 1 :(得分:0)

经过进一步调查和phylax建议的一些代码后,我发现这是最好的解决方案:

this.Given(/^I can see "([^"]*)" on the page$/, function (productName, done) {
  element.all(by.repeater('item in filteredItems')).then(function (products) {
    for (var i = 0; i < products.length; i++) {
      (function () {
        var title = products[i].element(by.css('.product-title'));
        var product = products[i]; 
        title.getText().then(function (text) {
          if (text.toLowerCase() === productName.toLowerCase()) {
            console.log(text);
            console.log(product);
            done();
          }
        })
      })();
    }
  });
});

你可以看到我添加了一个(function(){}());包装器,所以克服Webstorm抛出的“可以从闭包中访问Mutable变量”的错误,我已经在其中初始化了产品。