加载 html 到 chrome 然后是 jsdom 实例

Loading html into chrome followed by jsdom instance

收到来自 api 的 html 后,我正在做一些 scraping。我想执行以下操作:

  1. 在 chrome 中打开 html 页面,以便我可以在控制台中找到选择器。
  2. 立即将相同的 html 页面加载到 jsdom 实例中
  3. 进入 repl - 然后我可以在控制台中找到正确的选择器并在实时 jsdom 环境中测试它们是否有效。

对于 1,我有:

async function openHtml(htmlString) {

const browser = await puppeteer.launch({headless: false});
 const page = await browser.newPage();
await page.setContent(htmlString);
return;
// await browser.close();
}

api 提供的代码是:

var req = http.request(options, function (res) {
  var chunks = [];
  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);

    response = JSON.parse(body); //response.content = html, response.cookies = cookies

    const dom = new JSDOM(response.content);
    console.log(dom.window.document.querySelector("p").textContent); // "Hello world"

    openHtml(response.content);
    console.log('hi');
  });

});

req.end();

如果我 运行 命令行中的代码,浏览器将按预期打开。但是,如果我在以下位置设置断点:

    console.log('hi');

没有。我怎样才能让它工作?

openHtml 是一个异步函数。因此,您必须将 await (promise) 中的方法调用和 main 函数也设置为异步。

var req = http.request(options, function (res) {
    var chunks = []
    res.on('data', function (chunk) {
        chunks.push(chunk)
    })

    res.on('end', async function () {
        var body = Buffer.concat(chunks)

        response = JSON.parse(body) //response.content = html, response.cookies = cookies

        const dom = new JSDOM(response.content)
        console.log(dom.window.document.querySelector('p').textContent) // 'Hello world'

        await openHtml(response.content)
        console.log('hi')
    })

})

req.end()