为什么 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 中做同样的事情,效果很好!
由于某种原因,某些网站无法触发
"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 提出问题,或者尝试一些旧版本,看看行为是否会随着时间的推移而改变。
如果我有更多时间,我会进一步研究它——我将其发布为初步答案。这是一个非常有趣的问题,值得重新审视。