【问题标题】:Using async and await in selenium protractor tests在 selenium protractor 测试中使用 async 和 await
【发布时间】:2016-08-12 19:41:11
【问题描述】:

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

在期望的时候值是 1 函数doAwait(){ 等待异步操作(); 返回异步操作(); }

我喜欢认为这类似于

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

这有效,但上述异步 doAwait 无效。我相信这是因为生成器破坏了 selenium 的 ControlFlow。

【问题讨论】:

  • 你已经得到了这个“我相信这是因为生成器破坏了硒的控制流。”
  • 我很想知道你是如何测试这个的。我的 IDE 只支持 ECMA 6
  • require('babel-register')({ plugins: ['transform-async-to-generator'] });

标签: javascript selenium promise async-await protractor


【解决方案1】:

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

var webdriver = require.main.require('selenium-webdriver');
Promise = webdriver.promise.Promise;
Object.assign(Promise, webdriver.promise);
Promise.resolve = Promise.fulfilled;
Promise.reject = Promise.rejected;

虽然也许不是所有的 Promise 都应该是托管的 Promise?

值得注意的是,另一种解决方案需要包装每个异步函数:

protractor.promise.controlFlow().execute( async () => {
    await asyncAction();
    return asyncAction();
});

【讨论】:

    【解决方案2】:

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

    async 函数 / await

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

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 1970-01-01
      • 2018-05-27
      • 2018-01-06
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多