javascript-人偶执行上下文被破坏,很可能是由于导航
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-人偶执行上下文被破坏,很可能是由于导航,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3234字,纯文字阅读大概需要5分钟。
内容图文
![javascript-人偶执行上下文被破坏,很可能是由于导航](/upload/InfoBanner/zyjiaocheng/695/7c885f085486486881d336f7a7d59243.jpg)
当我在另一页上获取数据时,我会在for循环中的puppeteer中遇到此问题,然后当我返回时,出现此错误行:
Error "We have an error Error: the execution context was destroyed, probably because of a navigation."
这是一个目录页面,每页包含15个公司,然后我要访问每个公司以获取信息.
try {
const browser = await pupputer.launch({
headless: false,
devtools: true,
defaultViewport: {
width: 1100,
height: 1000
}
});
const page = await browser.newPage();
await page.goto('MyLink');
await page.waitForSelector('.list-firms');
for (var i = 1; i < 10; i++) {
const listeCompanies = await page.$$('.list-firms > div.firm');
for (const companie of listeCompanies) {
const name = await companie.$eval('.listing-body > h3 > a', name => name.innerText);
const link = await companie.$eval('.listing-body > h3 > a', link => link.href);
await Promise.all([
page.waitForNavigation(),
page.goto(link),
page.waitForSelector('.firm-panel'),
]);
const info = await page.$eval('#info', e => e.innerText);
const data = [{
name: name,
information: info,
}];
await page.goBack();
}
await Promise.all([
page.waitForNavigation(),
page.click('span.page > a[rel="next"]')
]);
}
} catch (e) {
console.log('We have error', e);
}
我设法只获得了第一家公司的数据.
解决方法:
问题
该错误表示您正在访问由于导航而变得过时/无效的数据.在您的脚本中,错误引用了变量listeCompanies:
const listeCompanies = await page.$$('.list-firms > div.firm');
首先,在循环中使用此变量,然后通过page.goto导航,然后循环尝试从变量listeCompanies中获取下一项.但是在导航发生之后,该变量中的元素句柄不再存在,因此引发了错误.这就是为什么第一次迭代有效的原因.
解
有多种解决方法.
>一次从您的页面提取数据(使用循环之前)
>使用第二页进行“循环导航”,以便您的主页无需导航
>通过在调用page.goBack后重新执行选择器来“刷新”变量
选项1:在进入循环之前提取数据
这是最干净的方法.您一次提取第一页中的信息,然后遍历提取的数据. nameLinkList将是一个具有名称和链接值的数组(例如[{{name:’..’,link:’..’},{name:’..’,link:’..’}]]).由于已经提取了数据,因此也不需要在循环末尾调用page.goBack.
const nameLinkList = await page.$$eval(
'.list-firms > div.firm',
(firms => firms.map(firm => {
const a = firm.querySelector('.listing-body > h3 > a');
return {
name: a.innerText,
link: a.href
};
}))
);
for (const {name, link} of arr) {
await Promise.all([
page.waitForNavigation(),
page.goto(link),
page.waitForSelector('.firm-panel'),
]);
const info = await page.$eval('#info', e => e.innerText);
const data = [{
name: name,
information: info,
}];
}
选项2:使用第二页
在这种情况下,您的浏览器将有两个打开的页面.第一个仅用于读取数据,第二个用于导航.
const page2 = await browser.newPage();
for (const companie of listeCompanies ){
const name = await companie.$eval('.listing-body > h3 > a', name => name.innerText);
const link = await companie.$eval('.listing-body > h3 > a', link => link.href);
await Promise.all([
page2.goto(link),
page2.waitForSelector('.firm-panel'),
]);
const info = await page2.$eval('#info', e => e.innerText);
// ...
}
选项3:“刷新”选择器
返回“主页”后,您只需在这里重新执行选择器即可.注意,在替换数组时,必须将for..of更改为迭代器循环.
let listeCompanies = await page.$$('.list-firms > div.firm');
for (let i = 0; i < listeCompanies.length; i++){
// ...
await page.goBack();
listeCompanies = await page.$$('.list-firms > div.firm');
}
我建议选择选项1,因为这也减少了必要的导航请求,因此可以加快脚本的速度.
内容总结
以上是互联网集市为您收集整理的javascript-人偶执行上下文被破坏,很可能是由于导航全部内容,希望文章能够帮你解决javascript-人偶执行上下文被破坏,很可能是由于导航所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。