在protractor的文档中,我看到了以下示例:
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');
这段代码找到了一个元素,但是它也警告我匹配“name”的元素不止一个。不幸的是,它选择的不是正确的那个。
所以,有两个问题:
- 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 返回一个空值(不是 promise 或对象),expect 则报错并给出以下信息:
Expected '' to equal 'A risk name'.
我的理解是protractor已经通过修补expect来处理promise,所以我觉得潜在的问题是getText不能在通过模型识别的字段上正常工作(我可以成功地在标签和其他小部件上使用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可能存在缺陷?