import click from browser_cli.commands import _handle from rich.console import Console from rich.table import Table import json console = Console() @click.group("dom") def dom_group(): """Query and interact with page DOM elements.""" @dom_group.command("query") @click.argument("selector") def dom_query(selector): """Return elements matching CSS SELECTOR (like mini DevTools).""" elements = _handle("dom.query", {"selector": selector}) if not elements: console.print("[yellow]No elements found[/yellow]") return table = Table(show_header=True, header_style="bold cyan") table.add_column("Tag", width=12) table.add_column("Text", width=40) table.add_column("Attributes") for el in elements: attrs = ", ".join(f"{k}={v!r}" for k, v in (el.get("attrs") or {}).items()) table.add_row(el.get("tag", ""), (el.get("text") or "")[:60], attrs[:80]) console.print(table) @dom_group.command("click") @click.argument("selector") def dom_click(selector): """Click the first element matching CSS SELECTOR.""" _handle("dom.click", {"selector": selector}) console.print(f"[green]Clicked:[/green] {selector}") @dom_group.command("type") @click.argument("selector") @click.argument("text") def dom_type(selector, text): """Type TEXT into the element matching CSS SELECTOR.""" _handle("dom.type", {"selector": selector, "text": text}) console.print(f"[green]Typed into:[/green] {selector}") @dom_group.command("attr") @click.argument("selector") @click.argument("attr_name") def dom_attr(selector, attr_name): """Get attribute ATTR_NAME from elements matching CSS SELECTOR.""" values = _handle("dom.attr", {"selector": selector, "attr": attr_name}) for v in (values or []): console.print(v) @dom_group.command("text") @click.argument("selector") def dom_text(selector): """Get text content of elements matching CSS SELECTOR.""" values = _handle("dom.text", {"selector": selector}) for v in (values or []): console.print(v) @dom_group.command("exists") @click.argument("selector") def dom_exists(selector): """Check if an element matching CSS SELECTOR exists on the page.""" exists = _handle("dom.exists", {"selector": selector}) if exists: console.print(f"[green]exists[/green]: {selector}") else: console.print(f"[red]not found[/red]: {selector}") raise SystemExit(1) @dom_group.command("scroll") @click.argument("selector", required=False) @click.option("--x", type=int, default=None, help="Horizontal scroll position (px)") @click.option("--y", type=int, default=None, help="Vertical scroll position (px)") def dom_scroll(selector, x, y): """Scroll to a CSS SELECTOR or to an X/Y coordinate.""" _handle("dom.scroll", {"selector": selector, "x": x, "y": y}) target = selector or f"({x or 0}, {y or 0})" console.print(f"[green]Scrolled to:[/green] {target}") @dom_group.command("select") @click.argument("selector") @click.argument("value") def dom_select(selector, value): """Set the VALUE of a