做过WEB自动化测试的都知道,导致元素定位不到的一大原因就是定位的时候元素还未加载出来,解决方法就是增加等待时间。Selenium为我们提供了三种等待方式,不过这三种等待方式都是需要手动写代码去设置的。而Playwright为我们自动处理好了这个问题。我们看一下官方文档:

https://playwright.bootcss.com/docs/actionability

image.png

可以看到,Playwright是“auto-waiting”的。也就是说采用的是自动等待机制。比如,对于click操作,在操作前Playwright会确保这些条件都被满足:

  • element is Attached to the DOM(元素已经挂载在DOM上了)
  • element is Visible(元素是可见的)
  • element is Stable, as in not animating or completed animation(元素是稳定的而不是正在动态变化的)
  • element Receives Events, as in not obscured by other elements(元素是可以接受事件的,也就是没有被其他元素遮挡)
  • element is Enabled(元素是可以被操作的,比如按钮的enabled属性是true)

以上条件都被满足的时候,就可以确保点击操作一定可以成功。


等待总是有时限的,超过等待时限,Playwright会报超时错误。那么如何手动设定这个超时时长呢?我们可以用以下这个方法,为所有的等待设置一个默认时间:

image.png

这个设置的等待时间相当于是一种“隐式等待”了。那么如果我们就是想用强制等待让页面操作停留特定一段长的时间怎么办呢?可以用下面这个方法:

image.png

不过强制等待有其缺点,官方文档是这样说的:

Note that page.waitForTimeout() should only be used for debugging. Tests using the timer in production are going to be flaky. Use signals such as network events, selectors becoming visible and others instead.

请注意,page.waitForTimeout() 应该仅用于调试。在生产中使用计时器进行测试将会不稳定。请改用网络事件、选择器变得可见等信号来进行测试。