当使用by.model时,Protractor出现未知错误:angular未定义。

7

我正在编写一些针对我的 Angular 组件的 Protractor 测试,但当我尝试使用 by.model 选择输入元素时,会出现错误“未知错误:angular 未定义”。

这很奇怪,因为如果我这样做,它可以正常工作并通过测试:

it('should have an input element for searching', () => {
    var inputElement = element(by.model('searchText');
    expect(inputElement).toBeDefined();
});

但是,当我尝试做类似这样的事情时,它会因为 Angular 未定义错误而失败:

it('should filter the search text', () => {
     var inputElement = element(by.model('searchText');
     expect(inputElement).toBeDefined();

     inputElement.clear()
     inputElement.click();
     inputElement.sendKeys('ICBC');

     var tableLengthRow = element.all(by.css('.animate-repeat').count();
     expect(tableLength).toBe(1);
});

如果我替换这行代码:

var inputElement = element(by.model('searchText');

使用这个:
var inputElement = element.all(by.tagName('input')).get(0);

只需将其余部分保留,测试即可通过。

有人知道为什么上面的第一个测试使用by.model可以工作,但我实际点击元素的第二个测试却不行吗?

然后我该如何使用Webpack和npm在页面上定义Angular?

谢谢


1个回答

21

by.model在Angular中(包括angular2、angular4及以上版本)不受支持。

推荐的替代方法是使用by.css()

根据 angular/protractor 的当前自述文件:

Protractor 适用于 AngularJS 版本大于 1.0.6/1.1.4,并兼容 Angular 应用。请注意,对于 Angular 应用程序,不支持使用 by.binding()by.model() 定位器。我们建议使用 by.css()

Angular指南-E2E测试中提供了替代方法的示例:

Previous code               New code         Notes
by.model('$ctrl.query')     by.css('input')  The model matcher relies on AngularJS ng-model
by.model('$ctrl.orderProp') by.css('select') The model matcher relies on AngularJS ng-model

我不明白,什么时候可以使用 by.binding? - Fernando Gabrieli
1
@FernandoGabrieli 显然无法实现,在答案中引用的自述文件中表示Angular应用程序不支持它们。 - acdcjunior
那就意味着我们无法在Angular 9或Angular 10应用中使用by.model或by.binding了吗? - Fernando Gabrieli
1
谢谢,这对我很有帮助 :) 并且节省了我很多时间。 - Fernando Gabrieli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接