Если вы не возражаете против упорядочения элементов, вы можете создать массив всех элементов, используя простой селектор body *
и цикл.
Сначала давайте абстрагируем экстрактор стилей, потому что мы будемиспользуя одно и то же несколько раз.
// get the styles for particular element
// apply all kind of JSON filtering here
function getElementStyles(elem) {
return JSON.parse(JSON.stringify(getComputedStyle(elem)))
}
// this will generate a single array containing all elements
function getStyleArray(selector) {
const styles = []
const allElements = document.querySelectorAll(selector)
for (const element of allElements) {
const style = getElementStyles(element)
styles.push(style)
}
return styles;
}
//usage
getStyleArray('body *')
Если вы хотите получить дерево, для этого уже есть несколько библиотек.Это, как говорится, вот как вы можете повторить один самостоятельно.Я использовал рекурсию, чтобы пройти через это.
// find if element is an element :D
function isElement(element) {
return element instanceof Element || element instanceof HTMLDocument;
}
// this will generate a tree style array
// all child elements are accesible using the child key
function getChildStyles(elem) {
const childStyles = []
for (let childNode of elem.childNodes) {
if (isElement(childNode)) {
const singleChildStyle = getElementStyles(childNode)
// recursion
if (childNode.hasChildNodes()) {
singleChildStyle.child = getChildStyles(childNode)
}
childStyles.push(singleChildStyle)
}
}
return childStyles
}
// usage
getChildStyles(document.body)
Обратите внимание,
- , что это можно улучшить, используя лучшие циклы и другие методы сортировки / поиска.
- это будет стоить вам много времени, если на странице много элементов.
Результат: ![enter image description here](https://i.stack.imgur.com/Se1Z6.png)
Это работает !!!
Давайте применим на кукловода, вы можете просто скопировать, вставить их или использовать addScriptTag .
await page.evaluate(() => {
// add the scripts we created somewhere and then use them here
return {
arrayBased: getStyleArray('body *'),
treeBased: getChildStyles(document.body)
}
})