{"id":51381701,"url":"https://github.com/mathiaspaulenko/bidiwave","last_synced_at":"2026-07-03T17:01:00.485Z","repository":{"id":368974956,"uuid":"1287775701","full_name":"MathiasPaulenko/bidiwave","owner":"MathiasPaulenko","description":"Python library for WebDriver BiDi communication with any browser. Async-first, cross-browser, no Selenium, no CDP.","archived":false,"fork":false,"pushed_at":"2026-07-03T16:47:17.000Z","size":832,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T17:00:14.709Z","etag":null,"topics":["asyncio","automation","bidi","browser","browser-automation","cdp","chrome","firefox","python","selenium","testing","w3c","webautomation","webdriver","webdriver-bidi"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MathiasPaulenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-03T02:03:59.000Z","updated_at":"2026-07-03T16:47:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MathiasPaulenko/bidiwave","commit_stats":null,"previous_names":["mathiaspaulenko/bidiwave"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/MathiasPaulenko/bidiwave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbidiwave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbidiwave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbidiwave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbidiwave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MathiasPaulenko","download_url":"https://codeload.github.com/MathiasPaulenko/bidiwave/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbidiwave/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35094078,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asyncio","automation","bidi","browser","browser-automation","cdp","chrome","firefox","python","selenium","testing","w3c","webautomation","webdriver","webdriver-bidi"],"created_at":"2026-07-03T17:00:23.653Z","updated_at":"2026-07-03T17:01:00.444Z","avatar_url":"https://github.com/MathiasPaulenko.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bidiwave\n\nWebDriver BiDi for Python — talk to any browser via W3C standard.\n\n[![CI](https://github.com/MathiasPaulenko/bidiwave/actions/workflows/test.yml/badge.svg)](https://github.com/MathiasPaulenko/bidiwave/actions/workflows/test.yml)\n[![PyPI](https://img.shields.io/pypi/v/bidiwave)](https://pypi.org/project/bidiwave/)\n[![Python](https://img.shields.io/pypi/pyversions/bidiwave)](https://pypi.org/project/bidiwave/)\n[![License](https://img.shields.io/github/license/MathiasPaulenko/bidiwave)](LICENSE)\n\n## Features\n\n- **W3C WebDriver BiDi** — standard, not proprietary CDP\n- **Cross-browser** — Chrome, Firefox, Edge (Safari when BiDi support lands)\n- **Async-first** — native `async/await` with `asyncio`\n- **Event streaming** — console logs, navigation, network, contexts in real time\n- **Input simulation** — clicks, keyboard, scroll, drag \u0026 drop via `input.performActions`\n- **Network interception** — block, modify and mock HTTP requests\n- **Type-safe** — Pydantic v2 models, type narrowing with `match`\n- **Lightweight** — no Selenium, no Playwright required\n\n## Install\n\n```bash\npip install bidiwave\n```\n\n## Quick start\n\n```python\nimport asyncio\nfrom bidiwave import BiDiClient, StringValue\n\nasync def main():\n    async with await BiDiClient.connect(\"ws://localhost:9222/session\") as client:\n        await client.session.new()\n\n        async with await client.browsing.open(\"https://example.com\") as page:\n            # Evaluate JS\n            result = await page.evaluate(\"document.title\")\n            match result:\n                case StringValue(value=title):\n                    print(f\"Title: {title}\")\n\n            # Screenshot\n            screenshot = await page.screenshot()\n            with open(\"screenshot.png\", \"wb\") as f:\n                f.write(screenshot)\n\nasyncio.run(main())\n```\n\n## Console log monitoring\n\n```python\nasync with await BiDiClient.connect(url) as client:\n    async def on_log(entry):\n        print(f\"[{entry.level}] {entry.text}\")\n\n    client.on(\"log.entryAdded\", on_log)\n    await client.session.subscribe([\"log.entryAdded\"])\n\n    async with await client.browsing.open(\"https://example.com\") as page:\n        await page.evaluate(\"console.log('hello!')\")\n        await asyncio.sleep(2)\n```\n\n## Input simulation\n\n```python\nasync with await BiDiClient.connect(url) as client:\n    async with await client.browsing.open(\"https://example.com\") as page:\n        ctx = page.context\n\n        # Click at coordinates\n        await client.input.click(ctx, x=100, y=200)\n\n        # Type text\n        await client.input.type_text(ctx, \"Hello, world!\")\n\n        # Press Enter\n        await client.input.press_key(ctx, \"Enter\")\n\n        # Scroll down 500px\n        await client.input.scroll(ctx, delta_y=500)\n\n        # Drag and drop\n        await client.input.drag_and_drop(ctx, 100, 100, 300, 300)\n```\n\n## Network interception\n\n```python\nasync with await BiDiClient.connect(url) as client:\n    # Block all requests to ads\n    intercept = await client.network.add_intercept(\n        phases=[\"beforeRequestSent\"],\n        url_patterns=[\"*ads.example.com*\"],\n    )\n\n    async with await client.browsing.open(\"https://example.com\") as page:\n        await asyncio.sleep(2)\n\n    await client.network.remove_intercept(intercept.intercept_id)\n```\n\n## Launch a browser with BiDi\n\n### Chrome\n\n```bash\ngoogle-chrome --headless=new --remote-debugging-port=9222 --enable-bidi\n```\n\n### Firefox\n\n```bash\nfirefox --headless --remote-debugging-port=9223 --no-remote\n```\n\n## Documentation\n\n- [Quick Start](https://bidiwave.readthedocs.io/quick-start/)\n- [API Reference](https://bidiwave.readthedocs.io/api/)\n- [Network](https://bidiwave.readthedocs.io/api/network/)\n- [Input](https://bidiwave.readthedocs.io/api/input/)\n- [Cookbook](https://bidiwave.readthedocs.io/cookbook/)\n- [Error Handling](https://bidiwave.readthedocs.io/error-handling/)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathiaspaulenko%2Fbidiwave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmathiaspaulenko%2Fbidiwave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathiaspaulenko%2Fbidiwave/lists"}