Навигация Chromium останавливается в определенных случаях при использовании перехвата запросов с помощью Puppeteer

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

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

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

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


person bshacklett    schedule 21.09.2018    source источник
comment
Код не имеет Google 2FA, поэтому не может дать много информации по этому вопросу. Если вы дополните свой вопрос дополнительным кодом, я обновлю свой ответ и прерву болтовню. :)   -  person Md. Abu Taher    schedule 22.09.2018


Ответы (2)


Как насчет вызова 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)
])
person Md. Abu Taher    schedule 22.09.2018

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

person bshacklett    schedule 22.09.2018