量角器:无法获取中继器元素

Protractor: can't get repeater element

我正在测试 https://angularjs.org/ 中名为 "Add new control" 的基本示例。 问题是在向中继器添加新值后我无法获得任何元素。只有第一个。

...
var listRepeater = by.repeater('todo in todoList.todos');
var list = element.all(listRepeater);
expect(list.count()).toEqual(2);

addNewElement();

expect(list.count()).toEqual(3);
expect(list.get(0).element(by.model("todo.done")).getAttribute("checked")).toEqual("true");
expect(list.get(2).element(by.model("todo.done")).getAttribute("checked")).toEqual("true");

添加新元素后,检查元素计数是否正常:等于 ti 3,我知道新值已正确添加。而且我可以清楚地得到第一个元素的 "checked" 属性 (默认情况下禁用)。但是当我试图获取(2)元素时,我有关于空对象的错误。与 get(1) 相同。只有 get(0) 工作正常。但是2行中继器默认是毫无疑问的。

这可能是一个 promise/synchronization/refreshing 问题。看看这是否有效,如果有效,您需要开始使用 promises。

it("your test", function(done){
  var listRepeater = by.repeater('todo in todoList.todos');
  var list = element.all(listRepeater);
  expect(list.count()).toEqual(2);

  addNewElement();
  browser.sleep(2000);

  setTimeout(function(){
      var listRepeater = by.repeater('todo in todoList.todos');
      var list = element.all(listRepeater);
      expect(list.get(2)
        .element(by.model("todo.done"))
        .getAttribute("checked")).toEqual("true");

      done();
  }, 2000);
});

问题是第二个和第三个元素未选中并且没有 checked 属性 - 这就是您得到 null.

的原因

相反,检查复选框是否被选中的正确方法是使用 isSelected():

expect(list.get(0).element(by.model("todo.done")).isSelected()).toEqual(true);
expect(list.get(2).element(by.model("todo.done")).isSelected()).toEqual(false);

对我有用。