在量角器的文档中,我看到以下示例:
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'.
我的理解是,量角器已经补充了处理承诺的期望,所以我觉得底层问题是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可能存在缺陷?
getText()
函数将无法像以前的webdriver那样工作,为了使它能够用于量角器,您需要将其包装在函数中并返回文本,就像我们为量角器框架所做的一样,我们将其保存在常见功能-
getText : function(element, callback) { element.getText().then (function(text){ callback(text); }); },
这样,您就可以拥有一个元素的文本。
让我知道是否仍然不清楚。
这在Protractor FAQ中得到了解答:https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-空
输入元素的getText结果始终为空
这是一个webdriver怪癖.和元素始终具有空的getText值.相反,尝试:
element.getAttribute('value')
至于问题2,是的,您应该能够使用by.binding的完全限定名称.我怀疑你的模板实际上并没有通过{{}}或ng-bind绑定到risk.name的元素.