112

在量角器的文档中,我看到以下示例:

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');

这会找到一个元素,但也会警告我有多个与“名称”匹配的元素。不幸的是,它选择的那个不是正确的。

所以,两个问题:

  1. by.model 是否应该能够返回 getText(),或者是否有设计决定它不这样做,我们需要使用 by.binding 来代替?
  2. 我是否应该能够在 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 可能存在缺陷?

4

8 回答 8

219

量角器常见问题解答中对此进行了回答: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 的元素。

于 2013-12-04T22:10:33.207 回答
6

getText()函数不会像以前用于 webdriver 的方式那样工作,为了让它在量角器上工作,你需要将它包装在一个函数中并返回文本,就像我们为量角器框架所做的那样,我们将它保存在一个常见的功能,如 -

getText : function(element, callback) {
        element.getText().then (function(text){             
            callback(text);
         });        

    },

通过这个,您可以获得元素的文本。

如果还不清楚,请告诉我。

于 2013-12-03T12:31:40.837 回答
3

我遇到了这个问题,我尝试了 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
于 2016-09-02T17:31:38.283 回答
2

下面的代码对我有用,用于从输入中获取文本

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))
于 2017-10-03T05:23:58.150 回答
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);
于 2016-01-20T16:36:08.343 回答
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

                    });
于 2018-02-22T11:11:45.400 回答
-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;
            });
        }

比您可以在要获取值的地方调用此函数..

于 2015-07-01T13:08:49.073 回答
-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()

将上述查询注入您的代码。图片细节:

在此处输入图像描述

于 2017-11-06T06:44:38.547 回答