zendriver-patch 0.15.3.post1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. zendriver_patch-0.15.3.post1/.dockerignore +9 -0
  2. zendriver_patch-0.15.3.post1/.github/CODEOWNERS +1 -0
  3. zendriver_patch-0.15.3.post1/.github/FUNDING.yml +1 -0
  4. zendriver_patch-0.15.3.post1/.github/pull_request_template.md +16 -0
  5. zendriver_patch-0.15.3.post1/.github/workflows/close-inactive-issues-prs.yml +26 -0
  6. zendriver_patch-0.15.3.post1/.github/workflows/docs.yml +36 -0
  7. zendriver_patch-0.15.3.post1/.github/workflows/lint.yml +25 -0
  8. zendriver_patch-0.15.3.post1/.github/workflows/publish.yml +21 -0
  9. zendriver_patch-0.15.3.post1/.github/workflows/test.yml +37 -0
  10. zendriver_patch-0.15.3.post1/.gitignore +91 -0
  11. zendriver_patch-0.15.3.post1/CHANGELOG.md +387 -0
  12. zendriver_patch-0.15.3.post1/CONTRIBUTING.md +152 -0
  13. zendriver_patch-0.15.3.post1/LICENSE +619 -0
  14. zendriver_patch-0.15.3.post1/PKG-INFO +734 -0
  15. zendriver_patch-0.15.3.post1/README.md +88 -0
  16. zendriver_patch-0.15.3.post1/codecov.yml +2 -0
  17. zendriver_patch-0.15.3.post1/docker-compose.yml +26 -0
  18. zendriver_patch-0.15.3.post1/docs/CNAME +1 -0
  19. zendriver_patch-0.15.3.post1/docs/index.md +1 -0
  20. zendriver_patch-0.15.3.post1/docs/quickstart.md +184 -0
  21. zendriver_patch-0.15.3.post1/docs/stylesheets/extra.css +0 -0
  22. zendriver_patch-0.15.3.post1/docs/tutorials/account-creation.md +37 -0
  23. zendriver_patch-0.15.3.post1/docs/tutorials/api-responses.md +19 -0
  24. zendriver_patch-0.15.3.post1/docs/tutorials/cdp.md +20 -0
  25. zendriver_patch-0.15.3.post1/docs/tutorials/great-power.jpg +0 -0
  26. zendriver_patch-0.15.3.post1/docs/tutorials/index.md +14 -0
  27. zendriver_patch-0.15.3.post1/docs/tutorials/infinite-scrolling.md +31 -0
  28. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/account-creation-1.py +18 -0
  29. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/account-creation-2.py +73 -0
  30. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/api-responses-1.py +18 -0
  31. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/api-responses-2.py +26 -0
  32. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/cdp-1.py +22 -0
  33. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/cdp-2.py +37 -0
  34. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/infinite-scrolling-1.py +21 -0
  35. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/infinite-scrolling-2.py +34 -0
  36. zendriver_patch-0.15.3.post1/docs/tutorials/tutorial-code/infinite-scrolling-3.py +49 -0
  37. zendriver_patch-0.15.3.post1/examples/browserscan.py +14 -0
  38. zendriver_patch-0.15.3.post1/examples/demo.py +190 -0
  39. zendriver_patch-0.15.3.post1/examples/expect_download.py +27 -0
  40. zendriver_patch-0.15.3.post1/examples/fetch_domain.py +44 -0
  41. zendriver_patch-0.15.3.post1/examples/imgur_upload_image.py +92 -0
  42. zendriver_patch-0.15.3.post1/examples/mouse_drag_boxes.py +73 -0
  43. zendriver_patch-0.15.3.post1/examples/network_monitor.py +65 -0
  44. zendriver_patch-0.15.3.post1/examples/set_user_agent.py +19 -0
  45. zendriver_patch-0.15.3.post1/examples/wait_for_page.py +23 -0
  46. zendriver_patch-0.15.3.post1/mkdocs.yml +125 -0
  47. zendriver_patch-0.15.3.post1/pyproject.toml +95 -0
  48. zendriver_patch-0.15.3.post1/scripts/format.sh +9 -0
  49. zendriver_patch-0.15.3.post1/scripts/generate_cdp.py +1065 -0
  50. zendriver_patch-0.15.3.post1/scripts/lint.sh +13 -0
  51. zendriver_patch-0.15.3.post1/scripts/mkdocs_generate_all.sh +7 -0
  52. zendriver_patch-0.15.3.post1/scripts/mkdocs_generate_index.py +20 -0
  53. zendriver_patch-0.15.3.post1/scripts/mkdocs_generate_reference.py +116 -0
  54. zendriver_patch-0.15.3.post1/scripts/mkdocs_generate_release_notes.py +38 -0
  55. zendriver_patch-0.15.3.post1/scripts/release.py +301 -0
  56. zendriver_patch-0.15.3.post1/scripts/test.sh +17 -0
  57. zendriver_patch-0.15.3.post1/tests/Dockerfile +44 -0
  58. zendriver_patch-0.15.3.post1/tests/__init__.py +0 -0
  59. zendriver_patch-0.15.3.post1/tests/bot_detection/__init__.py +0 -0
  60. zendriver_patch-0.15.3.post1/tests/bot_detection/test_browserscan.py +19 -0
  61. zendriver_patch-0.15.3.post1/tests/conftest.py +137 -0
  62. zendriver_patch-0.15.3.post1/tests/core/__init__.py +0 -0
  63. zendriver_patch-0.15.3.post1/tests/core/test_browser.py +112 -0
  64. zendriver_patch-0.15.3.post1/tests/core/test_keyinputs.py +69 -0
  65. zendriver_patch-0.15.3.post1/tests/core/test_multiple_browsers.py +47 -0
  66. zendriver_patch-0.15.3.post1/tests/core/test_react_controlled_input.py +111 -0
  67. zendriver_patch-0.15.3.post1/tests/core/test_tab.py +444 -0
  68. zendriver_patch-0.15.3.post1/tests/docs/__init__.py +19 -0
  69. zendriver_patch-0.15.3.post1/tests/docs/conftest.py +16 -0
  70. zendriver_patch-0.15.3.post1/tests/docs/tutorials/__init__.py +0 -0
  71. zendriver_patch-0.15.3.post1/tests/docs/tutorials/test_account_creation_tutorial.py +27 -0
  72. zendriver_patch-0.15.3.post1/tests/docs/tutorials/test_api_responses_tutorial.py +25 -0
  73. zendriver_patch-0.15.3.post1/tests/docs/tutorials/test_cdp_tutorial.py +23 -0
  74. zendriver_patch-0.15.3.post1/tests/docs/tutorials/test_infinite_scrolling_tutorial.py +44 -0
  75. zendriver_patch-0.15.3.post1/tests/next_test.sh +9 -0
  76. zendriver_patch-0.15.3.post1/tests/sample_data/__init__.py +6 -0
  77. zendriver_patch-0.15.3.post1/tests/sample_data/complex_object.html +87 -0
  78. zendriver_patch-0.15.3.post1/tests/sample_data/groceries.html +41 -0
  79. zendriver_patch-0.15.3.post1/tests/sample_data/profile.html +23 -0
  80. zendriver_patch-0.15.3.post1/tests/sample_data/react-controlled-input-test.html +86 -0
  81. zendriver_patch-0.15.3.post1/tests/sample_data/simple_editor.html +26 -0
  82. zendriver_patch-0.15.3.post1/tests/sample_data/simple_json.html +13 -0
  83. zendriver_patch-0.15.3.post1/tests/sample_data/special_key_detector.html +207 -0
  84. zendriver_patch-0.15.3.post1/uv.lock +1128 -0
  85. zendriver_patch-0.15.3.post1/zendriver/__init__.py +34 -0
  86. zendriver_patch-0.15.3.post1/zendriver/_version.py +1 -0
  87. zendriver_patch-0.15.3.post1/zendriver/cdp/README.md +4 -0
  88. zendriver_patch-0.15.3.post1/zendriver/cdp/__init__.py +63 -0
  89. zendriver_patch-0.15.3.post1/zendriver/cdp/accessibility.py +714 -0
  90. zendriver_patch-0.15.3.post1/zendriver/cdp/animation.py +509 -0
  91. zendriver_patch-0.15.3.post1/zendriver/cdp/audits.py +2430 -0
  92. zendriver_patch-0.15.3.post1/zendriver/cdp/autofill.py +296 -0
  93. zendriver_patch-0.15.3.post1/zendriver/cdp/background_service.py +224 -0
  94. zendriver_patch-0.15.3.post1/zendriver/cdp/bluetooth_emulation.py +653 -0
  95. zendriver_patch-0.15.3.post1/zendriver/cdp/browser.py +839 -0
  96. zendriver_patch-0.15.3.post1/zendriver/cdp/cache_storage.py +315 -0
  97. zendriver_patch-0.15.3.post1/zendriver/cdp/cast.py +168 -0
  98. zendriver_patch-0.15.3.post1/zendriver/cdp/console.py +109 -0
  99. zendriver_patch-0.15.3.post1/zendriver/cdp/crash_report_context.py +58 -0
  100. zendriver_patch-0.15.3.post1/zendriver/cdp/css.py +2994 -0
  101. zendriver_patch-0.15.3.post1/zendriver/cdp/debugger.py +1531 -0
  102. zendriver_patch-0.15.3.post1/zendriver/cdp/device_access.py +142 -0
  103. zendriver_patch-0.15.3.post1/zendriver/cdp/device_orientation.py +45 -0
  104. zendriver_patch-0.15.3.post1/zendriver/cdp/dom.py +2344 -0
  105. zendriver_patch-0.15.3.post1/zendriver/cdp/dom_debugger.py +322 -0
  106. zendriver_patch-0.15.3.post1/zendriver/cdp/dom_snapshot.py +1022 -0
  107. zendriver_patch-0.15.3.post1/zendriver/cdp/dom_storage.py +220 -0
  108. zendriver_patch-0.15.3.post1/zendriver/cdp/emulation.py +1822 -0
  109. zendriver_patch-0.15.3.post1/zendriver/cdp/event_breakpoints.py +56 -0
  110. zendriver_patch-0.15.3.post1/zendriver/cdp/extensions.py +239 -0
  111. zendriver_patch-0.15.3.post1/zendriver/cdp/fed_cm.py +287 -0
  112. zendriver_patch-0.15.3.post1/zendriver/cdp/fetch.py +535 -0
  113. zendriver_patch-0.15.3.post1/zendriver/cdp/file_system.py +117 -0
  114. zendriver_patch-0.15.3.post1/zendriver/cdp/headless_experimental.py +126 -0
  115. zendriver_patch-0.15.3.post1/zendriver/cdp/heap_profiler.py +403 -0
  116. zendriver_patch-0.15.3.post1/zendriver/cdp/indexed_db.py +548 -0
  117. zendriver_patch-0.15.3.post1/zendriver/cdp/input_.py +715 -0
  118. zendriver_patch-0.15.3.post1/zendriver/cdp/inspector.py +85 -0
  119. zendriver_patch-0.15.3.post1/zendriver/cdp/io.py +104 -0
  120. zendriver_patch-0.15.3.post1/zendriver/cdp/layer_tree.py +507 -0
  121. zendriver_patch-0.15.3.post1/zendriver/cdp/log.py +203 -0
  122. zendriver_patch-0.15.3.post1/zendriver/cdp/media.py +324 -0
  123. zendriver_patch-0.15.3.post1/zendriver/cdp/memory.py +318 -0
  124. zendriver_patch-0.15.3.post1/zendriver/cdp/network.py +5856 -0
  125. zendriver_patch-0.15.3.post1/zendriver/cdp/overlay.py +1645 -0
  126. zendriver_patch-0.15.3.post1/zendriver/cdp/page.py +4214 -0
  127. zendriver_patch-0.15.3.post1/zendriver/cdp/performance.py +126 -0
  128. zendriver_patch-0.15.3.post1/zendriver/cdp/performance_timeline.py +213 -0
  129. zendriver_patch-0.15.3.post1/zendriver/cdp/preload.py +663 -0
  130. zendriver_patch-0.15.3.post1/zendriver/cdp/profiler.py +445 -0
  131. zendriver_patch-0.15.3.post1/zendriver/cdp/pwa.py +277 -0
  132. zendriver_patch-0.15.3.post1/zendriver/cdp/py.typed +0 -0
  133. zendriver_patch-0.15.3.post1/zendriver/cdp/runtime.py +1762 -0
  134. zendriver_patch-0.15.3.post1/zendriver/cdp/schema.py +51 -0
  135. zendriver_patch-0.15.3.post1/zendriver/cdp/security.py +558 -0
  136. zendriver_patch-0.15.3.post1/zendriver/cdp/service_worker.py +402 -0
  137. zendriver_patch-0.15.3.post1/zendriver/cdp/smart_card_emulation.py +907 -0
  138. zendriver_patch-0.15.3.post1/zendriver/cdp/storage.py +1656 -0
  139. zendriver_patch-0.15.3.post1/zendriver/cdp/system_info.py +353 -0
  140. zendriver_patch-0.15.3.post1/zendriver/cdp/target.py +859 -0
  141. zendriver_patch-0.15.3.post1/zendriver/cdp/tethering.py +59 -0
  142. zendriver_patch-0.15.3.post1/zendriver/cdp/tracing.py +408 -0
  143. zendriver_patch-0.15.3.post1/zendriver/cdp/util.py +19 -0
  144. zendriver_patch-0.15.3.post1/zendriver/cdp/web_audio.py +636 -0
  145. zendriver_patch-0.15.3.post1/zendriver/cdp/web_authn.py +635 -0
  146. zendriver_patch-0.15.3.post1/zendriver/cdp/web_mcp.py +238 -0
  147. zendriver_patch-0.15.3.post1/zendriver/core/__init__.py +0 -0
  148. zendriver_patch-0.15.3.post1/zendriver/core/_contradict.py +124 -0
  149. zendriver_patch-0.15.3.post1/zendriver/core/browser.py +880 -0
  150. zendriver_patch-0.15.3.post1/zendriver/core/cloudflare.py +269 -0
  151. zendriver_patch-0.15.3.post1/zendriver/core/config.py +392 -0
  152. zendriver_patch-0.15.3.post1/zendriver/core/connection.py +937 -0
  153. zendriver_patch-0.15.3.post1/zendriver/core/element.py +1263 -0
  154. zendriver_patch-0.15.3.post1/zendriver/core/expect.py +232 -0
  155. zendriver_patch-0.15.3.post1/zendriver/core/intercept.py +171 -0
  156. zendriver_patch-0.15.3.post1/zendriver/core/keys.py +595 -0
  157. zendriver_patch-0.15.3.post1/zendriver/core/tab.py +1733 -0
  158. zendriver_patch-0.15.3.post1/zendriver/core/util.py +361 -0
  159. zendriver_patch-0.15.3.post1/zendriver/py.typed +0 -0
@@ -0,0 +1,9 @@
1
+ # Python
2
+ **/__pycache__
3
+ app.egg-info
4
+ **/*.pyc
5
+ .mypy_cache
6
+ .ruff_cache
7
+ .coverage
8
+ htmlcov
9
+ .venv
@@ -0,0 +1 @@
1
+ * @cdpdriver/cdpdriver-developers
@@ -0,0 +1 @@
1
+ github: [ stephanlensky, nathanfallet ]
@@ -0,0 +1,16 @@
1
+ ## Description
2
+
3
+ <!-- Please describe your change below this line -->
4
+
5
+ ## Pre-merge Checklist
6
+
7
+ <!--
8
+ Check each box by marking it with an x, like this: "- [x]"
9
+
10
+ Before creating your pull request, please ensure each item is completed.
11
+ -->
12
+
13
+ - [ ] I have described my change in the section above.
14
+ - [ ] I have ran the [`./scripts/format.sh`](https://github.com/cdpdriver/zendriver/blob/main/scripts/format.sh) and [`./scripts/lint.sh`](https://github.com/cdpdriver/zendriver/blob/main/scripts/lint.sh) scripts. My code is properly formatted and has no linting errors.
15
+ - [ ] I have ran `uv run pytest` and ensured all tests pass.
16
+ - [ ] I have added my change to [CHANGELOG.md](https://github.com/cdpdriver/zendriver/blob/main/CHANGELOG.md) under the `[Unreleased]` section.
@@ -0,0 +1,26 @@
1
+ name: Close inactive issues
2
+ on:
3
+ schedule:
4
+ - cron: "30 1 * * *"
5
+ workflow_dispatch:
6
+ jobs:
7
+ close-issues:
8
+ runs-on: ubuntu-latest
9
+ permissions:
10
+ issues: write
11
+ pull-requests: write
12
+ steps:
13
+ - uses: actions/stale@v9
14
+ with:
15
+ days-before-issue-stale: 30
16
+ days-before-issue-close: 7
17
+ stale-issue-label: "stale"
18
+ stale-issue-message: "This issue has been marked stale because it has been open for 30 days with no activity. If there is no activity within 7 days, it will be automatically closed."
19
+ close-issue-message: "This issue was automatically closed because it has been inactive for 7 days since being marked as stale."
20
+ only-issue-labels: "question"
21
+ days-before-pr-stale: 30
22
+ days-before-pr-close: 7
23
+ stale-pr-label: "stale"
24
+ stale-pr-message: "This pull request has been marked stale because it has been open for 30 days with no activity. If there is no activity within 7 days, it will be automatically closed."
25
+ close-pr-message: "This pull request was automatically closed because it has been inactive for 7 days since being marked as stale."
26
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,36 @@
1
+ name: docs
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ paths:
7
+ - "docs/**"
8
+ # Files which are used during doc generation
9
+ - "mkdocs.yml"
10
+ - "README.md"
11
+ - "CHANGELOG.md"
12
+ - "zendriver/cdp/**"
13
+ workflow_dispatch:
14
+ permissions:
15
+ contents: write
16
+ jobs:
17
+ docs:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - name: Configure Git Credentials
22
+ run: |
23
+ git config user.name github-actions[bot]
24
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
25
+ - name: Install uv
26
+ uses: astral-sh/setup-uv@v3
27
+ - name: Set up Python
28
+ run: uv python install
29
+ - name: Install dependencies
30
+ run: uv sync --all-extras --dev
31
+ - name: Auto-generate docs
32
+ run: |
33
+ uv run python scripts/mkdocs_generate_reference.py
34
+ uv run python scripts/mkdocs_generate_release_notes.py
35
+ - name: Deploy to GitHub Pages
36
+ run: uv run mkdocs gh-deploy --force
@@ -0,0 +1,25 @@
1
+ name: lint
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ paths:
7
+ - "**.py"
8
+ pull_request:
9
+ branches:
10
+ - main
11
+ paths:
12
+ - "**.py"
13
+ jobs:
14
+ lint:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v3
20
+ - name: Set up Python
21
+ run: uv python install
22
+ - name: Install dependencies
23
+ run: uv sync --all-extras --dev
24
+ - name: Lint with ruff/mypy
25
+ run: /bin/bash ./scripts/lint.sh
@@ -0,0 +1,21 @@
1
+ name: publish
2
+ on:
3
+ push:
4
+ tags:
5
+ - "*"
6
+ workflow_dispatch:
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - name: Install uv
13
+ uses: astral-sh/setup-uv@v3
14
+ - name: Set up Python
15
+ run: uv python install
16
+ - name: Build wheel
17
+ run: uv build
18
+ - name: Publish to PyPI
19
+ run: uv publish
20
+ env:
21
+ UV_PUBLISH_TOKEN: ${{ secrets.UV_PUBLISH_TOKEN }}
@@ -0,0 +1,37 @@
1
+ name: test
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ paths:
7
+ - "**.py"
8
+ pull_request:
9
+ branches:
10
+ - main
11
+ paths:
12
+ - "**.py"
13
+ workflow_dispatch:
14
+ jobs:
15
+ test:
16
+ runs-on: ${{ matrix.os }}
17
+ strategy:
18
+ matrix:
19
+ os: [ ubuntu-latest, windows-latest ]
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v3
24
+ - name: Set up Python
25
+ run: uv python install
26
+ - name: Install dependencies
27
+ run: uv sync --all-extras --dev
28
+ - name: Run tests
29
+ env:
30
+ ZENDRIVER_TEST_BROWSERS: "headless"
31
+ ZENDRIVER_TEST_NO_SANDBOX: "true"
32
+ shell: bash
33
+ run: ./scripts/test.sh
34
+ - name: Upload coverage to Codecov
35
+ uses: codecov/codecov-action@v5
36
+ env:
37
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,91 @@
1
+ # mkdocs build
2
+ site/
3
+
4
+ # auto-generated docs
5
+ docs/reference
6
+ docs/release-notes.md
7
+
8
+ # uv/pyenv
9
+ .python-version
10
+
11
+ # scratch files
12
+ scratch/
13
+
14
+ # Byte-compiled / optimized / DLL files
15
+ __pycache__/
16
+ *.py[cod]
17
+ *$py.class
18
+
19
+ # C extensions
20
+ *.so
21
+
22
+ # Distribution / packaging
23
+ .Python
24
+ build/
25
+ develop-eggs/
26
+ dist/
27
+ eggs/
28
+ .eggs/
29
+ sdist/
30
+ wheels/
31
+ share/python-wheels/
32
+ *.egg-info/
33
+ .installed.cfg
34
+ *.egg
35
+ MANIFEST
36
+
37
+ # PyInstaller
38
+ # Usually these files are written by a python script from a template
39
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
40
+ *.manifest
41
+ *.spec
42
+
43
+
44
+ # Unit test / coverage reports
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ .coverage
49
+ .coverage.*
50
+ .cache
51
+ nosetests.xml
52
+ coverage.xml
53
+ *.cover
54
+ *.py,cover
55
+ .hypothesis/
56
+ .pytest_cache/
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+
65
+ # Sphinx documentation
66
+
67
+ !docs/_build/html
68
+ !docs/_build/markdown
69
+
70
+
71
+
72
+ # IPython
73
+ profile_default/
74
+ ipython_config.py
75
+
76
+ # Environments
77
+ .env
78
+ .venv
79
+ env/
80
+ venv/
81
+ ENV/
82
+ env.bak/
83
+ venv.bak/
84
+ /docs/_build/doctrees/
85
+
86
+ # VisualStudioCode
87
+ .vscode
88
+ .history
89
+
90
+ # Pycharm
91
+ /.idea
@@ -0,0 +1,387 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Fixed
11
+
12
+ - Fix `Connection._register_handlers` reenabling already manually enabled domains @S-Tarr
13
+ - Fix flakey behavior in `api-reponses-tutorial-2` tutorial @S-Tarr
14
+
15
+ ### Added
16
+
17
+ ### Changed
18
+
19
+ - Updated CDP models @nathanfallet
20
+
21
+ ### Removed
22
+
23
+ ## [0.15.3] - 2026-03-11
24
+
25
+ ### Fixed
26
+
27
+ - Fix crash in `browser.cookies.get_all()` on Chrome 146 when the `sameParty` field is missing in the cookie JSON returned by CDP.
28
+ - Fix `clear_input()` and `clear_input_by_deleting()` silently failing on React controlled inputs due to `_valueTracker` mechanism; also fix infinite loop in `clear_input_by_deleting()` on some VM environments caused by `VK_DELETE` being treated as backward-delete. @nathanfallet
29
+
30
+ ### Changed
31
+
32
+ - Docs: `core` modules included in documentation reference section. Slight modifications were done, mostly to remove warnings. @Kajmany
33
+
34
+ ## [0.15.2] - 2025-11-29
35
+
36
+ ### Fixed
37
+
38
+ - Fix race condition in `Tab.query_selector` and `Tab.query_selector_all` on stale document. @Avejack
39
+
40
+ ## [0.15.1] - 2025-11-18
41
+
42
+ ### Fixed
43
+
44
+ - Fix `NameError` in `Tab.query_selector` and `Tab.query_selector_all` due to type-checking import of `Element`. @Avejack
45
+
46
+ ## [0.15.0] - 2025-11-04
47
+
48
+ ### Fixed
49
+
50
+ - Fix `browser.stopped` to detect when the browser was closed by the user. @puc9
51
+ - Fix typo in `Browser._handle_target_update` that prevented target_info updates @puc9
52
+ - Fix [#128](https://github.com/cdpdriver/zendriver/issues/218): TimeoutError caused by Tab.xpath @ionutcatana
53
+ - Fix WebRTC IP Leaks @ethcipher
54
+
55
+ ### Added
56
+
57
+ - Add `disable_webrtc` and `disable_webgl` args to `Config` class @ethcipher
58
+
59
+ ### Changed
60
+
61
+ - Fix `.dockerignore` @tomokinakamaru
62
+
63
+ ## [0.14.2] - 2025-09-09
64
+
65
+ ### Fixed
66
+
67
+ - Fix `evaluate` to return the correct value instead of None for falsy values @thromer
68
+
69
+ ## [0.14.1] - 2025-09-07
70
+
71
+ ### Fixed
72
+
73
+ - Fix calls to `evaluate` that return JSON: only set `serialization_options` when `return_by_value=False` @thromer
74
+ - Fix [#184](https://github.com/cdpdriver/zendriver/issues/184): `download_path` error in `DownloadExpectation` @MadsHangaard
75
+
76
+ ## [0.14.0] - 2025-08-28
77
+
78
+ ### Fixed
79
+
80
+ - Add nodriver evaluate serialization options for improved JavaScript evaluation @dbrun3
81
+
82
+ ### Added
83
+
84
+ - Allow reset expect and intercept @nathanfallet
85
+
86
+ ## [0.13.1] - 2025-07-27
87
+
88
+ ### Fixed
89
+
90
+ - Remove unnecessary usage of `typing_extensions` (fixes `No module named 'typing_extensions'` error) @stephanlensky
91
+ - Fix verify_cf() @H1steria
92
+ - Fix relative coordinates of flash_point() @H1steria
93
+
94
+ ### Added
95
+
96
+ - Add flash_point() to Tab.mouse_click() @H1steria
97
+
98
+ ### Changed
99
+
100
+ - Remove Connection `__getattr__` and replace it with declared `@property` @nathanfallet
101
+ - Deprecate Element `__getattr__` and add `get(name: str)` method @nathanfallet
102
+
103
+ ## [0.13.0] - 2025-07-24
104
+
105
+ ### Fixed
106
+
107
+ - Gracefully close the browser process on exit @nathanfallet
108
+
109
+ ### Added
110
+
111
+ - Add support for Brave browser @H1steria
112
+
113
+ ## [0.12.1] - 2025-07-17
114
+
115
+ ### Fixed
116
+
117
+ - Remove usage of StrEnum to fix compatibility with Python 3.10 @stephanlensky
118
+
119
+ ## [0.12.0] - 2025-07-17
120
+
121
+ ### Added
122
+
123
+ - Added `Tab.intercept` @nathanfallet
124
+
125
+ ## [0.11.0] - 2025-07-16
126
+
127
+ ### Added
128
+
129
+ - Complete rewrite of keyboard input system with new `KeyEvents` class in `zendriver.core.keys` @hvgupta
130
+ - Added support for modifiers (Ctrl, Alt, Shift, Meta)
131
+ - Added support for special keys including arrows, escape, delete and backspace
132
+ - Added `KeyEvents.from_text()` class method for converting plain text to cdp events
133
+ - Added `KeyEvents.from_mixed_input()` class method for handling mixed sequences of text, special keys to cdp events
134
+ - Proper Handling of shift variants of keys
135
+ - Comprehensive key event types: `CHAR`, `KEY_DOWN`, `KEY_UP`
136
+ - Added key event type (`DOWN_AND_UP`) as a combination of `KEY_DOWN` and `KEY_UP`
137
+
138
+ ### Changed
139
+
140
+ - `Element.send_keys()` now uses the new `KeyEvents` system (it is still backwards compatible with passing a string) @hvgupta
141
+ - Key event processing now properly handles modifier key sequences @hvgupta
142
+ - Update CDP schemas @nathanfallet
143
+
144
+ ## [0.10.2] - 2025-07-06
145
+
146
+ ### Fixed
147
+
148
+ - Refactor to asynchronous handlers to avoid blocking the listening loop @nathanfallet
149
+
150
+ ## [0.10.1] - 2025-07-06
151
+
152
+ ### Fixed
153
+
154
+ - Added `Tab.flash_point` from nodriver @nathanfallet
155
+ - Ensured loading is finished in expect @nathanfallet
156
+
157
+ ## [0.10.0] - 2025-07-05
158
+
159
+ ### Fixed
160
+
161
+ - Refactor element waiting loops in `find_*` and `select*` methods. @H1steria
162
+ - Improve `query_selector` error handling to consistently return `None` when a node is not found. @H1steria
163
+ - Add user_agent option to allow bypassing cloudflare javascript challenge in headless mode. @H1steria
164
+ - Fixed `lang` parameter never being set in `Browser.start` @nathanfallet
165
+
166
+ ### Added
167
+
168
+ - Added `mouse_move` and `mouse_click` methods from nodriver. @H1steria
169
+
170
+ ## [0.9.0] - 2025-07-01
171
+
172
+ ### Added
173
+
174
+ - Added `speed` in `Tab.scroll_down` and `Tab.scroll_up` methods to control the scroll speed @nathanfallet
175
+ - Allow to wait for promise in `Element.apply` method @nathanfallet
176
+ - Added `Element.clear_input_by_deleting` to handle inputs with custom delete behavior @nathanfallet
177
+ - Added `Tab.xpath` from nodriver @nathanfallet
178
+
179
+ ## [0.8.1] - 2025-06-07
180
+
181
+ ### Fixed
182
+
183
+ - Add an optional `special_characters` flag to `Element.send_keys` to support sending special characters (e.g. emojis) @nathanfallet
184
+
185
+ ## [0.8.0] - 2025-06-01
186
+
187
+ ### Fixed
188
+
189
+ - Fixed tests so that they can run on Windows (and still run on Linux like before) @nathanfallet
190
+ - Remove usage of asyncio subprocess for better compatibility on Windows @nathanfallet
191
+ - Added a missing Chrome Canary path for Windows @nathanfallet
192
+ - Added a flag to re-enable `--load-extension` (disabled by default in Chrome 136+) @nathanfallet
193
+
194
+ ## [0.7.1] - 2025-05-08
195
+
196
+ ### Changed
197
+
198
+ - Updated CDP models @jsuarezl
199
+
200
+ ## [0.7.0] - 2025-04-28
201
+
202
+ ### Added
203
+
204
+ - Added `Tab.screenshot_b64` and `Element.screenshot_b64` methods to return screenshot as base64 string @falmar
205
+ - Added `Tab.print_to_pdf` to print the current page to a PDF file @stephanlensky
206
+
207
+ ## [0.6.1] - 2025-04-25
208
+
209
+ ### Fixed
210
+
211
+ - Fix race condition in `Browser.get` and `Tab.close` which could cause exceptions, especially when running multiple browsers in parallel @stephanlensky
212
+
213
+ ## [0.6.0] - 2025-04-20
214
+
215
+ ### Fixed
216
+
217
+ - `Browser.get` and `Tab.close` will now wait for their appropiate target events before returning @ccev
218
+
219
+ ### Added
220
+
221
+ - Added `Tab.save_snapshot` to export the current page to MHTML format.
222
+
223
+ ## [0.5.2] - 2025-04-09
224
+
225
+ ### Fixed
226
+
227
+ - Fixed type annotation of `Element.children` @stephanlensky
228
+
229
+ ## [0.5.1] - 2025-02-16
230
+
231
+ ### Changed
232
+
233
+ - Deprecated `zendriver.loop()` function. You should instead use `asyncio` functions directly, for example:
234
+
235
+ ```python
236
+ asyncio.run(your_main_method())
237
+ ```
238
+
239
+ ## [0.5.0] - 2025-02-16
240
+
241
+ ### Added
242
+
243
+ - Add `tab.expect_download` methods to wait for download file @3mora2
244
+
245
+ ## [0.4.3] - 2025-02-11
246
+
247
+ ### Added
248
+
249
+ - Add logs for Chrome process output on connection failure @stephanlensky
250
+
251
+ ### Changed
252
+
253
+ - Default and launch changed to use `about:blank` (faster start and less bandwidth) @raycardillo
254
+
255
+ ## [0.4.2] - 2025-02-11
256
+
257
+ ### Fixed
258
+
259
+ - Multiple Browsers can be created without one affecting the other @raycardillo
260
+
261
+ ## [0.4.1] - 2025-02-09
262
+
263
+ ### Fixed
264
+
265
+ - Ignore irrelevant `DOM.disable` errors @raycardillo
266
+ - Test scripts improved for running on macOS @raycardillo
267
+
268
+ ## [0.4.0] - 2025-02-06
269
+
270
+ ### Added
271
+
272
+ - Add `tab.expect_request` and `tab.expect_response` methods to wait for a specific request or response @3mora2
273
+ - Add `tab.wait_for_ready_state` method for to wait for page to load @3mora2
274
+ - Add `tab.remove_handlers` method for removing handlers @khamaileon
275
+ - Clean up temporary profiles when `Browser.stop()` is called @barrycarey
276
+
277
+ ## [0.3.1] - 2025-01-28
278
+
279
+ ### Fixed
280
+
281
+ - Fixed bug in `find`/`find_element_by_text` which caused `ProtocolException` when no results were found @stephanlensky
282
+
283
+ ## [0.3.0] - 2025-01-25
284
+
285
+ ### Fixed
286
+
287
+ - Added `Tab.set_user_agent()` function for programmatically configuring the user-agent, language, and platform @stephanlensky
288
+ - Improved a few type annotations (`Connection.send()` function now returns correctly typed values based on the provided `cdp_obj`) @stephanlensky
289
+
290
+ ## [0.2.3] - 2024-12-14
291
+
292
+ ### Fixed
293
+
294
+ - Fixed mypy linting errors (attempt 2) @stephanlensky
295
+
296
+ ### Added
297
+
298
+ - Handle browser process shutdown on 'Failed to connect to browser' @desoul99
299
+ - Added configurable browser connection timeout and tries @desoul99
300
+
301
+ ## [0.2.2] - 2024-11-23
302
+
303
+ ### Fixed
304
+
305
+ - Fix `AttributeError: 'tuple' object has no attribute 'value'` error in `connection.py` when using headless browser, @slimshreydy
306
+
307
+ ## [0.2.1] - 2024-11-23
308
+
309
+ ### Added
310
+
311
+ - Add automated testing framework! @stephanlensky
312
+ - For now, just a few tests are written, including one to test browserscan.com bot detection
313
+ - In the future, we can expand this test suite further (see [Zendriver#18](https://github.com/stephanlensky/zendriver/issues/18))
314
+ - Add return type annotation to `Tab.get_content()` @stephanlensky
315
+
316
+ ### Changed
317
+
318
+ - Upgraded `websockets` to latest version (`>=14.0`) @yoori @stephanlensky
319
+
320
+ ## [0.2.0] - 2024-11-17
321
+
322
+ ### Changed
323
+
324
+ - Updated CDP models @stephanlensky
325
+
326
+ ## [0.1.5] - 2024-11-17
327
+
328
+ ### Fixed
329
+
330
+ - Reverted non-functional fixes for mypy linting errors (oops) @stephanlensky
331
+
332
+ ## [0.1.4] - 2024-11-17
333
+
334
+ ### Fixed
335
+
336
+ - Fixed a large number of mypy linting errors (should not result in any functional change) @stephanlensky
337
+
338
+ ### Added
339
+
340
+ - Added `zendriver.__version__` attribute to get current package version at runtime @stephanlensky
341
+
342
+ ## [0.1.3] - 2024-11-12
343
+
344
+ ### Added
345
+
346
+ - Added support for `DOM.scrollableFlagUpdated` experimental CDP event. @michaellee94
347
+
348
+ ## [0.1.2] - 2024-11-11
349
+
350
+ ### Fixed
351
+
352
+ - Pinned requirement `websockets<14`, fixing the `AttributeError: 'NoneType' object has no attribute 'closed'` crash which occurs on the latest version of `websockets`. @stephanlensky
353
+ - Fixed incorrect `browser.close()` method in examples and documentation -- the correct method is `browser.stop()`. @stephanlensky
354
+ - Fixed `atexit` handler to correctly handle async `browser.stop()` method. @stephanlensky
355
+
356
+ ## [0.1.1] - 2024-10-29
357
+
358
+ ### Added
359
+
360
+ - Support for Python 3.10 and Python 3.11. All versions >=3.10 are now supported. @stephanlensky
361
+
362
+ ## [0.1.0] - 2024-10-20
363
+
364
+ Initial version, forked from [ultrafunkamsterdam/nodriver@`1bb6003`](https://github.com/ultrafunkamsterdam/nodriver/commit/1bb6003c7f0db4d3ec05fdf3fc8c8e0804260103) with a variety of improvements.
365
+
366
+ ### Fixed
367
+
368
+ - `Browser.set_all` cookies function now correctly uses provided cookies @ilkecan
369
+ - "successfully removed temp profile" message printed on exit is now only shown only when a profile was actually removed. Message is now logged at debug level instead of printed. @mreiden @stephanlensky
370
+ - Fix crash on starting browser in headless mode @ilkecan
371
+ - Fix `Browser.stop()` method to give the browser instance time to shut down before force killing @stephanlensky
372
+ - Many `ruff` lint issues @stephanlensky
373
+
374
+ ### Added
375
+
376
+ - Support for linting with `ruff` and `mypy`. All `ruff` lints are fixed in the initial release, but many `mypy` issues remain to be fixed at a later date. @stephanlensky
377
+ - `py.typed` marker so importing as a library in other packages no longer causes `mypy` errors. @stephanlensky
378
+
379
+ ### Changed
380
+
381
+ - Project is now built with [`uv`](https://github.com/astral-sh/uv). Automatically install dependencies to a venv with `uv sync`, run commands from the venv with `uv run`, and build the project with `uv build`. See the official [`uv` docs](https://docs.astral.sh/uv/) for more information. @stephanlensky
382
+ - Docs migrated from sphinx to [mkdocs-material](https://squidfunk.github.io/mkdocs-material/). @stephanlensky
383
+ - `Browser.stop()` is now async (so it must be `await`ed) @stephanlensky
384
+
385
+ ### Removed
386
+
387
+ - Twitter account creation example @stephanlensky