我目前正在使用Chromium以headfull模式运行Puppeteer,并已启用请求拦截。在某些情况下,page
导航失败,我遇到了问题。进度指示器只是坐在那里旋转,连接的调试器看不到任何活动。似乎仅当页面导航由Javascript触发时才会发生,但我不确定。
发生这种情况的一个关键地方是Google的2fa提示符。当我在手机上按“是”以允许登录时,它开始导航,但无处可通。
我知道,如果未调用request.continue()
,则会发生这种情况。为避免这种情况,我在请求拦截后立即致电request.continue()
。但是由于某种原因,它似乎并不总是能按预期运行。
项目源代码可在https://github.com/bgshacklett/flogin/blob/master/flogin.js
获得答案 0 :(得分:0)
在该代码段之后调用interceptedRequest.continue();
怎么样?
if (interceptedRequest.url() === samlUrl) {
onBeforeRequestEvent(interceptedRequest);
}
interceptedRequest.continue();
尽管看起来都是一样的,因为它们都是异步承诺。
特别是这一行When I hit "Yes" on my phone to allow a login it begins navigating, but goes nowhere.
,即使您在手机上按了YES,有时google 2FA也会花一些时间。
最后,罪魁祸首似乎是这条线,
await page.goto(new URL(authUrl).href);
await page.waitForRequest(samlUrl);
如何确保在转到页面后请求发生? waitForRequest将暂停执行,直到发生请求为止。如果您确定两者都会发生,但不确定哪个会先发生,则可以使用旧的Promise.all
await Promise.all([
page.waitForRequest(samlUrl),
page.goto(new URL(authUrl).href)
])
答案 1 :(得分:0)
降级到Puppeteer的1.6.2版本似乎已经解决了我的问题。