如何在剧作家中无条件地给予固定(隐式等待)等待。
我需要设置一个固定的等待值,如 cypress 所示:
Cy.等待(600);
谢谢你
要在 Playwright 中给出固定等待而不使用任何条件,可以使用 page.waitForTimeout 方法。此方法将在继续之前将脚本暂停指定的时间。
await page.waitForTimeout(2000); // waits for 2 seconds
您还可以将 page.waitForFunction 方法与在一定时间后返回 true 的函数一起使用。例如:
await page.waitForFunction(() => {
const now = Date.now();
return now - start > 2000;
});
这将等待 2 秒然后返回 true。
请注意,应谨慎使用这些方法,因为它们可能会导致脚本执行延迟。通常最好使用特定条件来确定何时继续,例如等待特定元素出现或页面加载。
艰难等待的问题:
硬等待只做一件事——它们只是等待指定的时间 不考虑任何应用程序的实际响应时间,这是非常 严格的方法。
请参阅以下示例:
await page.waitForTimeout(5000); // hard wait for 5000ms
无论实际响应时间如何,这都会等待 5 秒,这可能少于或超过 5 秒,这在两种情况下都是不好的,因为在第一种情况下,它必须等待更长的时间,而在第二种情况下,它会等待对象已经加载的时间如果在失败情况下根本不会加载对象,则在不必要的等待 5 秒后失败。
// For example a specific element is visible after login
await expect(page.getByText('Welcome')).toBeVisible();
Playwright 在导航和页面交互上有内置等待机制。由于它们是剧作家本身的一部分,因此最好使用它们并根据需要进行自定义。
还有另一种显式处理等待的方法,仅在自动等待不是足够或有效的方法来处理的情况下,具体取决于具体情况,但一般来说,如果自动等待足以满足要求,则应避免这种情况。
等待页面导航和API响应
1)page.waitForNavigation 等待页面导航(新 URL 或页面重新加载)完成。
2)page.waitForLoadState 这会等待,直到达到所需的加载状态。
3)page.waitForURL 这将等待导航到目标 URL。
4)page.waitForResponse 等待直到收到给定 API 的响应。
等待元素
在延迟加载的页面中,使用 locator.waitFor() 等待元素可见可能很有用。或者,页面交互(例如 page.click())会自动等待元素。
// Navigate and wait for element
await page.goto('https://example.com');
await page.getByText('Example Domain').waitFor();
// Navigate and click element
// Click will auto-wait for the element
await page.goto('https://example.com');
await page.getByText('Example Domain').click();
等待页面事件
我们还可以使用 page.waitForEvent 直接等待页面事件。
定制等待功能
最后,我们还可以使用 WaitForFunction 为非常特定的场景或特定的应用程序控件编写(如果确实需要)自定义等待函数。
这是 5 秒超时
await new Promise(resolve => setTimeout(resolve, 5000));