首页 文章

如何在量角器中输入文本

提问于
浏览
91

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

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可能存在缺陷?

8 回答

  • -1

    这在Protractor FAQ中得到了解答: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的元素 .

  • 0

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

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

    通过这个你可以得到一个元素的文本 .

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

  • 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

    这段代码有效 . 我有一个日期输入字段已设置为只读,强制用户从日历中选择 .

    开始日期:

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

    您必须使用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
    
                        });
    
  • 5

    You can try something like this

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

    你可以调用这个函数来获取值 .

  • 0

    你可以使用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()
    

    将以上查询注入您的代码 . 图片细节:

    enter image description here

相关问题