如何在量角器的输入上获取文本


105

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

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返回一个空值(不是一个promise或一个对象),并且期望失败,并给出以下消息:

Expected '' to equal 'A risk name'.

我的理解是,量角器已经对期望值进行了修补,因此我感到根本的问题是getText在通过模型标识的字段上不起作用(我可以在标签和其他小部件上成功地获取Text)。

我还可以使用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可能存在缺陷吗?

Answers:


202

在量角器常见问题解答中对此进行了回答:https : //github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-空的

输入元素中的getText结果始终为空

这是一个网络驱动程序怪癖。和元素始终具有空的getText值。相反,请尝试:

element.getAttribute('value')

对于问题2,是的,您应该能够对by.binding使用完全限定的名称。我怀疑您的模板实际上没有通过{{}}或ng-bind绑定到risk.name的元素。


啊,我以为我到处都在寻找,包括寻找它。我今天在量角器github中提出这个问题,因为我没有找到答案。烦。我的元素与ng-model绑定,因此在html中包含“ ng-model =“ risk.name””。但这可能并不是使其工作所需的。我建议更新doco以建议使用getAttribute。
PaulL 2013年

1
由于我花了太长时间才弄清楚这一点,因此添加了此后缀:getAttribute实际上返回的是promise,而不是字符串。github.com/angular/protractor/issues/673
无聊的人

而且我认为这种魔术之所以起作用是因为getAttribute的行为,该行为实际上将获得一个属性(即,即使您的DOM中不存在“ value”属性,该属性也将返回一个值):“ ...,除非该属性不是当前,在这种情况下,将返回具有相同名称的属性的值”
The Red Pea'July

6

getText() 函数将无法像以前的webdriver那样工作,为了使其能够用于量角器,您需要将其包装在函数中并返回文本,就像我们为量角器框架所做的一样,我们将其保存在常见功能-

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

    },

这样,您就可以拥有一个元素的文本。

让我知道是否仍然不清楚。


我了解如果我想直接使用文本,则需要这样做,但是我认为Protractor修补了Jasmine期望匹配器以处理诺言-因此Expect(element.getText())。toEqual实际上与element相同.getText()。then(expect(text).toEqual)。那不正确吗?
PaulL 2013年

这对我也不起作用。我在上面扩展了我的问题,因此您可以看到此格式。
PaulL 2013年

尝试使用element(by.locator('abc')。getText()。then(function(text){console.log(text)Expect(text).toEqual(“ sometext”);});
vdrulerz

它报告对象[object Object]没有方法'locator'。我没有在'by.locator'的量角器api中看到一种方法,并且在代码中也没有看到一个方法-并且肯定地如果有一个by.locator方法,那么它就像是'by.。 locator('model','risk.name')'?
PaulL 2013年

与by.locator的意思是您可以使用prot.findelement(By.id),CSS,Xpath或任何locator属性之类的东西....如果仍然无法使用,请与我共享您的代码和html属性...肯定帮助您...
vdrulerz

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

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

0

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

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))

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

                    });

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

比您可以在要获取值的位置调用此函数。


-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()

将上面的查询插入您的代码。图片细节:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.