import click from browser_cli.client import send_command, BrowserNotConnected from rich.console import Console from rich.table import Table import json console = Console() def _handle(command, args=None): try: return send_command(command, args or {}) except BrowserNotConnected as e: console.print(f"[red]Error:[/red] {e}") raise SystemExit(1) except RuntimeError as e: console.print(f"[red]Browser error:[/red] {e}") raise SystemExit(1) @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)