量角器 - getText作为sendKeys和其他动作的输入

时间:2015-09-17 13:40:01

标签: protractor

我正在编写量角器测试,我需要使用getText()读取带有id ='mylabel'的span / div。然后我需要使用sendKeys()将值传递给输入(id ='myinput')。

所以,我这样做:

var value;
element(by.id('mylabel')).getText().then(function(txt){
    value = txt;
    element(by.id('myinput')).sendKeys(value);
    // do "other protractor tasks" with 'value'.
})

但是,有没有办法可以避免嵌套,通过要求量角器在设置值变量后执行sendKeys和后续操作?

以上是一个简单的案例,但由于等待承诺得到解决,我很快就会发现代码进入多个嵌套。另外,我观察到量角器没有提供堆栈跟踪,如果“其他量角器任务”由于某处某处的错误而引发错误(它只是挂起并超时)。

我使用的是Protractor 2.1.0,我正在使用Angular JS页面。

我特别感兴趣的是知道在使用Protractor的嵌套任务中是否存在无声错误是一个已知问题,无论如何都要解决它?

2 个答案:

答案 0 :(得分:2)

量角器处理至少一个级别的promises而不需要then函数。这样你可以期待同步流程。

如果您正在寻找基于事件的操作,例如观看要更新的值,则可以设置如下内容:

function waitForTextToUpdate(elm, defaultText, timeout) {
    if (typeof(timeout) === 'undefined') {
        timeout = 10000;
    }
    return browser.driver.wait(function() {
        return elm.getText().then(function(value) {
            return !(value.indexOf(defaultText) > -1);
        });
    }, timeout, "Expectation error (waitForTextToUpdate): Timed out waiting for element state to change.");
}

答案 1 :(得分:1)

量角器中的承诺是不可避免的。没有办法避免处理promises,但如果你想避免嵌套,可以使用.then()链接功能轻松完成。这是一个例子 -

var value = '';
element(by.id('mylabel')).getText()
.then(function(txt){
    value = txt;
})
.then(function(){
    element(by.id('myinput')).sendKeys(value);
    // do "other protractor tasks" with 'value'.
});

此功能还有一个npm包。 Q npm package。它与上面的例子类似,但更加扩展。 希望这会有所帮助。