如何在量角器测试中使用async和await?
it('test async', function(){
var value = 0;
function asyncAction() {
return browser.driver.wait(()=>true)
.then(function () {
console.log('a');
return value++;
});
}
//-Problem Area-
async function doAwait(){
await asyncAction();
return asyncAction();
}
doAwait();
protractor.promise.controlFlow().execute( () => {
console.log('b');
expect(value).toBe(2);
});
});
这里的输出是
在期望函数doAwait(){await asyncAction();时值为1 return asyncAction(); }
我喜欢把它想象成类似的
function doAwait(){
asyncAction().then(()=>asyncAction());
}
哪个有效,但上面的async doAwait没有。我相信这是因为发电机打破了硒的ControlFlow。
将此添加到量角器配置中:
var webdriver = require.main.require('selenium-webdriver');
Promise = webdriver.promise.Promise;
Object.assign(Promise, webdriver.promise);
Promise.resolve = Promise.fulfilled;
Promise.reject = Promise.rejected;
虽然也许不是所有的承诺都应该是托管承诺?
值得注意的是,另一个解决方案需要包装每个异步函数:
protractor.promise.controlFlow().execute( async () => {
await asyncAction();
return asyncAction();
});
见https://github.com/angular/jasminewd#async-functions--await:
async
functions / await
async
函数和await
关键字可能会出现在ES2017(ES8)中,并可通过多个编译器获得。目前,他们经常打破WebDriver控制流程。 (GitHub issue)。您仍然可以使用它们,但如果您这样做,则必须使用await
/ Promises进行几乎所有同步。有关示例,请参阅spec/asyncAwaitAdapterSpec.ts和spec/asyncAwaitErrorSpec.ts。