Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果页面中不存在DOM元素,如何移动到下一个迭代?_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript 如果页面中不存在DOM元素,如何移动到下一个迭代?

Javascript 如果页面中不存在DOM元素,如何移动到下一个迭代?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我想用木偶演员测试一下wepage的几个子页面。该网页对机器人有一定的防护。我将URL放在一个数组中,并遍历这个数组 我陷入了如何重新编写代码的困境,因为我遇到了几个问题:由于bot保护,页面在实际加载真实内容之前会向浏览器发送一些“假加载”状态。因此,我认为我必须等待一些DOM元素 await page.waitForSelector('div.site__content'); 以确保内容已加载。(wait page.evaluate因机器人程序保护而不工作,它在第一个“假加载”标志上触发)

我想用木偶演员测试一下wepage的几个子页面。该网页对机器人有一定的防护。我将URL放在一个数组中,并遍历这个数组

我陷入了如何重新编写代码的困境,因为我遇到了几个问题:由于bot保护,页面在实际加载真实内容之前会向浏览器发送一些“假加载”状态。因此,我认为我必须等待一些DOM元素

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
。由于脚本不再崩溃,循环将继续进行下一次迭代