Pupeteer脚本卡住了

3
我正在编写一个脚本来查找注册商中的域名。我已经让它工作了,但出于某种原因,脚本在随机时间停止(在搜索2、4、10个域名后),我不知道为什么或如何进行调试。 我正在使用Puppeteer,但我非常非常新手,所以可能犯了一些基本错误。
到目前为止,脚本如下:
const puppeteer = require('puppeteer');
const DOMS = require('./dominios');

//Traemos los selectores de nic.ar

const SELECTOR_BUSQUEDA = '#edit-txtbuscar';
const SELECTOR_BOTON = '#btn-consultar-block-submit';
const SELECTOR_DNS = '#body > div.dialog-off-canvas-main-canvas > div.main-container.container.js-quickedit-main-content > div > section > div > div > div:nth-child(6) > table.tablaRespon3 > tbody > tr:nth-child(1) > td:nth-child(1)';

//Generamos las variables de busqueda

//Funcion principal

async function run() {
  const browser = await puppeteer.launch({
    args: ['--no-sandbox', '--disable-setuid-sandbox', 'headless:false']
  });
  let array_doms = [];
  let respuesta = "";
  array_doms = DOMS.Dominios;
  let bodyHandle;
  let resultado;
  const page = await browser.newPage();
  for (let i = 0; i < array_doms.length; i++) {
    await page.goto('https://nic.ar');
    await page.click(SELECTOR_BUSQUEDA);
    await page.keyboard.type(array_doms[i]);
    await page.click(SELECTOR_BOTON);
    await page.waitForNavigation();
    //Trae el selector de la tabla de resultados de la busqueda
    bodyHandle = await page.$('body > div.dialog-off-canvas-main-canvas > div.main-container.container.js-quickedit-main-content > div > section > div > div > div:nth-child(6) > table.tablaRespon3 > tbody > tr:nth-child(1) > td:nth-child(1)');
    resultado = await page.evaluate(body => body.innerHTML, bodyHandle);
    await bodyHandle.dispose();
    respuesta = "El dominio " + array_doms[i] + " apunta a " + resultado;
    console.log(respuesta);
  }
};

run();
~

我知道这段代码看起来很糟糕,但我还在学习中。


出于好奇,您的脚本是否在非无头模式下运行,您能看到浏览器启动并执行脚本的操作吗?因为我注意到您正在将 'headless:false' 传递给 args 键,但我认为正确的方法是将其作为单独的键/值对传递。即 puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'],headless: false }); - Cave Johnson
不,我看不到浏览器。而且我也不知道如何正确地传递参数给puppeteer.launch(),我只是从一些教程中复制了代码。 - El.Psy.Kongroo
1
好的,请尝试我在评论中发布的那个配置。那是我正在使用的配置,对我有效。 - Cave Johnson
1个回答

6
这两行代码可能存在竞态条件:
await page.click(SELECTOR_BOTON);
await page.waitForNavigation();

有时导航会在页面点击解析之前发生,有时会在此之后发生。为避免此效果,请尝试使用以下行替换这些行:
await Promise.all([
  page.click(SELECTOR_BOTON),
  page.waitForNavigation(),
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接