我正在尝试编写一个剧作家测试,该测试在提交表单后执行某些操作。提交表单后,会发生两件事:
- “抽屉”关闭
- 弹出“通知”
问题是,这两件事的顺序可能会因为随机性而改变。那么我是否这样做:
await expectDrawerToClose();
await expectNotification();
或者:
await expectNotification();
await expectDrawerToClose();
...无论哪种方式,有时都会出错。Playwright 有什么办法可以做到:
await expectTwoThingsToHappenInAnyOrder(
expectDrawerToClose(),
expectNotification()
);
我知道我可以将定位器与 链接在一起or
,但这不是同一件事:我不想说“我会看到这两件事之一发生”......我想说“我会看到两者都会发生;我只是不关心顺序。”
大多数时候没必要。只要该行为没有在页面上执行完整的块(就像 的情况一样
alert()
,它会阻止渲染)或者如果一个状态可能消失而 Playwright 仍在等待另一个条件,顺序断言就会起作用。考虑以下示例:
尽管这两个事件在单击后的 2 秒内以任意顺序发生,但该测试保证通过。断言的顺序并不重要。
根据您的评论之一,您注意到通知可能会在短时间内被驳回。在这种情况下,顺序很重要。在较长/永久状态之前断言临时状态:
如果两种状态都不确定地消失,并且需要真正同时断言,那么您可以使用
Promise.all
:如果您发现您
Promise.all()
在测试中经常使用该模式,那么要么您拥有一个异常动态且出色的网站,要么您过度使用它(可能是后者)。优先选择正确排序的直线断言,如上面的代码片段 2,除非确实没有其他选择。如果您想获取多个状态中的第一个并忽略其余状态,请使用
Promise.race
代替Promise.all
。请参阅这篇文章的示例。明智地使用。如果您不使用
@playwright/test
,则可以删除expect
s 并使用.waitFor()
代替.toBeVisible()
。