在Selenium Protractor测试中使用异步和等待(async and await)

5

如何在Protractor测试中使用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);
    });
});

这里的输出结果是:

  • a
  • b
  • a

并且在期望的时间值为1时。下面是doAwait()函数的代码:

async function doAwait(){
    await asyncAction();
    return asyncAction();
}

我认为这类似于:

function doAwait(){
  asyncAction().then(()=>asyncAction());
}

前面的代码可以运行,但是上面的async doAwait却不能。我认为这是因为生成器打破了selenium的控制流。


您已经理解了这一点:“我相信这是因为生成器中断了Selenium的控制流。” - nilesh
我很好奇你是如何测试这个的。我的IDE只支持到ECMA 6。 - nilesh
需要('babel-register')({ plugins: ['transform-async-to-generator'] }); - TrevDev
2个回答

4
将此内容添加到protractor配置中即可生效:
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();
});

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接