在量角器的文档中,我看到以下示例:
describe('by model', function() {
it('should find an element by text input model', function() {
var username = element(by.model('username'));
username.clear();
username.sendKeys('Jane Doe');
var name = element(by.binding('username'));
expect(name.getText()).toEqual('Jane Doe');
});
这里很清楚的是,您可以使用“by.model”在输入框中设置值,但是如果您想查看输入框并查看其中的内容,则需要使用“by.binding”。
我有一组代码(总而言之)我这样做:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(在我的真实代码中,我保存实体然后在编辑模式下返回它,我正在检查我的值是否实际保存。但它仍然归结为同样的事情,这个示例代码给出了同样的问题)。
这给了我一个错误:
Error: Expected '' to equal 'A value'.
理论上,按照文档中的示例,我可以改为:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
但是 by.binding 似乎不喜欢完全限定的模型,我收到一个错误:
Error: No element found using locator: by.binding("risk.name")
如果我这样做,它确实有效(在时尚之后):
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
这会找到一个元素,但也会警告我有多个与“名称”匹配的元素。不幸的是,它选择的那个不是正确的。
所以,两个问题:
- by.model 是否应该能够返回 getText(),或者是否有设计决定它不这样做,我们需要使用 by.binding 来代替?
- 我是否应该能够在 by.binding 中使用完全限定的实体,或者是否存在 by.binding 不喜欢完整模型名称的设计决策?如果是这样,我可以使用哪些其他限定符在不同的绑定之间进行选择?
编辑:
我也试过vdrulerz建议的解决方案,我修改代码如下:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
console.log 返回一个空白值(不是承诺或对象),并且期望失败给出消息:
Expected '' to equal 'A risk name'.
我的理解是量角器已经修补了期望来处理承诺,所以我觉得根本问题是 getText 不能在通过模型识别的字段上工作(我可以成功地在标签和其他小部件上获取文本)。
我还可以使用 getAttribute 而不是 getText() 运行以下代码:
expect(element(by.model('risk.name')).getAttribute('autofocus')).toEqual('true');
element(by.model('risk.name')).getAttribute('autofocus').then(function(text) {
console.log(text);
expect(text).toEqual('true');
});
第一部分通过 - 预期有效。第二部分也有效,表明 vdrulerz 的语法也是有效的,它会将“true”记录到控制台。我认为 getText 可能存在缺陷?