当在Puppeteer中使用请求拦截时,铬导航在特定情况下会停顿

时间:2018-09-21 00:08:42

标签: node.js chromium puppeteer

我目前正在使用Chromium以headfull模式运行Puppeteer,并已启用请求拦截。在某些情况下,page导航失败,我遇到了问题。进度指示器只是坐在那里旋转,连接的调试器看不到任何活动。似乎仅当页面导航由Javascript触发时才会发生,但我不确定。

发生这种情况的一个关键地方是Google的2fa提示符。当我在手机上按“是”以允许登录时,它开始导航,但无处可通。

我知道,如果未调用request.continue(),则会发生这种情况。为避免这种情况,我在请求拦截后立即致电request.continue()。但是由于某种原因,它似乎并不总是能按预期运行。

项目源代码可在https://github.com/bgshacklett/flogin/blob/master/flogin.js

获得

2 个答案:

答案 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版本似乎已经解决了我的问题。