puppeteer - 检查所有要加载的帧
问题描述
我想检查页面上的所有框架是否都已加载。我不太明白这一点,其中一部分是我不完全理解框架事件(特别是什么时候发生frameattached
和framenavigated
事件触发?)。
这是我现在正在做的事情,但我多次绑定到同一个页面事件而不是框架事件。
function waitForFrames() {
return Promise.all(page.frames().map((frame) => {
return new Promise(resolve => {
page.on('framenavigated', resolve);
});
})).then(() => {
console.log('Frames loaded');
})
.catch(e => {
console.log(e.message);
});
}
如何检查是否已加载所有帧?
解决方案
Frame 类的Puppeteer 文档有助于解释帧事件:
类别:框架
在每个时间点,页面都会通过
page.mainFrame()
和frame.childFrames()
方法公开其当前的框架树。Frame对象的生命周期由三个事件控制,在页面对象上分派:
'frameattached'
- 当框架附加到页面时触发。框架只能附加到页面一次。'framenavigated'
- 当框架提交导航到不同的 URL 时触发。'framedetached'
- 当框架与页面分离时触发。框架只能从页面分离一次。
您可以使用以下函数等待一帧(按名称):
const wait_for_frame = (page, frame_name) => {
let fulfill_promise;
const promise = new Promise(x => fulfill_promise = x);
check_frame();
return promise;
const check_frame = () => {
const frame = page.frames().find(current_frame => current_frame.name() === frame_name);
if (frame) {
fulfill_promise(frame);
} else {
page.once('frameattached', check_frame);
}
};
};
// Waiting for frame to become attached:
const frame = await wait_for_frame(page, frame_name);
// Waiting for frame to contain a certain selector:
await frame.waitForSelector(selector);
const button = await frame.$(selector);
button.click();
上面的代码片段受以下来源的影响和改进:Source。
最后,您可以await
逐个循环播放帧。
推荐阅读
- node.js - package.json 依赖插入符号
- sql - 有人可以检查我的实体关系图是否正确吗?
- html - 如何避免在打印时使用行跨度的表格中的分页符
- mysql - Mysql MariaDB 不适用于远程连接
- ios - Nativescript iOS 委托 listView(延迟加载?)
- python - 尽管文档中提到了,但 Python 中的 xgboost 并未返回功能的重要性
- java - Java 泛型:对象映射器将 JSON 转换为 Java 对象
- php - 使用 JQuery 发送部分表单数据
- c# - Visual Studio 中的 MVVM - 如何从我的 Microsoft SQL 表中读取到 ac# viewmodel
- reactjs - 如何解决在reactjs中未安装组件警告上无法调用setState(或forceUpdate)?