在 WebdriverIO 中,为啥 `expect` 行需要在其前面加上 `await` 才能正确测试某些内容?

Posted

技术标签:

【中文标题】在 WebdriverIO 中,为啥 `expect` 行需要在其前面加上 `await` 才能正确测试某些内容?【英文标题】: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 来防范。

【问题讨论】:

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

【讨论】:

for (2) 不知道有这样的变化......如果有同步模式,我们做一个browser.pause(3000),它不是真的,它必须做一个“忙”空闲循环...但是在异步模式下,我们是否执行await browser.pause(3000) 以使其不忙? (只是一个 setTimeout 真的可以唤醒我们)。对于(3),我明白了...现在问题已解决...您在谈论“没有await它再次通过”部分 (2) 据我了解,您是对的。 (3) 它通过了,因为你没有等待执行。它返回一个承诺而不是结果

以上是关于在 WebdriverIO 中,为啥 `expect` 行需要在其前面加上 `await` 才能正确测试某些内容?的主要内容,如果未能解决你的问题,请参考以下文章

避免在登录表单中使用 WebDriverIO 重新输入用户/电子邮件和密码

如何在VScode中调试Webdriverio黄瓜框架

使用 CodeceptJS/WebdriverIO 并行执行浏览器

如何通过Appium / WebdriverIO更改iOS滑块值

WebdriverIO - 在 Android 和 iOS 上并行运行相同的代码

如何在独立模式下调试 webdriverio?