Навигация по хрому в определенных случаях останавливается при использовании перехвата запроса с Puppeteer - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время я использую Puppeteer с Chromium в режиме headfull и включаю перехват запросов.У меня проблема с page, в некоторых случаях навигация не удалась.Индикатор прогресса просто вращается, а подключенный отладчик не видит активности.Кажется, что это происходит только тогда, когда навигация по страницам запускается Javascript, но я пока не уверен.

Одним из ключевых моментов, где это происходит, является приглашение Google 2fa.Когда я нажимаю «Да» на моем телефоне, чтобы разрешить вход в систему, он начинает навигацию, но никуда не идет.

Я знаю, что это произойдет, если request.continue() не вызывается.Чтобы избежать этого, я звоню request.continue() сразу после перехвата запроса.Однако по некоторым причинам он не всегда работает должным образом.

Исходный код проекта доступен по адресу https://github.com/bgshacklett/flogin/blob/master/flogin.js

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Понижение версии Puppeteer до версии 1.6.2, похоже, решило проблему для меня.

0 голосов
/ 22 сентября 2018

Как насчет того, когда вы вызываете 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., иногда Google 2FA занимает немного много времени, чтобы завершить работу, даже если вы нажали YES на своем телефоне.

И, наконец, виновником, кажется, является эта строка,

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)
])
...