如何在量角器中的ng-repeat中使用isElementPresent / isPresent?

时间:2015-06-05 11:59:00

标签: javascript angularjs selenium testing protractor

HTML:

<div ng-repeat="todo in todos">
        <span><input ng-model="todo.title" /></span>
        <span><input ng-model="todo.time" /></span>
        <span><input ng-model="todo.name" /></span>
</div>

通过考试:

expect(element(by.repeater('todo in todos')).isPresent()).toBe(true);

通过考试:

expect(element(by.repeater('todo in todos').row(1)).isPresent()).toBe(true);

测试失败1:

  

预计是假的。

expect(element(by.repeater('todo in todos').row(1).column('todo.name')).isPresent()).toBe(true);

测试失败2:

  

预计是假的。

browser.isElementPresent(element(by.repeater('todo in todos').row(1).column('todo.name'))).then(function(present){
    expect(present).toBe(true);
})

在项目级别,我可以在字段中设置数据。在项目级别,我可以在字段中检索数据。但是无法在商品级使用isPresentisElementPresent

2 个答案:

答案 0 :(得分:2)

此处的问题是.column('todo.name')会搜索绑定到todo.name 的元素。换句话说,它会通过绑定进行搜索(请参阅findRepeaterElement),同时将todo.name定义为ng-model

引用@juliemr(问题ng-repeat with ng-model bindings):

  

列选择器采用匹配绑定的字符串,而不是输入ng-models。

答案 1 :(得分:1)

搞定了!仅当输入存在时,此代码才会sendKeys

我在webstorm中调试了此代码并执行了此操作:

element.all(by.repeater('todo in todos')).then(function(allrows){

    for(var i = 0 ;i<allrows.length ;i++)
    {
        allrows[i].all(by.model('todo.name')).then(function(field){

            field[0].isPresent().then(function(val){

                expect(val).toBe(true);

                field[0].sendKeys('22.335');

            });
        });
    }
});