|
|
from dataclasses import dataclass |
|
|
from typing import TYPE_CHECKING, Optional |
|
|
|
|
|
from pydantic import BaseModel |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class HashedDomElement: |
|
|
""" |
|
|
Hash of the dom element to be used as a unique identifier |
|
|
""" |
|
|
|
|
|
branch_path_hash: str |
|
|
attributes_hash: str |
|
|
xpath_hash: str |
|
|
|
|
|
|
|
|
|
|
|
class Coordinates(BaseModel): |
|
|
x: int |
|
|
y: int |
|
|
|
|
|
|
|
|
class CoordinateSet(BaseModel): |
|
|
top_left: Coordinates |
|
|
top_right: Coordinates |
|
|
bottom_left: Coordinates |
|
|
bottom_right: Coordinates |
|
|
center: Coordinates |
|
|
width: int |
|
|
height: int |
|
|
|
|
|
|
|
|
class ViewportInfo(BaseModel): |
|
|
scroll_x: int |
|
|
scroll_y: int |
|
|
width: int |
|
|
height: int |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class DOMHistoryElement: |
|
|
tag_name: str |
|
|
xpath: str |
|
|
highlight_index: Optional[int] |
|
|
entire_parent_branch_path: list[str] |
|
|
attributes: dict[str, str] |
|
|
shadow_root: bool = False |
|
|
css_selector: Optional[str] = None |
|
|
page_coordinates: Optional[CoordinateSet] = None |
|
|
viewport_coordinates: Optional[CoordinateSet] = None |
|
|
viewport_info: Optional[ViewportInfo] = None |
|
|
|
|
|
def to_dict(self) -> dict: |
|
|
page_coordinates = self.page_coordinates.model_dump() if self.page_coordinates else None |
|
|
viewport_coordinates = self.viewport_coordinates.model_dump() if self.viewport_coordinates else None |
|
|
viewport_info = self.viewport_info.model_dump() if self.viewport_info else None |
|
|
|
|
|
return { |
|
|
'tag_name': self.tag_name, |
|
|
'xpath': self.xpath, |
|
|
'highlight_index': self.highlight_index, |
|
|
'entire_parent_branch_path': self.entire_parent_branch_path, |
|
|
'attributes': self.attributes, |
|
|
'shadow_root': self.shadow_root, |
|
|
'css_selector': self.css_selector, |
|
|
'page_coordinates': page_coordinates, |
|
|
'viewport_coordinates': viewport_coordinates, |
|
|
'viewport_info': viewport_info, |
|
|
} |
|
|
|