量角器 - TypeError:undefined不是函数

时间:2015-09-15 07:09:18

标签: javascript angularjs automation jasmine protractor

此问题有两个目的,即尝试解决此特定错误并尝试了解量角器最佳实践。所以,我有以下测试失败的代码:

var newRow = element.all(by.repeater("employee in ec.employees")).last();

newRow.then(function(row) {
    row.findElements(by.tagName("td")).then(function(cells) {
        expect(cells.get(0).getText()).toBe("9988776655000");
        expect(cells.get(1).getText()).toBe("Test name");
        expect(cells.get(2).getText()).toBe("Test surname");
    });
});

原因:

  

TypeError:Undefined不是函数

它指向第2行代码newRow.then(...)

我的相关HTML:

<tr ng-repeat="employee in ec.employees">
    <td>{{employee.jmbg}}</td>
    <td>{{employee.name}}</td>
    <td>{{employee.surname}}</td>
</tr>

现在,我已经在SO上看到了几十个关于这个错误的帖子,但是所有这些都是具体的,据我所知,并没有一个类似于我的案例。 那么,除了为什么我的代码不起作用的问题之外,我想问一下使用ElementFinder.findElement/s函数是否更好,还是有其他选择?

2 个答案:

答案 0 :(得分:2)

element.all(...).last()会返回ElementFinder,因此您无法像承诺一样使用它。更改代码以直接在newRow变量上查找元素。这是如何 -

var newRow = element.all(by.repeater("employee in ec.employees")).last();

newRow.findElements(by.tagName("td")).then(function(cells) {
    expect(cells.get(0).getText()).toBe("9988776655000");
    expect(cells.get(1).getText()).toBe("Test name");
    expect(cells.get(2).getText()).toBe("Test surname");
});

希望这有帮助。

答案 1 :(得分:2)

由于您在标签中使用绑定,我建议您查找这些绑定,而不是自己抓取行。这样,如果您在将来更改行的顺序或添加其他行,则测试不太可能中断。尝试以下内容:

var newRow = element.all(by.repeater("employee in ec.employees")).last();

newRow.then(function(row) {
    expect(row.element(by.binding('employee.jmbg'))).toBe('9988776655000');
    expect(row.element(by.binding('employee.name'))).toBe('Test name');
    expect(row.element(by.binding('employee.surname'))).toBe('Test surname');
});

如果你有一个Angular指令,绑定,转发器,模型或你可以定位的特定css路径,你应该尝试在选择器中使用它们,以使你的测试更可靠。我还将研究为您的测试创建PageObjects,以减少可能出现在测试中的重复代码量。