""" browser-cli Python API demo ---------------------------- Shows how to manage your running browser from a Python script. Run with: uv run python examples/demo.py """ from browser_cli import BrowserCLI b = BrowserCLI() # ── 1. See what's open ──────────────────────────────────────────────────────── print("=== Open tabs ===") tabs = b.tabs_list() for tab in tabs: active = " <-- active" if tab["active"] else "" print(f" [{tab['id']}] (window {tab['windowId']}) {tab['title'][:50]}{active}") # ── 2. Count tabs per domain ────────────────────────────────────────────────── print("\n=== Tabs per domain ===") from urllib.parse import urlparse from collections import Counter domains = Counter( urlparse(t["url"]).netloc for t in tabs if t.get("url") and not t["url"].startswith("chrome") ) for domain, count in domains.most_common(5): print(f" {count:>3}x {domain}") # ── 3. Open a group and add tabs to it ─────────────────────────────────────── print("\n=== Creating 'demo' tab group ===") group = b.group_open("demo") group_id = group["id"] print(f" Created group id: {group_id}") urls = [ "https://example.com", "https://wikipedia.org", ] first_tab_id = None for url in urls: b.open(url, background=True) # find the tab we just opened and move it into the group fresh = b.tabs_list() new_tab = next((t for t in reversed(fresh) if t.get("url", "").startswith(url[:20])), None) if new_tab: b.tabs_move(new_tab["id"], group_id=group_id) print(f" Added {url} → tab {new_tab['id']}") if first_tab_id is None: first_tab_id = new_tab["id"] # Activate the first opened tab so DOM/extract have a real page to work with if first_tab_id: b.tabs_active(first_tab_id) print(f" Switched to tab {first_tab_id} for DOM demo") # ── 4. Extract links from the active tab ───────────────────────────────────── # Re-fetch tabs so we have the current active tab (it may have changed) current_tabs = b.tabs_list() active_tab = next((t for t in current_tabs if t.get("active")), None) active_url = active_tab.get("url", "") if active_tab else "" scriptable = active_url.startswith("http://") or active_url.startswith("https://") print("\n=== Links on active tab ===") if not scriptable: print(f" Skipped — active tab is {active_url!r} (not a web page)") else: links = b.extract_links() for link in links[:5]: print(f" {link['text'][:30]:<32} {link['href'][:60]}") if len(links) > 5: print(f" ... and {len(links) - 5} more") # ── 5. Check if an element exists, then read its text ──────────────────────── print("\n=== DOM: page heading ===") if not scriptable: print(f" Skipped — active tab is {active_url!r} (not a web page)") elif b.dom_exists("h1"): headings = b.dom_text("h1") for h in headings: print(f"

{h}") else: print(" No

found on active tab") # ── 6. Save current session and show how to restore ────────────────────────── print("\n=== Saving session as 'demo-session' ===") result = b.session_save("demo-session") print(f" Saved {result['tabs']} tabs") print(" Restore later with: b.session_load('demo-session')") # ── 7. Clean up: close inactive tabs ───────────────────────────────────────── print("\n=== Closing duplicate tabs ===") result = b.tabs_close_duplicates() closed = result.get("closed", 0) if isinstance(result, dict) else 0 print(f" Closed {closed} duplicate tab(s)") print("\nDone!")