使用木偶师注入脚本时获得"Execution context was destroyed"



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

完整错误为:

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。尝试仅使用连续的awaits
  2. 您不需要page.waitForNavigation()page.goto(),这是隐含的,两者都可以挂起流
  3. page.goto()等待暗示身体存在的'load'事件时,page.waitForSelector('body')也显得过度
  4. 如果你在每一页中都需要addScriptTag(),可以考虑使用page.evaluateOnNewDocument(),但我在这里不确定
  5. 我怀疑page.addScriptTag()是否可以同时使用pathcontent选项

相关内容

最新更新