为什么 Playwright goto 在导航时超时?

问题描述 投票:0回答:1

为什么 Playwright 在导航时超时?我正在尝试截取 MongoDB 登录网站的屏幕截图,但它没有截取屏幕截图并给出超时错误。

(async () => {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();

  await page.goto("https://account.mongodb.com/account/login");

  await page.screenshot({ path: "mongo.png" });

  await browser.close();
})();

我尝试在 Puppeteer 中做同样的事情,效果很好!

javascript playwright
1个回答
2
投票

由于某种原因,某些网站无法触发

"load"
事件,这是 Playwright 默认使用
goto
等待的导航状态。很高兴看到一个重现这种行为的网站。

我通常建议使用

"domcontentloaded"
(甚至
"commit"
)而不是
"load"
,因为它比
"load"
更快、更可靠,而且似乎永远不会超时:

const playwright = require("playwright"); // ^1.42.1

let browser;
(async () => {
  browser = await playwright.chromium.launch({headless: false});
  const page = await browser.newPage();
  await page.goto("https://account.mongodb.com/account/login", {
    waitUntil: "domcontentloaded",
  });
  await page.screenshot({path: "mongo.png"});
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

对于截图前不稳定的页面,您可以使用类似 this 的内容(Puppeteer 可以轻松转换为 Playwright),或者等待特定于站点的选择器或网络请求完成。超时也可以用于临时调试,但通常不稳定且不鼓励。

不幸的是,我还不确定为什么 Puppeteer 有效而 Playwright 无效,以及页面上的哪些特定行为阻止

goto
解析为 Playwright(这种行为有时也会出现在 Puppeteer 中)。可能对
"load"
的含义有稍微不同的定义,或者导致 Playwright 在此特定站点上失败的某些实现细节。很明显,这不仅仅是网站行为的影响——图书馆也很重要。您可能想向 Playwright 提出问题,或者尝试一些旧版本,看看行为是否会随着时间的推移而改变。

如果我有更多时间,我会进一步研究它——我将其发布为初步答案。这是一个非常有趣的问题,值得重新审视。

© www.soinside.com 2019 - 2024. All rights reserved.