【问题标题】:In WebdriverIO, why does the `expect` line require an `await` in front of it to correctly test something?在 WebdriverIO 中,为什么 `expect` 行需要在其前面加上 `await` 才能正确测试某些内容?
【发布时间】:2021-10-24 06:07:07
【问题描述】:

这是一个关于 WebdriverIO 和 ES6 JavaScript 承诺的有点高级的问题:

我只是按照 WebdriverIO 上的说明创建项目:

npx wdio TryWDIO
cd TryWDIO

然后我修改了测试文件:

// test/specs/example.e2e.js

describe('Trying it', () => {
  it('should have some text', async () => {
    await browser.url('https://www.amazon.com');
    const elem = await $('body');

    await expect(elem).toHaveTextContaining('Best Sellers');
  });
});

并使用

运行它
npm run wdio

所以测试通过了。

如果我把最后一行改成

await expect(elem).toHaveTextContaining('BBBest Sellers');

测试按预期失败。

但是,当该行更改为:

expect(elem).toHaveTextContaining('BBBest Sellers');

然后测试又通过了。

这是为什么呢?我想不管我们是否await,这个承诺无论如何都应该失败。

实际上它看起来有点脆弱,因为如果程序员忘记在那里等待,测试通过但实际上可能没有通过。但是有人告诉我我们可以有一个 linting 规则来保证它......但是一些爱好者会编写脚本而不是使用 eslint 来防范。

【问题讨论】:

    标签: es6-promise webdriver-io


    【解决方案1】:
    1. 你的函数是异步的,你应该等待承诺。在同步模式下删除等待是有意义的。 Answer about async and await
    2. 从 wdio 和 NodeJS v16 Sync vs. Async Mode 中删除了同步模式。因此,您将不得不在后续版本中使用 async 和 await
    3. 我认为您在expect(elem).toHaveTextContaining('Best Sellers'); 中有错字。如果你想让它失败,它应该是expect(elem).toHaveTextContaining('BBBest Sellers');

    【讨论】:

    • for (2) 不知道有这样的变化......如果有同步模式,我们做一个browser.pause(3000),它不是真的,它必须做一个“忙”空闲循环...但是在异步模式下,我们是否执行await browser.pause(3000) 以使其不忙? (只是一个 setTimeout 真的可以唤醒我们)。对于(3),我明白了...现在问题已解决...您在谈论“没有await它再次通过”部分
    • (2) 据我了解,您是对的。 (3) 它通过了,因为你没有等待执行。它返回一个承诺而不是结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2021-10-15
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多