Javascript 量角器-类型错误:未定义不是函数

Javascript 量角器-类型错误:未定义不是函数,javascript,angularjs,automation,jasmine,protractor,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).ge

这个问题有两个目的,一是试图解决这个特定的错误,二是试图理解量角器的最佳实践。因此,我有以下测试失败的代码:

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不是函数

它指向第二行代码
newRow。然后(…)

我的相关HTML:

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

{{employee.jmbg}
{{employee.name}
{{雇员姓氏}
现在,我已经看到了几十篇关于这个错误的帖子,但都是具体的,据我所知,没有一篇与我的案例类似。 因此,除了我的代码为什么不工作的问题之外,我想问的是使用
ElementFinder.findElement/s
函数更好,还是有其他选择?

元素
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");
});
希望这有帮助。

元素.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");
});

希望这能有所帮助。

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

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');
});

如果您有一个角度指令、绑定、中继器、模型或特定的css路径,您可以将其作为目标,那么您应该尝试在选择器中使用它们,以使测试更加可靠。我还将研究为您的测试创建PageObjects,以减少测试中可能出现的重复代码量。

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

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');
});

如果您有一个角度指令、绑定、中继器、模型或特定的css路径,您可以将其作为目标,那么您应该尝试在选择器中使用它们,以使测试更加可靠。我还将研究为测试创建页面对象,以减少测试中可能出现的重复代码量。

这是问题的一部分。就我所能找到的在线“findElements”已被弃用(在我的情况下不起作用),所以我不得不使用“all”。这是问题的一部分。据我所知,网上的“findElements”已被弃用(在我的情况下,它不起作用),所以我不得不使用“all”。