Javascript 如果页面中不存在DOM元素,如何移动到下一个迭代?
我想用木偶演员测试一下wepage的几个子页面。该网页对机器人有一定的防护。我将URL放在一个数组中,并遍历这个数组 我陷入了如何重新编写代码的困境,因为我遇到了几个问题:由于bot保护,页面在实际加载真实内容之前会向浏览器发送一些“假加载”状态。因此,我认为我必须等待一些DOM元素Javascript 如果页面中不存在DOM元素,如何移动到下一个迭代?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我想用木偶演员测试一下wepage的几个子页面。该网页对机器人有一定的防护。我将URL放在一个数组中,并遍历这个数组 我陷入了如何重新编写代码的困境,因为我遇到了几个问题:由于bot保护,页面在实际加载真实内容之前会向浏览器发送一些“假加载”状态。因此,我认为我必须等待一些DOM元素 await page.waitForSelector('div.site__content'); 以确保内容已加载。(wait page.evaluate因机器人程序保护而不工作,它在第一个“假加载”标志上触发)
await page.waitForSelector('div.site__content');
以确保内容已加载。(wait page.evaluate因机器人程序保护而不工作,它在第一个“假加载”标志上触发)
但这里还有另一个问题:如果页面加载不正确(例如,由于连接超时),我会遇到一个未处理的承诺拒绝错误,并且迭代停止,程序的执行停止
我的目标是,如果在加载页面时出现任何类型的错误,跳过当前迭代并移动到下一个迭代,而不会导致程序崩溃。但我必须保持沉默
await page.waitForSelector
我也是。
我怎样才能做到这一点
(async function filterIds() {
let filteredIds = ['url1', 'url2', '...', 'url200'];
const browser = await puppeteer.launch({ headless: false });
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
await tuneUserAgent(page);
for (let id in filteredIds) {
let errorPage = null;
let url = filteredIds[id];
await page.goto(url, { waitUntil: 'load', timeout: 120000 });
await page.waitForSelector('div.site__content'); // to be sure that the content has been loaded
errorPage = await page.evaluate(() => {
return document.querySelector('div.errorpage');
});
if (errorPage != null || errorPage === undefined) {
continue;
}
await page.waitForSelector('div.dialog');
let noGallery = await page.evaluate(() => {
return document.querySelector('div[class="is-not-photo-uploaded-text"]');
});
if (noGallery != null || noGallery === undefined) {
openOrNot = 5;
}
if (openOrNot < 4) {
await openGallery(page);
}
let html = await page.content();
await fs.writeFile(`./saved_items/${filteredIds[id].substring(filteredIds[id].lastIndexOf('/') + 1)}.html`, html, function (err) {
if (err) throw err;
});
await page.waitFor(400);
}
await browser.close();
})();
(异步函数filterIds(){
让filteredIds=['url1','url2','…','url200'];
const browser=wait puppeter.launch({headless:false});
const context=await browser.createIncognitoBrowserContext();
const page=wait context.newPage();
等待用户代理(第页);
for(让id进入过滤器REDIDS){
设errorPage=null;
让url=filteredIds[id];
wait page.goto(url,{waitUntil:'load',超时:120000});
等待page.waitForSelector('div.site__content');//以确保内容已加载
errorPage=等待页面。评估(()=>{
返回文档.querySelector('div.errorpage');
});
如果(errorPage!=null | | errorPage==未定义){
继续;
}
等待page.waitForSelector('div.dialog');
让noGallery=等待page.evaluate(()=>{
return document.querySelector('div[class=“不是照片上传文本”]”);
});
if(noGallery!=null | | noGallery===未定义){
openOrNot=5;
}
如果(打开或不打开<4){
等待openGallery(第页);
}
让html=等待page.content();
等待fs.writeFile(`./saved_items/${filteredIds[id]。子字符串(filteredIds[id]。lastIndexOf('/')+1)}.html`,html,函数(err){
如果(错误)抛出错误;
});
等待页面。等待(400);
}
等待浏览器关闭();
})();
当承诺被拒绝且未被捕获时,将抛出“未处理的承诺拒绝错误”。如果在异步代码块内引发异常(如您的情况),则隐式地就是这种情况
要捕获抛出的异常,只需在循环中使用try..catch
块
代码示例
for(让id进入filteredIds){
试一试{
//你的代码
}捕捉(错误){
log(`iterationfor${id}失败,错误为:${err.message}`);
}
}
除了if(err)throw err之外,代码产生的所有错误都应该被此代码捕获
在fs.writeFile
中,因为此回调是异步调用的,因此在try..catch
块之外执行。但是你可以简单地告诉我们新的错误
在抛出错误的情况下,将调用脚本的catch(err){…}
部分来记录错误消息和发生错误的id
。由于脚本不再崩溃,循环将继续进行下一次迭代