首页 > 解决方案 > 带有 try catch puppeteer 的无限循环

问题描述

我有这段代码,我使用 Pupperteer 保存 Bing 图像的 URL,我有一个产品名称数组,我一直在循环内使用 Try catch 搜索以获取这些 URL,但我有一个问题,我想要它没有'找不到产品(它没有找到结果)它会跳转到数组中的下一个项目,但它什么也不做,Pupperteer 关闭浏览器进入 Try catch 的最后,没有指出任何错误. 我的逻辑似乎是正确的,有人可以帮我解决这个问题吗?我已经尝试了一切

index.js

const fs = require("fs");
const puppeteer = require("puppeteer-core");

(async () => {
  const browser = await puppeteer.launch({
    executablePath:
      "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
    headless: true,
    timeout: 0,
  });

  const page = await browser.newPage();
  await page.setDefaultNavigationTimeout(0);

  let results = new Array();

  const arr = [
    {
      ID: 6011,
      Nome: "BRA MASCARA BIGODE Q2321(KRIAT 13726)",
      Imagens: "",
    },
    {
      ID: 6012,
      Nome: "BRA MASCARA CAVEIRA ASSUSTADORA 1UN",
      Imagens: "",
    },
    {
      ID: 6013,
      Nome: "BRA MASCARA CAVEIRA PLASTICA  1UN",
      Imagens: "",
    }
   ];

  await page.goto(`https://www.bing.com/search?q=Hello world`);

  await page.waitForSelector("#bnp_btn_accept", { visible: true });

  await page.evaluate(() => {
    const btn = document.getElementById("bnp_btn_accept");
    if (btn) {
      btn.click();
    }
  });

  let cont = 0;

  try {
    for (cont; cont < arr.length; ) {
      let image;

      await page.goto(`https://www.bing.com/search?q=${arr[cont].Nome}`);

      await page.waitForTimeout(3000);
      await page.waitForSelector("#b-scopeListItem-images", { visible: true });

      await page.evaluate(() => {
        const imageBtn = document.getElementById("b-scopeListItem-images");
        imageBtn?.children[0]?.click();
      });

      await page.waitForTimeout(3000);
      await page.waitForSelector(".iusc", { visible: true });

      await page
        .evaluate(() => {
          const firstImage = JSON.parse(
            document.getElementsByClassName("iusc")[0].getAttribute("m")
          ).turl;
          const semResultado = document.getElementById("dg_nr");
          if (semResultado) {
            console.log("Não tem resultado");
          } else {
            return firstImage;
          }
        })
        .then(async (res) => {
          arr[cont].Imagens = await res;

          results.push(arr[cont]);

          var stream = fs.createWriteStream("results.json");
          stream.once("open", function (fd) {
            stream.write(JSON.stringify(results));
            stream.end();
          });

          console.log("Produto " + cont + " adicionado no Arquivo");
          cont++;
        })
        .catch((err) => {
          console.log("O Produto " + cont + " deu algum erro: " + err);
          cont++;
        });
    }
  } catch (err) {
    cont++;
  } finally {
    var stream = fs.createWriteStream("results.json");
    stream.once("open", function (fd) {
      stream.write(JSON.stringify(results));
      stream.end();
    });

    await browser.close();
  }
})();

固定的:

const fs = require("fs");
const puppeteer = require("puppeteer-core");

(async () => {
  const browser = await puppeteer.launch({
    executablePath:
      "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
    headless: true,
    timeout: 0,
  });

  const page = await browser.newPage();
  await page.setDefaultNavigationTimeout(0);

  let results = new Array();

  const arr = [
    {
      ID: 6011,
      Nome: "BRA MASCARA BIGODE Q2321(KRIAT 13726)",
      Imagens: "",
    },
    {
      ID: 6012,
      Nome: "BRA MASCARA CAVEIRA ASSUSTADORA 1UN",
      Imagens: "",
    },
    {
      ID: 6013,
      Nome: "BRA MASCARA CAVEIRA PLASTICA  1UN",
      Imagens: "",
    }
   ];

  await page.goto(`https://www.bing.com/search?q=Hello world`);

  await page.waitForSelector("#bnp_btn_accept", { visible: true });

  await page.evaluate(() => {
    const btn = document.getElementById("bnp_btn_accept");
    if (btn) {
      btn.click();
    }
  });

  let cont = 0;

  try {
    for (cont; cont < arr.length; ) {
      let image;

      await page.goto(`https://www.bing.com/search?q=${arr[cont].Nome}`);

      await page.waitForTimeout(3000);
      await page.waitForSelector("#b-scopeListItem-images", { visible: true });

      await page.evaluate(() => {
        const imageBtn = document.getElementById("b-scopeListItem-images");
        imageBtn?.children[0]?.click();
      });

      await page.waitForTimeout(3000);
      await page.waitForSelector(".iusc", { visible: true }).catch(() => {
         cont++;
      });

      await page
        .evaluate(() => {
          const firstImage = JSON.parse(
            document.getElementsByClassName("iusc")[0].getAttribute("m")
          ).turl;
          const semResultado = document.getElementById("dg_nr");
          if (semResultado) {
            console.log("Não tem resultado");
          } else {
            return firstImage;
          }
        })
        .then(async (res) => {
          arr[cont].Imagens = await res;

          results.push(arr[cont]);

          var stream = fs.createWriteStream("results.json");
          stream.once("open", function (fd) {
            stream.write(JSON.stringify(results));
            stream.end();
          });

          console.log("Produto " + cont + " adicionado no Arquivo");
          cont++;
        })
        .catch((err) => {
          console.log("O Produto " + cont + " deu algum erro: " + err);
          cont++;
        });
    }
  } finally {
    var stream = fs.createWriteStream("results.json");
    stream.once("open", function (fd) {
      stream.write(JSON.stringify(results));
      stream.end();
    });

    await browser.close();
  }
})();

标签: javascripttry-catch

解决方案


推荐阅读