繁体   English   中英

使用 Puppeteer 注入脚本时获取“执行上下文被破坏”

[英]Getting “Execution context was destroyed” when injecting scripts with Puppeteer

我正在尝试通过 Puppeteer 加载页面列表并注入两个从中获取内容的脚本。

完整的错误是:

Error: Execution context was destroyed, most likely because of navigation.

我将page.addScriptTag()添加到Promise.all() 这似乎使抓取失败。

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    args: [],
  });
  const page = await browser.newPage();
  page.setRequestInterception(true);
  page.setDefaultNavigationTimeout(0);
  for (const url of links) {
    await retry(
      () =>
        Promise.all([
          page.goto(siteUrl + url),
          page.waitForNavigation(),
          page.waitForSelector('body'),
          page.addScriptTag({ path: 'util.js' }),
          page.addScriptTag({
            path: 'scrape.js',
            content: `const url = ${url}`,
          }),
        ])
          .then(() => {
            init(page, url, siteUrl);
          })
          .catch((err) => console.log(err)),
      5
    );
  }
})();

init()只是为了运行和评估,这是我运行注入脚本中的函数的地方。

const init = async (page, url, siteUrl) => {
  return await page.evaluate(
    async (url, siteUrl) => {
      console.log('ev ', url, siteUrl);
      //Not doing anything here yet. 
    
    },
    url,
    siteUrl
  );
};

我在这里到底做错了什么?

  1. 我认为不需要将Promise.all用于连续任务。 尝试只使用连续的await s。
  2. 您不需要page.waitForNavigation()page.goto() ,这是暗示的,两者都可能挂起流程。
  3. page.waitForSelector('body')似乎也过分了,因为page.goto()等待意味着存在 body 的'load'事件。
  4. 如果您在每个页面中都需要addScriptTag() ,请考虑使用page.evaluateOnNewDocument() ,但我不确定这里。
  5. 我怀疑page.addScriptTag()可以同时使用pathcontent选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM