Проблема
Если вы откроете about:blank
в браузере по умолчанию и запустите следующее,
console.log(JSON.stringify(document.querySelector('body')))
, и он вернет {}
, потому что он пытается преобразовать элемент HTMLв строку, которая невозможна.
Существует множество способов сделать это.Вы можете использовать такую библиотеку из браузера с 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 дней назад с несколькими исправлениями.
Примечание:
- Есть несколько других модулей для работы с dom, таких как jsdom и т. Д.
- Что бы вы ни делали внутри
.evaluate
, оно запускается в контексте браузера . - Что бы вы ни делали вне этого, оно будет работать в контексте nodeJS .Поэтому вам придется относиться к ним по-разному.Подробнее о контексте здесь .
- DOM означает HTML DOM (объектная модель документа) , он (только) доступен внутри браузера, поэтому лучше его использоватьтам, если это возможно.