使用伪音符,当我输入一个值时会打开一个页面-它输出结果。
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)
问题是:如何处理该错误,所以如果引发超时错误,我可以捕获该错误并调用另一个函数?
答案 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秒,因此基本上有两个主要问题。
这是我的最终代码。
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个问题。
将页面超时时间从默认的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.
}
}
答案 4 :(得分:-1)
尝试uisng可以解决您的问题。 page.waitForNavigation({超时:1000,waitUntil:'domcontentloaded'});