在 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 重新输入用户/电子邮件和密码
使用 CodeceptJS/WebdriverIO 并行执行浏览器
如何通过Appium / WebdriverIO更改iOS滑块值