在selenium量角器测试中使用async和await

时间:2016-08-12 19:41:12

标签: javascript selenium promise async-await 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);
    });
});

这里的输出是

  • 一个
  • B'/ LI>
  • 一个

,期望值为1 function doAwait(){         等待asyncAction();         return asyncAction();     }

我觉得这与

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

哪个有效,但上面的async doAwait没有。我相信这是因为发生器破坏了硒的ControlFlow。

2 个答案:

答案 0 :(得分:4)

将此添加到量角器配置中:

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();
});

答案 1 :(得分:0)

请参阅https://github.com/angular/jasminewd#async-functions--await

async个函数/ await

async个函数和await关键字可能会出现在ES2017(ES8)中,并可通过多个编译器获得。目前,他们经常打破WebDriver控制流程。 (GitHub issue)。您仍然可以使用它们,但如果您这样做,则必须使用await / Promises进行几乎所有同步。有关示例,请参阅spec/asyncAwaitAdapterSpec.tsspec/asyncAwaitErrorSpec.ts