python Utilities

Selenium Browser Automation

Selenium WebDriver wrapper with headless mode, wait utilities, screenshot capture, and cookie management.

Apex Logic 0 copies
python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import json
from pathlib import Path

class BrowserAutomation:
    def __init__(self, headless: bool = True, timeout: int = 10):
        options = Options()
        if headless:
            options.add_argument("--headless=new")
        options.add_argument("--no-sandbox")
        options.add_argument("--disable-dev-shm-usage")
        options.add_argument("--window-size=1920,1080")
        options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)")

        self.driver = webdriver.Chrome(options=options)
        self.driver.implicitly_wait(timeout)
        self.wait = WebDriverWait(self.driver, timeout)

    def navigate(self, url: str) -> "BrowserAutomation":
        self.driver.get(url)
        return self

    def click(self, selector: str, by: str = "css") -> "BrowserAutomation":
        locator = By.CSS_SELECTOR if by == "css" else By.XPATH
        self.wait.until(EC.element_to_be_clickable((locator, selector))).click()
        return self

    def fill(self, selector: str, text: str) -> "BrowserAutomation":
        el = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
        el.clear()
        el.send_keys(text)
        return self

    def get_text(self, selector: str) -> str:
        el = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
        return el.text

    def screenshot(self, filename: str = "screenshot.png") -> None:
        self.driver.save_screenshot(filename)

    def save_cookies(self, path: str = "cookies.json") -> None:
        Path(path).write_text(json.dumps(self.driver.get_cookies()))

    def load_cookies(self, path: str = "cookies.json") -> None:
        cookies = json.loads(Path(path).read_text())
        for cookie in cookies:
            self.driver.add_cookie(cookie)

    def close(self) -> None:
        self.driver.quit()

    def __enter__(self):
        return self

    def __exit__(self, *args):
        self.close()

if __name__ == "__main__":
    with BrowserAutomation(headless=True) as browser:
        browser.navigate("https://example.com")
        title = browser.driver.title
        print(f"Page title: {title}")

Tags

selenium automation testing browser

Related Snippets

javascript

File Upload Handler with Validation

python

Web Scraper with BeautifulSoup

python

CSV Data Processor

python

REST API Client with Retry