[英]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
);
};
我在这里到底做错了什么?
Promise.all
用于连续任务。 尝试只使用连续的await
s。page.waitForNavigation()
和page.goto()
,这是暗示的,两者都可能挂起流程。page.waitForSelector('body')
似乎也过分了,因为page.goto()
等待意味着存在 body 的'load'
事件。addScriptTag()
,请考虑使用page.evaluateOnNewDocument()
,但我不确定这里。page.addScriptTag()
可以同时使用path
和content
选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.