Skip to content

playwright 常见问题梳理

获取一个元素时间超过默认时间怎么处理

  • 最关键的就是找到是什么原因阻塞的,等待该事件,一般情况加是接口响应速度慢,在这个元素之前加上 waitForResponse
  • 简单一点就是添加超时参数,例如 page.getByRole("checkbox", { name: "我已阅读并同意" }).waitFor({ timeout: 20000 })

如何 mock 一个 websocket

ts
await page1.routeWebSocket("ws://127.0.0.1:1234/", (ws) => {
  const server = ws.connectToServer();
  ws.onMessage((message) => {
    if (message === "request") server.send("request2");
    else server.send(message);
  });
});

单个用例运行超时怎么处理

默认超时时间是 30 秒

可以在测试的内部添加超时时间

ts
test("百度", async ({ page, context }) => {
  test.setTimeout(100000);//设置超时时间为 100 秒
  await page.goto("https://www.baidu.com");
})

无头模式下打开新的页面来预览 pdf 测试进层会卡住

在 headless 模式会卡住,因为打开的是一个 pdf 新页面,无头模式没有 PDF 阅读器渲染,永远不会 domcontentloaded,在 head 模式下不会卡住,因为浏览器内置的有 PDF 阅读器渲染

patch
-await page.waitForLoadState("domcontentloaded");
+expect(page.url())

websocketRoute 监听不到

解决办法:

  • 监听不到可能是因为监听的位置太晚了,可以放在测试用例的最上面
  • 如果涉及到多个页面,可能该 page 的创建时间比较晚,也可以直接放在用 context.routeWebSocket 然后在测试用例的最开始进行监听

Released under the ISC License.