Installation
Copy
pip install selenium requests
Python Quick Start
Python
Copy
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import requests
import os
# Create Browser Cash session
resp = requests.post(
"https://api.browser.cash/v1/browser/session",
headers={
"Authorization": f"Bearer {os.getenv('BROWSER_API_KEY')}",
"Content-Type": "application/json",
},
json={}
)
resp.raise_for_status()
data = resp.json()
cdp_url = data["cdpUrl"]
session_id = data["sessionId"]
# Connect Selenium via CDP
options = Options()
options.add_experimental_option(
"debuggerAddress",
cdp_url.replace("wss://", "").replace("ws://", "").split("/")[0]
)
driver = webdriver.Chrome(options=options)
# Automate
driver.get("https://example.com")
print(driver.title)
# Cleanup
driver.quit()
requests.delete(
"https://api.browser.cash/v1/browser/session",
headers={"Authorization": f"Bearer {os.getenv('BROWSER_API_KEY')}"},
params={"sessionId": session_id}
)
With Session Options
Python
Copy
resp = requests.post(
"https://api.browser.cash/v1/browser/session",
headers={
"Authorization": f"Bearer {os.getenv('BROWSER_API_KEY')}",
"Content-Type": "application/json",
},
json={
"country": "US",
"type": "hosted",
"windowSize": "1920x1080"
}
)
Finding Elements
Python
Copy
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wait for element
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myElement"))
)
# Find by CSS selector
buttons = driver.find_elements(By.CSS_SELECTOR, "button.primary")
# Find by XPath
link = driver.find_element(By.XPATH, "//a[@href='/login']")
Taking Screenshots
Python
Copy
driver.save_screenshot("screenshot.png")
# Screenshot specific element
element = driver.find_element(By.ID, "content")
element.screenshot("element.png")
Helper Function
Python
Copy
import requests
import os
from contextlib import contextmanager
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
@contextmanager
def browser_cash_session(**session_opts):
"""Context manager for Browser Cash sessions."""
api_key = os.getenv("BROWSER_API_KEY")
# Create session
resp = requests.post(
"https://api.browser.cash/v1/browser/session",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
json=session_opts
)
resp.raise_for_status()
data = resp.json()
# Connect Selenium
options = Options()
cdp_address = data["cdpUrl"].replace("wss://", "").replace("ws://", "").split("/")[0]
options.add_experimental_option("debuggerAddress", cdp_address)
driver = webdriver.Chrome(options=options)
try:
yield driver
finally:
driver.quit()
requests.delete(
"https://api.browser.cash/v1/browser/session",
headers={"Authorization": f"Bearer {api_key}"},
params={"sessionId": data["sessionId"]}
)
# Usage
with browser_cash_session(country="US") as driver:
driver.get("https://example.com")
print(driver.title)
Tips
- Selenium connects via CDP debugger address, not WebSocket URL directly
- Use explicit waits (
WebDriverWait) instead oftime.sleep() - Browser Cash handles browser management — focus on your automation logic