javascript - Puppeteer:在评估()中记录 HTML DOM 对象
问题描述
当我运行 puppeteer 脚本时,如果我想在 page.evaluate 中做一个日志,我可以使用如下代码
page.on('console', consoleObj => console.log(consoleObj.text()));
不幸的是,如果我想记录一个对象,它就不起作用:
例如,下面的代码没有正确记录 js obj:
page.on("console", log => {
console[log._type](log.text());
});
await pageBis.evaluate(() => {
let selector = `select.form1 option[value="optionToSelect"]`;
let optionObj = document.querySelectorAll(selector)[0];
console.log(`optionObj : ${JSON.stringify(optionObj)}`);
});
它显示:
选项对象:{}
请问你知道怎么处理吗?
解决方案
问题
如果您about:blank
在默认浏览器上打开并运行以下命令,
console.log(JSON.stringify(document.querySelector('body')))
它会返回{}
,因为它试图将 HTML 元素转换为不可能的字符串。
解决方案:domjson
有很多方法可以做到这一点。您可以在浏览器中使用此类库,addScriptTag
并根据需要使用控制台输出或使用。
用法:
// add the script to the window like <script src="...">
await page.addScriptTag({url:"https://www.unpkg.com/domjson"})
// run the code inside browser, we have domJSON available on window now
await page.evaluate(()=>{
// use it
const bodyJson = domJSON.toJSON(document.querySelector('body'));
// log it
console.log(JSON.stringify(bodyJson, true, 2))
})
结果:
{
"meta": {
"href": "about:blank",
"userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36",
"version": "0.1.2",
"clock": 1,
"date": "2018-10-22T15:08:03.973Z",
"dimensions": {
"inner": {
"x": 1920,
"y": 476
},
"outer": {
"x": 1920,
"y": 993
}
},
...
domjson
最后一次在 npm 上发布是 4 年前,但仍然可以满足这个问题的需求,并且可能不会造成任何重大的安全问题,也没有外部依赖项。他们的 github 页面最近一次更新是 20 天前,有几个修复。
笔记:
推荐阅读
- android - 在 Android Studio 中添加外部库作为文件导致依赖错误
- dart - 如何在颤动中获取资产的文件路径?
- rest - HTTP PUT 不一定将新记录添加到后端
- ruby-on-rails - form_for 助手给了我一个错误,尽管它在那里
- libgdx - 粒子发射器的数量会影响性能吗?
- python-2.7 - 安装 tensorflow 时出现“没有名为队列的模块”
- identityserver4 - IdentityServer4 - 有没有办法在授权代码流中静默地对用户进行身份验证?
- java - Java 等到使用 Selenium 加载页面
- python - 如果我在 matplotlib 中有图形(或轴)列表,如何创建多个图?
- azure - Microsoft Azure 流分析和 Blob 存储输入