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 以减少可能出现在您的测试中的重复代码的数量。