如何在量angular器上的input上获取文本
在量angular器的文档中,我看到下面的例子:
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”在input框中设置值,但是如果您想查看input框并查看其中的内容,则需要使用“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');
这find一个元素,但也给出了一个警告,我有多个匹配“名称”的元素。 不幸的是,它所挑选的不是正确的。
所以,有两个问题:
- 如果by.model能够返回一个getText(),或者是否有devise决定,它不这样做,我们需要使用by.binding?
- 我应该能够在by.binding中使用完全合格的实体,还是有一个devise决定,即by.binding不喜欢完整的模型名称? 如果是这样,我可以使用其他限定符来select不同的绑定?
编辑:
我也尝试了由vdrulerzbuild议的解决scheme,我修改了代码如下:
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'.
我的理解是,量angular器已经打好了处理承诺的期望,所以我觉得底层的问题是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的语法也是有效的,并且在控制台上logging“真”。 我认为getText有潜在的缺陷?
这在量angular器常见问答中得到了解答: https : //github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-空
input元素的getText结果总是空的
这是一个webdriver怪癖。 元素总是有空的getText值。 相反,请尝试:
element.getAttribute('value')
至于问题2,是的,你应该能够使用by.binding的完全限定名称。 我怀疑你的模板实际上没有通过{{}}或ng-bind绑定到risk.name的元素。
getText()函数不会像webdriver那样工作,为了使它在量angular器中工作,您需要将它包装在一个函数中,并返回文本,就像我们为量angular器框架所做的一样。一个常见的function就像 –
getText : function(element, callback) { element.getText().then (function(text){ callback(text); }); },
通过这个你可以有一个元素的文本。
让我知道如果它仍然不清楚。
谢谢 !!
我有这个问题,我试过Jmr的解决scheme,但它没有为我工作。 由于所有的input字段都具有ng-model属性,我可以拉取属性并对其进行评估并获取值。
HTML
<input ng-model="qty" type="number">
量angular器
var qty = element( by.model('qty') ); qty.sendKeys('10'); qty.evaluate(qty.getAttribute('ng-model')) //-> 10
此代码工作。 我有一个dateinput字段已被设置为只读,这迫使用户从日历中select。
开始date:
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);
结束date:
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);
你可以尝试这样的事情
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; }); }
比你可以调用这个function,你想获得的价值..
下面的代码适用于我,从input中获取文本
return(this.webelement.getAttribute('value').then(function(text) { console.log("--------" + text); }))
您可以使用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()
将上面的查询注入到您的代码中。 图像细节: