46 lines
1.9 KiB
Python
46 lines
1.9 KiB
Python
import asyncio
|
|
|
|
from playwright.async_api import ElementHandle
|
|
from playwright.async_api import Page
|
|
|
|
from Agent_E.ae.utils.logger import logger
|
|
|
|
|
|
async def wait_for_non_loading_dom_state(page: Page, max_wait_millis: int):
|
|
max_wait_seconds = max_wait_millis / 1000
|
|
end_time = asyncio.get_event_loop().time() + max_wait_seconds
|
|
while asyncio.get_event_loop().time() < end_time:
|
|
dom_state = await page.evaluate("document.readyState")
|
|
if dom_state != "loading":
|
|
logger.debug(f"DOM state is not 'loading': {dom_state}")
|
|
break # Exit the loop if the DOM state is not 'loading'
|
|
|
|
await asyncio.sleep(0.05)
|
|
|
|
|
|
async def get_element_outer_html(element: ElementHandle, page: Page, element_tag_name: str|None = None) -> str:
|
|
"""
|
|
Constructs the opening tag of an HTML element along with its attributes.
|
|
|
|
Args:
|
|
element (ElementHandle): The element to retrieve the opening tag for.
|
|
page (Page): The page object associated with the element.
|
|
element_tag_name (str, optional): The tag name of the element. Defaults to None. If not passed, it will be retrieved from the element.
|
|
|
|
Returns:
|
|
str: The opening tag of the HTML element, including a select set of attributes.
|
|
"""
|
|
tag_name: str = element_tag_name if element_tag_name else await page.evaluate("element => element.tagName.toLowerCase()", element)
|
|
|
|
attributes_of_interest: list[str] = ['id', 'name', 'aria-label', 'placeholder', 'href', 'src', 'aria-autocomplete', 'role', 'type',
|
|
'data-testid', 'value', 'selected', 'aria-labelledby', 'aria-describedby', 'aria-haspopup']
|
|
opening_tag: str = f'<{tag_name}'
|
|
|
|
for attr in attributes_of_interest:
|
|
value: str = await element.get_attribute(attr) # type: ignore
|
|
if value:
|
|
opening_tag += f' {attr}="{value}"'
|
|
opening_tag += '>'
|
|
|
|
return opening_tag
|