如何在Puppeteer中重新加载页面?

时间:2019-03-19 08:58:47

标签: 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:\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)

某些链接无法成功加载。当我手动刷新这些页面时,它可以工作。因此,我希望有一个函数或方法可以帮助我在出现错误时自动重新加载页面。

4 个答案:

答案 0 :(得分:6)

这对我有用:

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

有关详细信息,请参阅Puppeteer文档:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagereloadoptions

答案 1 :(得分:1)

我设法使用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;
            }

}

答案 2 :(得分:0)

您始终可以通过DOM重新加载页面,如下所示:

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

或者这是lot of ways的一种如何通过DOM通过浏览器JS重新加载页面的方法

此外,您还可以导航木偶back and forward。像这样:

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

答案 3 :(得分:0)

因此,在注释之后,以下行将导致错误。

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

bacause Puppetteer具有浏览器回调。当它找到该元素并调用回调时,如果该元素不存在,则会引发错误。

此外,页面已重新加载。之后,您什么也没做。如果要在此之后获取图像。使用

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

重新加载后。或者,您可以使用while循环来连续检查元素是否存在。如果没有,请刷新页面并再次检查。这样可以确保您始终拥有内容。

但是,如果您的内容是动态生成的,并且在您阅读页面时不是DOM的一部分,那么您的代码将变得毫无用处。您可能需要添加一个超时,然后在dom中搜索该元素。