Как перезагрузить страницу в Puppeteer? - PullRequest
0 голосов
/ 19 марта 2019

Я хотел бы перезагрузить страницу всякий раз, когда страница загружается неправильно или сталкивается с проблемой. Я пытался 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:\Users\Administrator\node_modules\puppeteer\lib\JS
Handle.js:418:13)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at ElementHandle.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\
lib\helper.js:108:27)
    at DOMWorld.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\DOMWorl
d.js:149:21)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at Frame.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\help
er.js:108:27)
    at Page.$eval (C:\Users\Administrator\node_modules\puppeteer\lib\Page.js:329
:29)
    at Page.<anonymous> (C:\Users\Administrator\node_modules\puppeteer\lib\helpe
r.js:109:23)
    at main (C:\Users\Administrator\Desktop\webscrape\text.js:35:43)
    at process._tickCallback (internal/process/next_tick.js:68:7)

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

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Мне удается решить это с помощью цикла 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 голос
/ 19 марта 2019

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

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

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

Кроме того, вы можете перемещаться по кукловоду назад и вперед . Как это:

await page.goBack();
await page.goForward();
0 голосов
/ 19 марта 2019

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

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 в момент чтения страницы, тогда ваш код становится бесполезным.Возможно, вам понадобится добавить тайм-аут, а затем найти в домене элемент.

...