"""DOM, content-extraction, and page-info namespaces: ``b.dom.*``, ``b.extract.*``, ``b.page.*``.""" from __future__ import annotations from browser_cli.sdk.base import Namespace, sdk_command def _selector_args(self, selector): return {"selector": selector} def _selector_value_args(self, selector, value): return {"selector": selector, "value": value} def _extract_markdown(self, result, *args, **kwargs) -> str: from browser_cli.markdown import render_markdown return render_markdown(result) class DomNS(Namespace): """Query and drive page elements in the active (or specified) tab.""" @sdk_command("dom.query", _selector_args, default=[]) def query(self, selector: str) -> list[dict]: """Return elements matching a CSS selector.""" @sdk_command("dom.click", _selector_args, return_result=False) def click(self, selector: str) -> None: """Click the first element matching a CSS selector.""" @sdk_command("dom.type", lambda self, selector, text: {"selector": selector, "text": text}, return_result=False) def type(self, selector: str, text: str) -> None: """Type text into the first matching element.""" @sdk_command("dom.attr", lambda self, selector, attr: {"selector": selector, "attr": attr}, default=[]) def attr(self, selector: str, attr: str) -> list[str]: """Return an attribute from all matching elements.""" @sdk_command("dom.text", _selector_args, default=[]) def text(self, selector: str) -> list[str]: """Return text from all matching elements.""" @sdk_command("dom.exists", _selector_args, default=False) def exists(self, selector: str) -> bool: """Return whether a selector exists.""" @sdk_command("dom.scroll", lambda self, selector=None, *, x=None, y=None: {"selector": selector, "x": x, "y": y}, return_result=False) def scroll(self, selector: str | None = None, *, x: int | None = None, y: int | None = None) -> None: """Scroll to a CSS selector or to pixel coordinates.""" @sdk_command("dom.select", _selector_value_args, return_result=False) def select(self, selector: str, value: str) -> None: """Set the value of a