1c5fd0ffee
Navigation: open-wait (open + block until loaded) DOM: key, hover, check/uncheck, clear, focus, submit, poll, scroll, select, eval, wait-for Tabs: pin/unpin, screenshot, watch-url (block until URL matches regex) New command groups: page info, storage get/set, cookies list/get/set Extension: add cookies permission
107 lines
4.1 KiB
Python
107 lines
4.1 KiB
Python
import click
|
|
from browser_cli.client import send_command, BrowserNotConnected
|
|
from rich.console import Console
|
|
|
|
console = Console()
|
|
|
|
|
|
def _handle(command, args):
|
|
try:
|
|
return send_command(command, args)
|
|
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("nav")
|
|
def nav_group():
|
|
"""Navigate — open URLs, reload, go back/forward, focus tabs."""
|
|
|
|
|
|
@nav_group.command("open")
|
|
@click.argument("url")
|
|
@click.option("--bg", is_flag=True, help="Open in background (no focus)")
|
|
@click.option("--window", "window_name", default=None, help="Open in named window")
|
|
@click.option("--group", "group_name", default=None, help="Open directly into a tab group (name or ID)")
|
|
def cmd_open(url, bg, window_name, group_name):
|
|
"""Open URL in a new tab."""
|
|
_handle("navigate.open", {"url": url, "background": bg, "window": window_name, "group": group_name})
|
|
suffix = ""
|
|
if group_name:
|
|
suffix = f" in group '{group_name}'"
|
|
elif window_name:
|
|
suffix = f" in window '{window_name}'"
|
|
console.print(f"[green]Opened:[/green] {url}{suffix}")
|
|
|
|
|
|
@nav_group.command("reload")
|
|
@click.argument("tab_id", type=int, required=False)
|
|
def cmd_reload(tab_id):
|
|
"""Reload the active (or specified) tab."""
|
|
_handle("navigate.reload", {"tabId": tab_id})
|
|
console.print("[green]Reloaded[/green]")
|
|
|
|
|
|
@nav_group.command("hard-reload")
|
|
@click.argument("tab_id", type=int, required=False)
|
|
def cmd_hard_reload(tab_id):
|
|
"""Hard reload (bypass cache) the active (or specified) tab."""
|
|
_handle("navigate.hard_reload", {"tabId": tab_id})
|
|
console.print("[green]Hard reloaded[/green]")
|
|
|
|
|
|
@nav_group.command("back")
|
|
@click.argument("tab_id", type=int, required=False)
|
|
def cmd_back(tab_id):
|
|
"""Navigate back in the active (or specified) tab."""
|
|
_handle("navigate.back", {"tabId": tab_id})
|
|
console.print("[green]Navigated back[/green]")
|
|
|
|
|
|
@nav_group.command("forward")
|
|
@click.argument("tab_id", type=int, required=False)
|
|
def cmd_forward(tab_id):
|
|
"""Navigate forward in the active (or specified) tab."""
|
|
_handle("navigate.forward", {"tabId": tab_id})
|
|
console.print("[green]Navigated forward[/green]")
|
|
|
|
|
|
@nav_group.command("focus")
|
|
@click.argument("pattern")
|
|
def cmd_focus(pattern):
|
|
"""Jump to a tab by URL pattern or tab ID."""
|
|
result = _handle("navigate.focus", {"pattern": pattern})
|
|
if result:
|
|
console.print(f"[green]Focused:[/green] {result.get('url', result)}")
|
|
else:
|
|
console.print(f"[yellow]No tab found matching:[/yellow] {pattern}")
|
|
|
|
|
|
@nav_group.command("open-wait")
|
|
@click.argument("url")
|
|
@click.option("--timeout", type=float, default=30.0, show_default=True, help="Max seconds to wait for load")
|
|
@click.option("--bg", is_flag=True, help="Open in background (no focus)")
|
|
@click.option("--window", "window_name", default=None, help="Open in named window")
|
|
@click.option("--group", "group_name", default=None, help="Open in tab group")
|
|
def cmd_open_wait(url, timeout, bg, window_name, group_name):
|
|
"""Open URL in a new tab and wait until fully loaded."""
|
|
result = _handle("navigate.open_wait", {
|
|
"url": url, "timeout": int(timeout * 1000),
|
|
"background": bg, "window": window_name, "group": group_name,
|
|
})
|
|
title = result.get("title", "") if isinstance(result, dict) else ""
|
|
console.print(f"[green]Loaded:[/green] {url}" + (f" — {title}" if title else ""))
|
|
|
|
|
|
@nav_group.command("wait")
|
|
@click.option("--tab", "tab_id", type=int, default=None, help="Tab ID (default: active tab)")
|
|
@click.option("--timeout", type=float, default=30.0, show_default=True, help="Max seconds to wait")
|
|
@click.option("--ready-state", type=click.Choice(["complete", "interactive"]), default="complete", show_default=True, help="Target ready state")
|
|
def cmd_wait(tab_id, timeout, ready_state):
|
|
"""Wait until tab finishes loading."""
|
|
result = _handle("navigate.wait", {"tabId": tab_id, "timeout": int(timeout * 1000), "readyState": ready_state})
|
|
console.print(f"[green]Ready:[/green] {result.get('url', '')} — {result.get('title', '')}")
|