我正在编写量角器测试,我需要使用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的嵌套任务中是否存在无声错误是一个已知问题,无论如何都要解决它?
答案 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。它与上面的例子类似,但更加扩展。 希望这会有所帮助。