本质上,我正在尝试建立一个用于设置先决条件的库(想想用户创建)。由于量角器是基于承诺的并且神奇地完成所有包装以保持秩序,我想到使用 Promise 来达到这个目的。我写了一些示例代码,但我无法解释观察到的行为,所以也许有人可以帮助我理解发生了什么。
function timeout(ms) {
var promise = protractor.promise.defer();
setTimeout(function() {
console.log('qwer');
promise.fulfill(true);
}, ms);
return promise.promise;
}
所以现在该函数返回一个承诺,我认为它可以像这样内联使用(因为所有代码都被包装在控制流中)
describe('test', function() {
it('bla', function() {
browser.get('/');
timeout(5000);
$('some-element').click();
});
});
然而这并没有按预期工作(即 console.log 永远不会发生)。即使当expect
从这个承诺中得到结果,它不会改变结果。如果实际上明确地等待通过执行完成timeout(5000).then(done)
,超时完成,但在该操作之后下一个操作不会排队(即打开站点,单击元素,然后 5 秒后发生超时日志)。
所以我真的很困惑如何使用控制流来确保一切按顺序执行的声明和观察到的行为如何结合在一起。
仅仅创建一个是不够的protractor.promise
延迟对象 - 您需要告诉控制流它。这通常是通过protractor.promise.controlFlow().execute()
.
function timeout(ms) {
protractor.promise.controlFlow().execute(function() {
var deferred = protractor.promise.defer();
setTimeout(function() {
console.log('qwer');
deferred.fulfill(true);
}, ms);
return deferred.promise;
});
}
通读https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js这里有幕后的所有魔法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)