Files
browser-cli/examples/demo.py
T
2026-04-08 21:17:59 +02:00

108 lines
4.0 KiB
Python

"""
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" <h1> {h}")
else:
print(" No <h1> 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!")