此问题有两个目的,即尝试解决此特定错误并尝试了解量角器最佳实践。所以,我有以下测试失败的代码:
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
函数是否更好,还是有其他选择?
答案 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,以减少可能出现在测试中的重复代码量。