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

问题描述 投票:5回答:2

如何在量角器测试中使用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
  • 一个

在期望函数doAwait(){await asyncAction();时值为1 return asyncAction(); }

我喜欢把它想象成类似的

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

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

javascript selenium promise async-await protractor
2个回答
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();
});

0
投票

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

async functions / await

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

© www.soinside.com 2019 - 2024. All rights reserved.