Как перезагрузить страницу в Puppeteer?

#javascript #node.js #chromium #puppeteer

#javascript #node.js #chromium #puppeteer

Вопрос:

Я хотел бы перезагружать страницу всякий раз, когда страница не загружается должным образом или возникает проблема. Я пытался page.reload() , но это не работает.

 for(const sect of sections ){

            // Now collect all the URLs
            const appUrls = await page.$$eval('div.main > ul.app-list > li > div.app-info a.app-info-icon', links => links.map(link => link.href));

            // Visit each URL one by one and collect the data
            for (let appUrl of appUrls) {
                var count = i  ;
                try{
                    await page.goto(appUrl);
                    const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());
                    console.log('n'   count);
                    console.log(appName);
                } catch(e){
                    console.log('n'   count);
                    console.log('ERROR', e);
                    await page.reload();
                }

            }

        }
  

Это выдает мне эту ошибку:

     ERROR Error: Error: failed to find element matching selector "div.det-name-int"
    at ElementHandle.$eval (C:UsersAdministratornode_modulespuppeteerlibJS
Handle.js:418:13)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at ElementHandle.<anonymous> (C:UsersAdministratornode_modulespuppeteer
libhelper.js:108:27)
    at DOMWorld.$eval (C:UsersAdministratornode_modulespuppeteerlibDOMWorl
d.js:149:21)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at Frame.<anonymous> (C:UsersAdministratornode_modulespuppeteerlibhelp
er.js:108:27)
    at Page.$eval (C:UsersAdministratornode_modulespuppeteerlibPage.js:329
:29)
    at Page.<anonymous> (C:UsersAdministratornode_modulespuppeteerlibhelpe
r.js:109:23)
    at main (C:UsersAdministratorDesktopwebscrapetext.js:35:43)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  

Некоторые ссылки не могут успешно загрузиться. Когда я обновляю эти страницы вручную, это работает. Итак, я надеюсь, что существует функция или метод, которые помогут мне автоматически перезагрузить мою страницу при возникновении ошибки.

Комментарии:

1. Выдает ли это какие-либо ошибки? Если да, то что это? page.reload — это обещание, и вы с ним не справляетесь. Попробуйте использовать его и посмотрите, выполняется ли он или нет

2. Похоже, это не работает?? Что именно это означает?

3. @Sammy на странице ошибка загрузки

4. Не могли бы вы, возможно, приложить скриншот? Существует много типов ошибок при загрузке. Что такое код состояния HTTP? Возможно, вы пытаетесь сделать что-то незаконное, как это называет сайт, который блокируется, или удаленный сервер не работает. Нам нужна дополнительная информация об ошибке

5. @Sammy Я включил ошибку в вопрос.

Ответ №1:

У меня это работает:

 await page.reload({ waitUntil: ["networkidle0", "domcontentloaded"] });
  

Подробности смотрите в документах Puppeteer:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagereloadoptions

Ответ №2:

Вы всегда можете перезагрузить страницу через DOM, вот так:

 await page.evaluate(() => {
   location.reload(true)
})
  

или вот множество способов, как вы можете перезагрузить страницу с помощью браузера JS через DOM

Кроме того, вы можете перемещать свой puppeteer назад и вперед. Вот так:

 await page.goBack();
await page.goForward();
  

Комментарии:

1. Иногда первый подход вызывает «сбой» в puppeteer, я действительно рекомендую вторую альтернативу.]

Ответ №3:

Мне удается решить это с помощью цикла while.

 for (let appUrl of appUrls) {
    var count = i  ;

    while(true){
        try{

            await page.goto(appUrl);

            const appName = await page.$eval('div.det-name-int', div => div.innerText.trim());

            console.log('n'   count);
            console.log('Name: ' , appName);

            break;

            } catch(e){
              console.log('n'   count);
              console.log('ERROR');
              await page.reload(appUrl);

              continue;
            }

}
  

Комментарии:

1. Старайтесь избегать операторов while (true), потому что, если вы столкнетесь со страницей, на которой вообще нет ссылок, вы заблокируете основной поток в бесконечном цикле.

Ответ №4:

Итак, после комментариев в следующей строке появляется ошибка.

 ERROR Error: Error: failed to find element matching selector "div.det-name-int"
  

потому что у Puppetteer есть обратный вызов браузера. Когда он находит элемент и вызывает обратный вызов, и если элемент не существует, он выдает ошибку.

Кроме того, страница перезагружается. После этого вы ничего не делаете. Если вы хотите извлечь изображение после этого. Использовать

 await page.$eval('div.det-name-int', div => div.innerText.trim());
  

после перезагрузки. Или вы можете использовать цикл while для непрерывной проверки, существует ли элемент. Если этого не произойдет, обновите страницу и проверьте еще раз. Это гарантирует, что у вас всегда будет контент.

Но если ваш контент генерируется динамически и не является частью DOM в момент, когда вы читаете страницу, тогда ваш код становится бесполезным. Возможно, вам потребуется добавить тайм-аут, а затем выполнить поиск элемента в dom.