Protractor - TypeError: undefined is not a function
Protractor - TypeError: undefined is not a function
这个问题有两个目的,一个是尝试解决这个特定错误,另一个是尝试理解量角器的最佳实践。所以,我有以下失败的测试代码:
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 is not a function
它指向第 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
函数更好,还是有其他选择?
element.all(...).last()
returns 和 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");
});
希望对您有所帮助。
由于您在标签中使用绑定,我建议您寻找这些绑定而不是自己获取行。这样,如果您将来更改行的顺序或添加其他行,测试就不太可能中断。尝试如下操作:
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 以减少可能出现在您的测试中的重复代码的数量。
这个问题有两个目的,一个是尝试解决这个特定错误,另一个是尝试理解量角器的最佳实践。所以,我有以下失败的测试代码:
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 is not a function
它指向第 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
函数更好,还是有其他选择?
element.all(...).last()
returns 和 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");
});
希望对您有所帮助。
由于您在标签中使用绑定,我建议您寻找这些绑定而不是自己获取行。这样,如果您将来更改行的顺序或添加其他行,测试就不太可能中断。尝试如下操作:
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 以减少可能出现在您的测试中的重复代码的数量。