木偶页面.waitForNavigation()超时错误处理

时间:2018-10-09 08:03:48

标签: javascript node.js puppeteer

使用伪音符,当我输入一个值时会打开一个页面-它输出结果。

SqlParameter para = new SqlParameter("search", "%" + searchfor + "%");
IQueryable<VwSomeView> dbresult = db.vwSomeView.FromSql("select * from vwSomeView where firstname like @search or lastname like @search",para);

但是,只有在enter上的值有效时,该方法才能正常工作。如果不是,它将抛出一个错误,但是没有任何网络活动或负载事件。
这意味着,如果值不正确,我正在等待的元素将不会出现,并且将引发错误,从而关闭程序。

await page.click('button[class="button form-button rs-gcbalance-btn"]')

await page.waitForSelector('div[class="small-4 large-4 rs-gcbalance-result-num-col').catch(err => console.log(err))

await page.evaluate((card) => {
    console.log(card + " - " + document.querySelectorAll('div[class="small-4 large-4 rs-gcbalance-result-num-col"]')[1].querySelector('span').innerHTML)
}, card)

问题是:如何处理该错误,所以如果引发超时错误,我可以捕获该错误并调用另一个函数?

5 个答案:

答案 0 :(得分:1)

只需将其包装在try catch块中即可:

try {
  await page.waitForSelector('#element', { timeout: 1000 });
  // do what you have to do here
} catch (e) {
    console.log('element probably not exists');
}

这是一个可以正常工作的示例:

const puppeteer = require('puppeteer');

const html = `
<html>
    <body>
        <div id="element">element inner html</div>
    </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`data:text/html,${html}`);

  try {
    await page.waitForSelector('#element-not-exists', { timeout: 1000 });
    const element = await page.$('#element-not-exists');
    console.log(await (await element.getProperty('innerHTML')).jsonValue());
  } catch (e) {
    console.log('element probably not exists');
  }
  await browser.close();
})();

答案 1 :(得分:1)

您可以在按钮单击后使用 waitForNavigation 方法并附加如下所示的 catch 块来处理导航超时错误,以防输入的值不正确且导航未发生

page.waitForNavigation({waitUntil:"domcontentloaded"}).catch(error => {
    // handler code here
});

答案 2 :(得分:0)

当我尝试抓取某些页面时,我遇到了类似的问题,因为默认超时为30000毫秒(即30秒),页面加载时间超过30秒,因此基本上有两个主要问题。

    nodeli抛出后,
  1. 脚本没有被杀死 page.waitForNavigation()超时错误,因此它保持了mysql 连接到服务器的活动连接正在建立新连接 由cronjob创建,他们都处于睡眠状态。
  2. 页面没有被抓取,因此需要增加超时时间。

这是我的最终代码。

const puppeteer = require('puppeteer');
var mysql = require('mysql');


var mysql_con = mysql.createConnection({
  host: "",
  user: "",
  password: "",
  database: ""

});

//connect to mysql
mysql_con.connect(function(err) {
  if (err) throw err;
  console.log("Connected! to MySQL");
});


(async () => {

    const args = [
        '--no-sandbox', 
        '--disable-setuid-sandbox',
        '--disable-infobars',
        '--window-position=0,0',
        '--ignore-certifcate-errors',
        '--ignore-certifcate-errors-spki-list',
        '--ignoreHTTPSErrors=true',
        '--user-agent="Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z‡ Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"' 
    ];

    const browser = await puppeteer.launch({ args });
    const page = await browser.newPage();

    // Configure the navigation timeout to 2 minutes, becuase sometimes site is too busy
    await page.setDefaultNavigationTimeout(120000);

  try {

    // Now you can go wherever you want
    const response = await page.goto('https://www.example.com/');

    //print http status code 
    console.log(response.status());

    //do mysql related stuff here

    //close mysql connection
    mysql_con.end();

  } catch (e) {

    console.log('cant load the page, maybe server is busy : ' + e);

    //close mysql connection
    mysql_con.end();

    await browser.close();

    //double tap to die script
    process.exit();
  }



    // Then when you're done, just close
    await browser.close();
})();

在这里我们修复了2个问题。

  1. 通过使用try and catch块并在catch块中终止脚本/结束mysql连接来解决第一个问题。
  2. 将页面超时时间从默认的30秒增加到2分钟。

    page.setDefaultNavigationTimeout(120000);

答案 3 :(得分:0)

try catch 块是一个解决方案。

但是,在接受的答案中所有错误都被消除了!!

您应该只捕获Puppeteer TimeOut 错误。

try {
  await page.waitForSelector('.foo');
} catch (e) {
  if (e instanceof puppeteer.errors.TimeoutError) {
    // Do something if this is a timeout.
  }
}

参考文献:https://devdocs.io/puppeteer/

答案 4 :(得分:-1)

尝试uisng可以解决您的问题。 page.waitForNavigation({超时:1000,waitUntil:'domcontentloaded'});