Spaces:
No application file
No application file
import asyncio | |
import json | |
from pyppeteer import launch | |
async def compare_styles(url, container_selector): | |
browser = await launch() | |
page = await browser.newPage() | |
await page.goto(url) | |
container_element = await page.querySelector(container_selector) | |
if container_element: | |
await compare_element_styles(page, container_element, container_selector) | |
else: | |
print(f'Container element with selector "{container_selector}" not found.') | |
await browser.close() | |
async def compare_element_styles(page, element, identifier): | |
clone_selector = '__cloned_element__' | |
await page.evaluate(f'el => el.cloneNode(true)', element, force_expr=True) | |
await page.evaluate(f'el => {{ el.style.all = "unset"; el.setAttribute("id", "{clone_selector}"); }}', element, force_expr=True) | |
clone_handle = await page.querySelector(f'#{clone_selector}') | |
computed_styles = await element.executionContext().evaluate('(el) => JSON.stringify(getComputedStyle(el))', element) | |
clone_styles = await clone_handle.executionContext().evaluate('(el) => JSON.stringify(getComputedStyle(el))', clone_handle) | |
print(f'Here are the styles for element {identifier}:') | |
computed_styles_dict = json.loads(computed_styles) | |
clone_styles_dict = json.loads(clone_styles) | |
for style_property, actual_value in computed_styles_dict.items(): | |
clone_value = clone_styles_dict.get(style_property) | |
if actual_value != clone_value: | |
print(f'{style_property}: {actual_value}') | |
child_elements = await page.querySelectorAll(f'{element._remoteObject.description} > *') | |
for i, child_element in enumerate(child_elements): | |
await compare_element_styles(page, child_element, f'{identifier}.{i}') | |
url = input('Enter the URL of the webpage: ') | |
container_selector = input('Enter the container selector: ') | |
asyncio.get_event_loop().run_until_complete(compare_styles(url, container_selector)) | |