在量角器的文档中,我看到以下示例:
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'的元素。不幸的是,它选择的那个不是正确的。
所以,有两个问题:
编辑:
我也尝试过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无法处理通过模型识别的字段(我可以在标签和其他小部件上成功获取文本)。 / p>
我也可以使用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可能存在缺陷吗?
答案 0 :(得分:180)
在量角器常见问题解答中回答:https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-empty
输入元素的getText结果总是空的
这是一个webdriver的怪癖。和元素始终具有空的getText值。相反,尝试:
element.getAttribute('value')
对于问题2,是的,您应该能够使用by.binding的完全限定名称。我怀疑你的模板实际上并没有通过{{}}或ng-bind绑定到risk.name的元素。
答案 1 :(得分:5)
getText()
函数不会像以前那样用于webdriver,为了使它适用于量角器,你需要将它包装在一个函数中并返回文本,就像我们为我们做的那样我们将量角器框架保存在像
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
通过这个你可以得到一个元素的文本。
如果目前还不清楚,请告诉我。
答案 2 :(得分:2)
我有这个问题,我尝试过Jmr的解决方案,但它对我没用。由于所有输入字段都具有ng-model属性,因此我可以提取属性并对其进行评估并获取值。
HTML
<input ng-model="qty" type="number">
量角器
var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10
答案 3 :(得分:0)
此代码有效。我有一个日期输入字段已设置为只读,强制用户从日历中选择。
开始日期:
var updateInput = "var input = document.getElementById('startDateInput');" +
"input.value = '18-Jan-2016';" +
"angular.element(input).scope().$apply(function(s) { s.$parent..searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);
结束日期:
var updateInput = "var input = document.getElementById('endDateInput');" +
"input.value = '22-Jan-2016';" +
"angular.element(input).scope().$apply(function(s) { s.$parent.searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);
答案 4 :(得分:0)
下面的代码适用于我,用于从输入中获取文本
return(this.webelement.getAttribute('value').then(function(text)
{
console.log("--------" + text);
}))
答案 5 :(得分:0)
您必须使用Promise来打印或存储元素的值。
var ExpectedValue:string ="AllTestings.com";
element(by.id("xyz")).getAttribute("value").then(function (Text) {
expect(Text.trim()).toEqual("ExpectedValue", "Wrong page navigated");//Assertion
console.log("Text");//Print here in Console
});
答案 6 :(得分:-1)
你可以尝试这样的事情
var access_token = driver.findElement(webdriver.By.name("AccToken"))
var access_token_getTextFunction = function() {
access_token.getText().then(function(value) {
console.log(value);
return value;
});
}
您可以在此处调用此函数来获取值..
答案 7 :(得分:-3)
您可以使用jQuery在文本框中获取文本(适合我),签入图像详细信息
代码:
$(document.evaluate( "xpath" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()
Example:
$(document.evaluate( "//*[@id='mail']" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()
将上述查询注入您的代码。图片细节: