90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
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)
|