playwright-browserstack 1.56.1__tar.gz → 1.62.0__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 (466) hide show
  1. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.azure-pipelines/publish.yml +6 -2
  2. playwright_browserstack-1.62.0/.claude/skills/playwright-roll/SKILL.md +307 -0
  3. playwright_browserstack-1.62.0/.github/actionlint.yaml +5 -0
  4. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/workflows/ci.yml +21 -38
  5. playwright_browserstack-1.62.0/.github/workflows/publish-pypi.yml +233 -0
  6. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/workflows/publish_docker.yml +8 -4
  7. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/workflows/test_docker.yml +11 -2
  8. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.gitignore +1 -0
  9. playwright_browserstack-1.62.0/CLAUDE.md +101 -0
  10. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/CONTRIBUTING.md +12 -4
  11. playwright_browserstack-1.62.0/DRIVER_VERSION +1 -0
  12. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/LICENSE.txt +1 -1
  13. playwright_browserstack-1.62.0/NODE_VERSION +1 -0
  14. {playwright-browserstack-1.56.1/playwright_browserstack.egg-info → playwright_browserstack-1.62.0}/PKG-INFO +13 -9
  15. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/README.md +4 -4
  16. playwright_browserstack-1.62.0/RELEASING.md +213 -0
  17. playwright_browserstack-1.62.0/ROLLING.md +24 -0
  18. playwright_browserstack-1.62.0/local-requirements.txt +23 -0
  19. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_android.py +133 -54
  20. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_api_structures.py +54 -2
  21. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_assertions.py +106 -13
  22. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_browser.py +17 -0
  23. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_browser_context.py +70 -74
  24. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_browser_type.py +18 -14
  25. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_cdp_session.py +8 -0
  26. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_connection.py +133 -42
  27. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_console_message.py +21 -1
  28. playwright_browserstack-1.62.0/playwright/_impl/_credentials.py +57 -0
  29. playwright_browserstack-1.62.0/playwright/_impl/_debugger.py +54 -0
  30. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_dialog.py +10 -4
  31. playwright_browserstack-1.62.0/playwright/_impl/_disposable.py +96 -0
  32. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_element_handle.py +23 -7
  33. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_errors.py +5 -1
  34. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_fetch.py +89 -18
  35. playwright_browserstack-1.62.0/playwright/_impl/_form_data.py +34 -0
  36. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_frame.py +103 -15
  37. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_glob.py +10 -1
  38. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_har_router.py +2 -2
  39. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_helper.py +65 -37
  40. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_impl_to_api_mapping.py +17 -1
  41. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_json_pipe.py +20 -9
  42. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_local_utils.py +3 -1
  43. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_locator.py +96 -6
  44. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_network.py +62 -74
  45. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_object_factory.py +6 -0
  46. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_page.py +146 -55
  47. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_playwright.py +6 -3
  48. playwright_browserstack-1.62.0/playwright/_impl/_screencast.py +177 -0
  49. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_set_input_files_helpers.py +3 -1
  50. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_sync_base.py +2 -2
  51. playwright_browserstack-1.62.0/playwright/_impl/_tracing.py +281 -0
  52. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_transport.py +35 -29
  53. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_video.py +13 -28
  54. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_waiter.py +74 -43
  55. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_web_error.py +7 -0
  56. playwright_browserstack-1.62.0/playwright/_impl/_web_storage.py +58 -0
  57. playwright_browserstack-1.62.0/playwright/_repo_version.py +24 -0
  58. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/async_api/__init__.py +73 -9
  59. playwright_browserstack-1.62.0/playwright/async_api/_android_generated.py +462 -0
  60. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/async_api/_generated.py +3744 -1140
  61. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/sync_api/__init__.py +72 -8
  62. playwright_browserstack-1.62.0/playwright/sync_api/_android_generated.py +494 -0
  63. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/sync_api/_generated.py +3673 -1094
  64. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0/playwright_browserstack.egg-info}/PKG-INFO +13 -9
  65. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright_browserstack.egg-info/SOURCES.txt +28 -7
  66. playwright_browserstack-1.62.0/playwright_browserstack.egg-info/scm_file_list.json +445 -0
  67. playwright_browserstack-1.62.0/playwright_browserstack.egg-info/scm_version.json +8 -0
  68. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/pyproject.toml +7 -7
  69. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/requirements.txt +3 -3
  70. playwright_browserstack-1.62.0/scripts/build_driver.py +247 -0
  71. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/documentation_provider.py +106 -27
  72. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/expected_api_mismatch.txt +8 -2
  73. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/generate_api.py +39 -4
  74. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/generate_async_api.py +6 -1
  75. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/generate_sync_api.py +9 -1
  76. playwright_browserstack-1.62.0/scripts/update_api.sh +50 -0
  77. playwright_browserstack-1.62.0/scripts/update_node_version.py +53 -0
  78. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/setup.py +31 -21
  79. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/conftest.py +5 -5
  80. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_add_init_script.py +10 -0
  81. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_assertions.py +88 -11
  82. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_asyncio.py +59 -4
  83. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browser.py +26 -0
  84. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext.py +7 -15
  85. playwright_browserstack-1.62.0/tests/async/test_browsercontext_credentials.py +44 -0
  86. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_events.py +113 -1
  87. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_storage_state.py +52 -0
  88. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsertype_connect.py +50 -0
  89. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsertype_connect_cdp.py +3 -1
  90. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_click.py +50 -16
  91. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_console.py +3 -0
  92. playwright_browserstack-1.62.0/tests/async/test_debugger.py +43 -0
  93. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_dialog.py +12 -0
  94. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_expect_misc.py +1 -1
  95. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_fetch_browser_context.py +121 -2
  96. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_har.py +33 -0
  97. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_launcher.py +9 -0
  98. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_locators.py +259 -1
  99. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_navigation.py +5 -2
  100. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_network.py +40 -0
  101. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page.py +148 -15
  102. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_add_locator_handler.py +51 -0
  103. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_aria_snapshot.py +61 -0
  104. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_clock.py +11 -0
  105. playwright_browserstack-1.62.0/tests/async/test_page_event_console.py +65 -0
  106. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_event_pageerror.py +24 -0
  107. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_network_request.py +21 -0
  108. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_network_response.py +7 -0
  109. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_request_intercept.py +16 -2
  110. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_route.py +29 -0
  111. playwright_browserstack-1.62.0/tests/async/test_page_web_storage.py +90 -0
  112. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_popup.py +6 -0
  113. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_resource_timing.py +2 -3
  114. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_route_web_socket.py +9 -9
  115. playwright_browserstack-1.62.0/tests/async/test_screencast.py +213 -0
  116. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_screenshot.py +16 -0
  117. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_tracing.py +56 -0
  118. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_websocket.py +4 -6
  119. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_worker.py +39 -0
  120. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/conftest.py +20 -0
  121. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/conftest.py +5 -5
  122. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_add_init_script.py +8 -0
  123. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_assertions.py +54 -5
  124. playwright_browserstack-1.62.0/tests/sync/test_browser.py +47 -0
  125. playwright_browserstack-1.62.0/tests/sync/test_browsercontext_credentials.py +42 -0
  126. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_events.py +108 -0
  127. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_storage_state.py +21 -0
  128. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_console.py +3 -0
  129. playwright-browserstack-1.56.1/tests/sync/test_browser.py → playwright_browserstack-1.62.0/tests/sync/test_debugger.py +4 -5
  130. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_expect_misc.py +1 -1
  131. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_fetch_browser_context.py +97 -3
  132. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_har.py +34 -1
  133. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_launcher.py +7 -0
  134. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_locators.py +150 -1
  135. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_network.py +13 -1
  136. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_add_locator_handler.py +49 -0
  137. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_aria_snapshot.py +58 -0
  138. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_clock.py +11 -0
  139. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_event_console.py +13 -0
  140. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_network_response.py +6 -0
  141. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_request_intercept.py +15 -0
  142. playwright_browserstack-1.62.0/tests/sync/test_page_request_timeout.py +36 -0
  143. playwright_browserstack-1.62.0/tests/sync/test_page_web_storage.py +90 -0
  144. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_resource_timing.py +2 -4
  145. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_route_web_socket.py +9 -9
  146. playwright_browserstack-1.62.0/tests/sync/test_screencast.py +157 -0
  147. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_sync.py +6 -0
  148. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_tracing.py +53 -0
  149. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_unroute_behavior.py +16 -1
  150. playwright_browserstack-1.62.0/tests/test_android.py +1036 -0
  151. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/test_reference_count_async.py +13 -2
  152. playwright_browserstack-1.62.0/utils/docker/Dockerfile.resolute +55 -0
  153. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/docker/build.sh +1 -1
  154. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/docker/publish_docker.sh +15 -2
  155. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/linting/check_file_header.py +26 -1
  156. playwright-browserstack-1.56.1/.github/workflows/publish.yml +0 -50
  157. playwright-browserstack-1.56.1/RELEASING.md +0 -126
  158. playwright-browserstack-1.56.1/ROLLING.md +0 -25
  159. playwright-browserstack-1.56.1/conda_build_config_linux_aarch64.yaml +0 -2
  160. playwright-browserstack-1.56.1/conda_build_config_osx_arm64.yaml +0 -2
  161. playwright-browserstack-1.56.1/local-requirements.txt +0 -22
  162. playwright-browserstack-1.56.1/meta.yaml +0 -61
  163. playwright-browserstack-1.56.1/playwright/_impl/_accessibility.py +0 -69
  164. playwright-browserstack-1.56.1/playwright/_impl/_tracing.py +0 -146
  165. playwright-browserstack-1.56.1/playwright/_repo_version.py +0 -21
  166. playwright-browserstack-1.56.1/scripts/update_api.sh +0 -24
  167. playwright-browserstack-1.56.1/tests/async/test_accessibility.py +0 -388
  168. playwright-browserstack-1.56.1/tests/async/test_page_event_console.py +0 -35
  169. playwright-browserstack-1.56.1/tests/sync/test_accessibility.py +0 -393
  170. playwright-browserstack-1.56.1/tests/test_android.py +0 -489
  171. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.azure-pipelines/guardian/SDL/.gdnsuppress +0 -0
  172. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.gitattributes +0 -0
  173. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  174. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  175. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/documentation.yml +0 -0
  176. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  177. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  178. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/ISSUE_TEMPLATE/regression.yml +0 -0
  179. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.github/dependabot.yml +0 -0
  180. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/.pre-commit-config.yaml +0 -0
  181. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/CODE_OF_CONDUCT.md +0 -0
  182. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/LICENSE +0 -0
  183. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/NOTICE +0 -0
  184. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/SECURITY.md +0 -0
  185. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/SUPPORT.md +0 -0
  186. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/__init__.py +0 -0
  187. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_clear_completed_button.py +0 -0
  188. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_counter.py +0 -0
  189. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_editing.py +0 -0
  190. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_item.py +0 -0
  191. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_mark_all_as_completed.py +0 -0
  192. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_new_todo.py +0 -0
  193. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_persistence.py +0 -0
  194. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/test_routing.py +0 -0
  195. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/mvctests/utils.py +0 -0
  196. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/examples/todomvc/requirements.txt +0 -0
  197. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/__init__.py +0 -0
  198. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/__main__.py +0 -0
  199. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/__init__.py +0 -0
  200. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/__pyinstaller/__init__.py +0 -0
  201. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/__pyinstaller/hook-playwright.async_api.py +0 -0
  202. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/__pyinstaller/hook-playwright.sync_api.py +0 -0
  203. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_artifact.py +0 -0
  204. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_async_base.py +0 -0
  205. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_clock.py +0 -0
  206. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_download.py +0 -0
  207. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_driver.py +0 -0
  208. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_event_context_manager.py +0 -0
  209. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_file_chooser.py +0 -0
  210. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_greenlets.py +0 -0
  211. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_input.py +0 -0
  212. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_js_handle.py +0 -0
  213. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_map.py +0 -0
  214. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_path_utils.py +0 -0
  215. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_selectors.py +0 -0
  216. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_str_utils.py +0 -0
  217. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_stream.py +0 -0
  218. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/_impl/_writable_stream.py +0 -0
  219. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/async_api/_context_manager.py +0 -0
  220. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/py.typed +0 -0
  221. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright/sync_api/_context_manager.py +0 -0
  222. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright_browserstack.egg-info/dependency_links.txt +0 -0
  223. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright_browserstack.egg-info/entry_points.txt +0 -0
  224. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright_browserstack.egg-info/requires.txt +0 -0
  225. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/playwright_browserstack.egg-info/top_level.txt +0 -0
  226. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/example_async.py +0 -0
  227. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/example_sync.py +0 -0
  228. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/scripts/update_versions.py +0 -0
  229. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/setup.cfg +0 -0
  230. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/__init__.py +0 -0
  231. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/beforeunload.html +0 -0
  232. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/README.md +0 -0
  233. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/localhost/localhost.csr +0 -0
  234. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/localhost/localhost.ext +0 -0
  235. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/localhost/localhost.key +0 -0
  236. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/localhost/localhost.pem +0 -0
  237. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/self-signed/cert.pem +0 -0
  238. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/self-signed/csr.pem +0 -0
  239. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/self-signed/key.pem +0 -0
  240. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/trusted/cert-legacy.pfx +0 -0
  241. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/trusted/cert.pem +0 -0
  242. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/trusted/cert.pfx +0 -0
  243. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/trusted/csr.pem +0 -0
  244. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/client/trusted/key.pem +0 -0
  245. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/generate.sh +0 -0
  246. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/server/server_cert.pem +0 -0
  247. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client-certificates/server/server_key.pem +0 -0
  248. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/client.py +0 -0
  249. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/consolelog.html +0 -0
  250. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/csp.html +0 -0
  251. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/0.png +0 -0
  252. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/1.png +0 -0
  253. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/2.png +0 -0
  254. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/3.png +0 -0
  255. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/4.png +0 -0
  256. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/5.png +0 -0
  257. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/6.png +0 -0
  258. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/7.png +0 -0
  259. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/8.png +0 -0
  260. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/digits/9.png +0 -0
  261. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/dom.html +0 -0
  262. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/download-blob.html +0 -0
  263. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/drag-n-drop.html +0 -0
  264. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/dummy_bad_browser_executable.js +0 -0
  265. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/empty.html +0 -0
  266. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/error.html +0 -0
  267. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/es6/.eslintrc +0 -0
  268. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/es6/es6import.js +0 -0
  269. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/es6/es6module.js +0 -0
  270. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/es6/es6pathimport.js +0 -0
  271. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-simple/content-script.js +0 -0
  272. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-simple/index.js +0 -0
  273. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-simple/manifest.json +0 -0
  274. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-with-logging/background.js +0 -0
  275. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-with-logging/content.js +0 -0
  276. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/extension-mv3-with-logging/manifest.json +0 -0
  277. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/file-to-upload-2.txt +0 -0
  278. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/file-to-upload.txt +0 -0
  279. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/child-redirect.html +0 -0
  280. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/frame.html +0 -0
  281. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/frameset.html +0 -0
  282. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/nested-frames.html +0 -0
  283. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/one-frame.html +0 -0
  284. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/redirect-my-parent.html +0 -0
  285. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/script.js +0 -0
  286. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/style.css +0 -0
  287. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/frames/two-frames.html +0 -0
  288. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/geolocation.html +0 -0
  289. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/global-var.html +0 -0
  290. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/grid.html +0 -0
  291. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/har-fulfill.har +0 -0
  292. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/har-redirect.har +0 -0
  293. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/har-sha1-main-response.txt +0 -0
  294. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/har-sha1.har +0 -0
  295. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/har.html +0 -0
  296. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/headings.html +0 -0
  297. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/historyapi.html +0 -0
  298. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/injectedfile.js +0 -0
  299. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/injectedstyle.css +0 -0
  300. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/animating-button.html +0 -0
  301. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/button.html +0 -0
  302. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/checkbox.html +0 -0
  303. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/fileupload-multi.html +0 -0
  304. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/fileupload.html +0 -0
  305. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/folderupload.html +0 -0
  306. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/handle-locator.html +0 -0
  307. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/keyboard.html +0 -0
  308. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/mouse-helper.js +0 -0
  309. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/rotatedButton.html +0 -0
  310. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/scrollable.html +0 -0
  311. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/select.html +0 -0
  312. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/textarea.html +0 -0
  313. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/input/touches.html +0 -0
  314. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/mobile.html +0 -0
  315. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/networkidle.html +0 -0
  316. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/networkidle.js +0 -0
  317. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/offscreenbuttons.html +0 -0
  318. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/one-style.css +0 -0
  319. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/one-style.html +0 -0
  320. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/playground.html +0 -0
  321. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/popup/popup.html +0 -0
  322. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/popup/window-open.html +0 -0
  323. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/pptr.png +0 -0
  324. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/react/react-dom@16.13.1.production.min.js +0 -0
  325. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/react/react@16.13.1.production.min.js +0 -0
  326. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/react.html +0 -0
  327. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/sectionselectorengine.js +0 -0
  328. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/self-request.html +0 -0
  329. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/empty/sw.html +0 -0
  330. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/empty/sw.js +0 -0
  331. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/fetch/style.css +0 -0
  332. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/fetch/sw.html +0 -0
  333. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/fetch/sw.js +0 -0
  334. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/fetchdummy/sw.html +0 -0
  335. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/serviceworkers/fetchdummy/sw.js +0 -0
  336. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/shadow.html +0 -0
  337. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/simple.json +0 -0
  338. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/title.html +0 -0
  339. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/worker/worker.html +0 -0
  340. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/worker/worker.js +0 -0
  341. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/assets/wrappedlink.html +0 -0
  342. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/__init__.py +0 -0
  343. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_add_cookies.py +0 -0
  344. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_clearcookies.py +0 -0
  345. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_client_certificates.py +0 -0
  346. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_cookies.py +0 -0
  347. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_proxy.py +0 -0
  348. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_request_fallback.py +0 -0
  349. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_request_intercept.py +0 -0
  350. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_route.py +0 -0
  351. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_browsercontext_service_worker_policy.py +0 -0
  352. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_cdp_session.py +0 -0
  353. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_check.py +0 -0
  354. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_chromium_tracing.py +0 -0
  355. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_context_manager.py +0 -0
  356. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_defaultbrowsercontext.py +0 -0
  357. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_device_descriptors.py +0 -0
  358. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_dispatch_event.py +0 -0
  359. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_download.py +0 -0
  360. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_element_handle.py +0 -0
  361. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_element_handle_wait_for_element_state.py +0 -0
  362. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_emulation_focus.py +0 -0
  363. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_extension.py +0 -0
  364. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_fetch_global.py +0 -0
  365. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_fill.py +0 -0
  366. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_focus.py +0 -0
  367. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_frames.py +0 -0
  368. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_geolocation.py +0 -0
  369. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_headful.py +0 -0
  370. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_ignore_https_errors.py +0 -0
  371. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_input.py +0 -0
  372. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_issues.py +0 -0
  373. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_jshandle.py +0 -0
  374. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_keyboard.py +0 -0
  375. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_listeners.py +0 -0
  376. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_base_url.py +0 -0
  377. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_evaluate.py +0 -0
  378. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_event_request.py +0 -0
  379. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_request_fallback.py +0 -0
  380. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_request_gc.py +0 -0
  381. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_page_select_option.py +0 -0
  382. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_pdf.py +0 -0
  383. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_proxy.py +0 -0
  384. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_queryselector.py +0 -0
  385. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_request_continue.py +0 -0
  386. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_request_fulfill.py +0 -0
  387. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_request_intercept.py +0 -0
  388. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_selector_generator.py +0 -0
  389. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_selectors_get_by.py +0 -0
  390. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_selectors_misc.py +0 -0
  391. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_selectors_text.py +0 -0
  392. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_tap.py +0 -0
  393. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_unroute_behavior.py +0 -0
  394. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_video.py +0 -0
  395. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_wait_for_function.py +0 -0
  396. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/test_wait_for_url.py +0 -0
  397. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/async/utils.py +0 -0
  398. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/common/__init__.py +0 -0
  399. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/common/test_collect_handles.py +0 -0
  400. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/common/test_events.py +0 -0
  401. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/common/test_signals.py +0 -0
  402. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/common/test_threads.py +0 -0
  403. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/grid-cell-0.png +0 -0
  404. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/mask-should-work-with-element-handle.png +0 -0
  405. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/mask-should-work-with-locator.png +0 -0
  406. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/mask-should-work-with-page.png +0 -0
  407. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/mock-binary-response.png +0 -0
  408. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/mock-svg.png +0 -0
  409. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/screenshot-element-bounding-box.png +0 -0
  410. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-chromium/screenshot-sanity.png +0 -0
  411. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/grid-cell-0.png +0 -0
  412. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/mask-should-work-with-element-handle.png +0 -0
  413. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/mask-should-work-with-locator.png +0 -0
  414. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/mask-should-work-with-page.png +0 -0
  415. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/mock-binary-response.png +0 -0
  416. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/mock-svg.png +0 -0
  417. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/screenshot-element-bounding-box.png +0 -0
  418. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-firefox/screenshot-sanity.png +0 -0
  419. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/grid-cell-0.png +0 -0
  420. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/mask-should-work-with-element-handle.png +0 -0
  421. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/mask-should-work-with-locator.png +0 -0
  422. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/mask-should-work-with-page.png +0 -0
  423. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/mock-binary-response.png +0 -0
  424. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/mock-svg.png +0 -0
  425. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/screenshot-element-bounding-box.png +0 -0
  426. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/golden-webkit/screenshot-sanity.png +0 -0
  427. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/server.py +0 -0
  428. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/__init__.py +0 -0
  429. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_client_certificates.py +0 -0
  430. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_request_fallback.py +0 -0
  431. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_request_intercept.py +0 -0
  432. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsercontext_service_worker_policy.py +0 -0
  433. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsertype_connect.py +0 -0
  434. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_browsertype_connect_cdp.py +0 -0
  435. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_cdp_session.py +0 -0
  436. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_check.py +0 -0
  437. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_context_manager.py +0 -0
  438. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_element_handle.py +0 -0
  439. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_element_handle_wait_for_element_state.py +0 -0
  440. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_extension.py +0 -0
  441. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_fetch_global.py +0 -0
  442. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_fill.py +0 -0
  443. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_input.py +0 -0
  444. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_listeners.py +0 -0
  445. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_locator_get_by.py +0 -0
  446. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page.py +0 -0
  447. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_event_pageerror.py +0 -0
  448. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_event_request.py +0 -0
  449. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_request_fallback.py +0 -0
  450. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_request_gc.py +0 -0
  451. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_page_select_option.py +0 -0
  452. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_pdf.py +0 -0
  453. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_queryselector.py +0 -0
  454. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_request_fulfill.py +0 -0
  455. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_request_intercept.py +0 -0
  456. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_selectors_misc.py +0 -0
  457. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_tap.py +0 -0
  458. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/test_video.py +0 -0
  459. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/sync/utils.py +0 -0
  460. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/test_installation.py +0 -0
  461. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/testserver/cert.pem +0 -0
  462. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/testserver/key.pem +0 -0
  463. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/tests/utils.py +0 -0
  464. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/docker/.gitignore +0 -0
  465. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/docker/Dockerfile.jammy +0 -0
  466. {playwright-browserstack-1.56.1 → playwright_browserstack-1.62.0}/utils/docker/Dockerfile.noble +0 -0
@@ -38,8 +38,12 @@ extends:
38
38
  steps:
39
39
  - task: UsePythonVersion@0
40
40
  inputs:
41
- versionSpec: '3.9'
41
+ versionSpec: '3.10'
42
42
  displayName: 'Use Python'
43
+ - task: NodeTool@0
44
+ inputs:
45
+ versionSpec: '24.x'
46
+ displayName: 'Use Node.js'
43
47
  - script: |
44
48
  python -m pip install --upgrade pip
45
49
  pip install -r local-requirements.txt
@@ -60,7 +64,7 @@ extends:
60
64
  targetPath: $(Build.ArtifactStagingDirectory)/esrp-build
61
65
  steps:
62
66
  - checkout: none
63
- - task: EsrpRelease@9
67
+ - task: EsrpRelease@11
64
68
  inputs:
65
69
  connectedservicename: 'Playwright-ESRP-PME'
66
70
  usemanagedidentity: true
@@ -0,0 +1,307 @@
1
+ ---
2
+ name: playwright-roll
3
+ description: Roll Playwright Python to a new driver version. Walks the upstream `docs/src/api/` commit range, ports each public-API change, suppresses the rest in `expected_api_mismatch.txt`, regenerates the typed surface, and adds tests.
4
+ ---
5
+
6
+ # Rolling Playwright Python
7
+
8
+ The goal of a roll is to move the driver pin in `DRIVER_VERSION` to a new release, port every public API change introduced upstream during that interval, and suppress the rest, so that `./scripts/update_api.sh` runs clean and the test suite still passes.
9
+
10
+ The previous human-facing summary lives in `../../../ROLLING.md`. This skill is the operational playbook — read it end to end before starting.
11
+
12
+ ## Mental model
13
+
14
+ The Python port is hand-written code in `playwright/_impl/`, plus a generator (`scripts/generate_*.py`, `scripts/documentation_provider.py`) that:
15
+
16
+ 1. introspects the Python `_impl` classes via `inspect`,
17
+ 2. emits typed wrapper classes into `playwright/{async,sync}_api/_generated.py`, and
18
+ 3. diffs the introspected surface against the Playwright `api.json` (generated from the upstream docs — see step 2).
19
+
20
+ Anything in `api.json` that is missing or differently typed in `_impl/` causes generation to fail. Three resolutions:
21
+
22
+ - **PORT** — the new API is intended for Python (no `langs.only` filter, or `langs.only` includes `"python"`). Implement it in `_impl/`.
23
+ - **MISMATCH** — the API genuinely exists for Python but is shaped differently (a callback signature uses unions, a kwarg uses a legacy name, etc.) and there's a justified reason to keep the divergence. Add a precise line to `scripts/expected_api_mismatch.txt` with a comment explaining *why*.
24
+ - **N/A** — the commit only touches docs, has `* langs: js` (or any other filter that excludes Python), is server-side, Electron-only, or was reverted later in the same release. No action.
25
+
26
+ The upstream documentation source of truth is `docs/src/api/*.md` in the playwright repo. Every `## method:` / `## property:` / `## event:` / `### option:` / `### param:` block has an optional `* langs: js` (or `js, python`, etc.) filter. The Python doclint resolves these into `langs` fields on each member of `api.json`. **An empty `langs: {}` means "all languages including Python" — *implement it*, don't suppress it.**
27
+
28
+ > **The mistake the 1.59 roll made twice over:** classifying things as "internal tooling, N/A for Python" based on the *name* of the API (Screencast, Debugger, pickLocator, clearConsoleMessages, artifactsDir, …). Almost all of those had empty `langs: {}` in `api.json` and were real Python APIs. Sounding tooling-y is not a `langs` filter. **The `langs` field on the member in `api.json` is the only authoritative signal.** When in doubt, dump it (see "Verifying classifications" below).
29
+
30
+ ## Process
31
+
32
+ ### 1. Set up the env
33
+
34
+ `CONTRIBUTING.md` covers this. Notes from past rolls:
35
+
36
+ - The repo requires Python 3.10+. If `python3.10` isn't available, use `python3` (3.12 is fine).
37
+ - If `python3-venv` is missing system-wide, use `uv venv env` instead, then `uv pip install --python env/bin/python --upgrade pip`. Don't try to `apt install` — sudo is denied in the harness.
38
+ - Always activate the venv before any `pip`, `pytest`, `mypy`, or `pre-commit` invocation.
39
+
40
+ ### 2. Bump the driver pin, download it, and generate api.json
41
+
42
+ You need a nearby `microsoft/playwright` checkout for the docs walk and for
43
+ `api.json` generation. Point `PW_SRC_DIR` at it and check out the new tag there:
44
+
45
+ ```sh
46
+ export PW_SRC_DIR=../playwright
47
+ git -C "$PW_SRC_DIR" fetch --tags origin
48
+ git -C "$PW_SRC_DIR" checkout v<new> # e.g. v1.62.0
49
+ ```
50
+
51
+ Then bump the pins and assemble the driver:
52
+
53
+ ```sh
54
+ # Edit DRIVER_VERSION (repo root): the playwright-core npm version for the new
55
+ # release, no "v" prefix, e.g. 1.62.0
56
+ python scripts/update_node_version.py # refresh NODE_VERSION to the current LTS
57
+
58
+ source env/bin/activate
59
+ python -m build --wheel # downloads playwright-core @ DRIVER_VERSION + Node.js, assembles the driver
60
+ playwright install chromium # NOT --with-deps; sudo is denied
61
+
62
+ # api.json isn't in the bundle, and the walk below inspects `langs` from it.
63
+ # Generate a copy to inspect (update_api.sh generates its own temp copy in step 6):
64
+ API_JSON_MODE=1 node "$PW_SRC_DIR/utils/doclint/generateApiJson.js" > /tmp/api.json
65
+ ```
66
+
67
+ The wheel build just downloads the `playwright-core` npm package at
68
+ `DRIVER_VERSION` and the matching Node.js binary (no source build, no Node/npm/git
69
+ toolchain), and unpacks the driver under `playwright/driver/`. `api.json` is the
70
+ one piece not shipped in the bundle — it's generated from `$PW_SRC_DIR` on demand
71
+ (here to `/tmp/api.json` for the walk, and into a temp file passed via
72
+ `PW_API_JSON` by `./scripts/update_api.sh` during codegen).
73
+
74
+ ### 3. Identify the commit range
75
+
76
+ Use the nearby `microsoft/playwright` checkout at `$PW_SRC_DIR` (from step 2).
77
+ Bring it up to date and ensure release branches/tags are present before walking
78
+ the range:
79
+
80
+ ```sh
81
+ git -C "$PW_SRC_DIR" fetch --tags
82
+ git -C "$PW_SRC_DIR" fetch origin 'release-*:release-*'
83
+ ```
84
+
85
+ There is sometimes no `vX.Y.0` tag for the latest release (the bots cut release branches first and tag later). Anchor on commits, not tags.
86
+
87
+ The diff range is "every commit on the new release branch since the previous release was cut". Anchor commits:
88
+
89
+ - **Previous release end**: the `chore: bump version to vX.Y.0-next` commit on `main`. That commit is the first commit *after* the previous release (X.Y-1) was cut. Use its parent (`<sha>~1`) as the lower bound.
90
+ ```sh
91
+ git -C "$PW_SRC_DIR" log --all --grep="bump version to v" --oneline | head
92
+ ```
93
+ - **New release end**: the tip of `release-<new>` (or the matching tag if it exists).
94
+
95
+ Save the commit list, oldest first, scoped to `docs/src/api/`:
96
+
97
+ ```sh
98
+ git -C "$PW_SRC_DIR" log <prev-anchor>~1..release-<new> --oneline --reverse -- docs/src/api > /tmp/roll-<new>-commits.md
99
+ ```
100
+
101
+ A normal roll yields 50–100 commits. If you see 0 or thousands, the range is wrong.
102
+
103
+ Format the file as a markdown checklist and add the standard preamble (status legend, where to look up `api.json` etc.) — see the file from the 1.58→1.59 roll for the template.
104
+
105
+ ### 4. Walk the commit list
106
+
107
+ For each commit, in chronological order:
108
+
109
+ ```sh
110
+ git -C "$PW_SRC_DIR" show <sha> -- docs/src/api/
111
+ ```
112
+
113
+ Look for:
114
+ - `## (async )?method:` / `## property:` / `## event:` additions or removals;
115
+ - `* langs: ...` lines on those blocks;
116
+ - `### param:` / `### option:` additions or removals;
117
+ - new `class-X.md` files (whole new classes — usually `langs: js`);
118
+ - type changes in `- returns:` lines.
119
+
120
+ Classify and act.
121
+
122
+ #### Verifying classifications (do this before suppressing anything)
123
+
124
+ Before tagging anything as MISMATCH or N/A based on appearance, dump the actual `langs` from `api.json`:
125
+
126
+ ```python
127
+ import json
128
+ data = json.load(open("/tmp/api.json"))
129
+ classes = {c["name"]: c for c in data}
130
+ for cls_name in ["Page", "BrowserContext", "Screencast", "Debugger"]:
131
+ cls = classes.get(cls_name)
132
+ if not cls:
133
+ continue
134
+ print(f"\n{cls_name}: cls_langs={cls.get('langs', {})}")
135
+ for m in cls["members"]:
136
+ print(f" {m['name']} kind={m.get('kind')} langs={m.get('langs', {})}")
137
+ ```
138
+
139
+ For options/params nested inside an `Object`-typed arg, walk one level deeper:
140
+
141
+ ```python
142
+ for a in member.get("args", []):
143
+ if a["name"] == "options":
144
+ for prop in a.get("type", {}).get("properties", []):
145
+ print(prop["name"], prop.get("langs", {}))
146
+ ```
147
+
148
+ A few rules of thumb that catch most "actually a PORT" cases:
149
+ - If the *containing class* has empty `langs: {}` and the *member* has empty `langs: {}`, it's for Python — implement it.
150
+ - If the member is empty but a single *option* has `langs: js`, the method is for Python and you only skip that option (e.g. `Screencast.start.size` is `langs: js` while `Screencast.start` itself isn't).
151
+ - If you're about to add three or more `Method not implemented:` entries for the same class, stop — you almost certainly need to implement the class.
152
+
153
+ #### PORT
154
+
155
+ Implement the change in `playwright/_impl/<module>.py`. Use the upstream JS implementation as a reference: `$PW_SRC_DIR/packages/playwright-core/src/client/<module>.ts`. Translate idioms:
156
+
157
+ | Upstream JS | Python |
158
+ |---|---|
159
+ | `async foo(): Promise<X>` | `async def foo(self) -> X:` |
160
+ | `foo(): X` (sync getter, no args, no body) | `@property def foo(self) -> X:` (the doc generator treats argument-less sync getters as properties — see `documentation_provider.py:133`. If you make it a method instead, you'll get a "Method vs property mismatch" error.) |
161
+ | `await this._channel.foo({ a, b })` | `await self._channel.send("foo", None, locals_to_params(locals()))` |
162
+ | `(await this._channel.foo()).value` | `await self._channel.send("foo", None)` (Python's `send()` auto-unwraps single-key responses; only call `send_return_as_dict` when the protocol returns multiple keys.) |
163
+ | `(await this._channel.foo()).artifact` (multi-key, may be empty) | `result = await self._channel.send_return_as_dict("foo", None); (result or {}).get("artifact")` — `send_return_as_dict` returns **`None`** (not `{}`) when the protocol response carries no fields. |
164
+ | `try { ... } catch (e) { if (isTargetClosedError(e)) return; throw e; }` | `try: ...; except Exception as e: if is_target_closed_error(e): return; raise` (import from `playwright._impl._errors`) |
165
+ | Inline `[Object]` return like `{endpoint: string}` | A `TypedDict` in `playwright/_impl/_api_structures.py` — *not* `Dict[str, str]`. The doc generator serializes TypedDicts as `{field: type, ...}` via `get_type_hints` and that matches the inline-object form exactly. See `RemoteAddr`, `BrowserBindResult`, `DebuggerPausedDetails`. |
166
+ | `binary` event/return field | The Python channel layer hands you a base64 string. Decode with `base64.b64decode(value)` before exposing as `bytes`. See `Screencast._dispatch_frame`. |
167
+
168
+ When implementing a new ChannelOwner subclass (one constructed by the protocol with `(parent, type, guid, initializer)`):
169
+ 1. Register it in `playwright/_impl/_object_factory.py:create_remote_object` — otherwise the guid resolves to `DummyObject` and downstream code breaks mysteriously.
170
+ 2. Import it and add it to `generated_types` in `scripts/generate_api.py`, plus add a `XxxImpl` import in the `header` string.
171
+
172
+ When implementing a non-ChannelOwner wrapper class (a plain class that holds a Page/Context reference, like `Screencast`, `Clock`):
173
+ - Set `self._loop = parent._loop` and `self._dispatcher_fiber = parent._dispatcher_fiber` in `__init__`. The generated `AsyncBase`/`SyncBase` wrappers read these; missing them gives `AttributeError: 'X' object has no attribute '_loop'` at first use.
174
+
175
+ When adding a new TypedDict in `_api_structures.py`:
176
+ - Add it to the `from playwright._impl._api_structures import …` line in `scripts/generate_api.py` so the generator can resolve it as a forward reference in type hints.
177
+ - Re-export it from both `playwright/async_api/__init__.py` and `playwright/sync_api/__init__.py`: assignment line plus an entry in `__all__`. Same pattern as `ViewportSize`, `RemoteAddr`.
178
+
179
+ If the new API was previously suppressed in `expected_api_mismatch.txt`, **remove that line** when implementing it.
180
+
181
+ If a doc rename involves a *positional* parameter (no default, before any `*`), users almost certainly call it positionally — you can rename freely. The 1.59 `BrowserType.connect.wsEndpoint` → `endpoint` is the canonical example. Don't suppress this kind of rename; just rename in `_impl/`. **Important corollary:** when docs rename a param, the wire-protocol field usually also changed in `packages/protocol/src/protocol.yml` and the server-side dispatcher in `packages/playwright-core/src/server/dispatchers/*Dispatcher.ts`. If so, you must also update the channel-send dict key (e.g. `{"wsEndpoint": …}` → `{"endpoint": …}`). A "Parameter not documented" suppression for a renamed param is a code smell hiding a wire-protocol bug.
182
+
183
+ #### MISMATCH
184
+
185
+ A MISMATCH is a *justified, durable* divergence between the docs and the Python surface. Use it sparingly — most apparent mismatches turn out to be PORTs you skipped. Legitimate examples in the current `expected_api_mismatch.txt`:
186
+
187
+ - Hidden internal kwargs (`Browser.new_context(default_browser_type=)`).
188
+ - Callback signatures where Python explicitly unions one-arg and two-arg variants but the docs document only the canonical form (`Page.route(handler=)`, `WebSocketRoute.on_close(handler=)`).
189
+
190
+ Add a precise line to `scripts/expected_api_mismatch.txt` with a `# comment` group header explaining *why* the divergence is intentional. The exact wording comes from the generator's error message. Examples:
191
+
192
+ ```
193
+ # One vs two arguments in the callback, Python explicitly unions.
194
+ Parameter type mismatch in Page.route(handler=): documented as Callable[[Route, Request], Union[Any, Any]], code has Union[Callable[[Route, Request], Any], Callable[[Route], Any]]
195
+ ```
196
+
197
+ The generator removes lines from `expected_api_mismatch.txt` that no longer match an error. If you see "No longer there: …" in the script's stderr, delete that line.
198
+
199
+ **Do not suppress** these — they're PORTs in disguise:
200
+
201
+ - "Internal tooling" classes/methods whose `langs` field is empty (`Screencast.*`, `Debugger.*`, `Page.pick_locator`, `BrowserContext.debugger`, `Browser.bind/unbind`, `Page.{clear,console}_*`). The 1.59 roll suppressed all of these initially, then had to walk every one back. Verify `langs` first.
202
+ - A renamed positional parameter (`Parameter not documented: X.y(old_name=)` + `Parameter not implemented: X.y(new_name=)`). Just rename in `_impl/` and update the channel-send dict key.
203
+ - A `Parameter type mismatch in X.y(return=): documented as {field: T}, code has Dict[str, T]`. Use a TypedDict.
204
+
205
+ #### N/A
206
+
207
+ Common N/A flavors:
208
+ - Whole new class with `langs: js` (Disposable, Inspector/Screencast, Debugger, Overlay).
209
+ - Members with `langs: js` (most "tooling" / MCP / agentic features).
210
+ - Doc-only edits (typo fixes, "Improve `not` property sections", etc.).
211
+ - Reverts that cancel an earlier add in the same range (always check the rest of the range before porting something that gets reverted).
212
+ - Java/C# `langs:` blocks.
213
+ - Electron-only changes (`docs/src/api/class-electron.md`).
214
+
215
+ Tick the box in `/tmp/roll-<new>-commits.md` with one line: `[x] <sha> <subject> — <classification>: <one-liner>`.
216
+
217
+ ### 5. Regenerate
218
+
219
+ ```sh
220
+ PW_SRC_DIR=../playwright ./scripts/update_api.sh # PW_SRC_DIR already exported in step 2
221
+ ```
222
+
223
+ The script does, in order:
224
+ 1. generates `api.json` from `$PW_SRC_DIR` into a temp file and exports `PW_API_JSON`,
225
+ 2. `git checkout HEAD -- playwright/{async,sync}_api/_generated.py` (resets to last committed),
226
+ 3. runs `scripts/generate_{sync,async}_api.py` (they read `api.json` via `PW_API_JSON`), dumping to `.x` then renaming into place,
227
+ 4. invokes `pre-commit run --files` on the generated files.
228
+
229
+ **CI no longer verifies that `_generated.py` is in sync** (the Lint job dropped the
230
+ "Verify generated API is up to date" step so it needn't check out upstream). So
231
+ regenerating here and committing the result is on you — don't skip it.
232
+
233
+ Failure modes and fixes:
234
+
235
+ | Symptom | Cause | Fix |
236
+ |---|---|---|
237
+ | `Method not implemented: X.y` | `api.json` documents `X.y`, no Python impl exists. | PORT it, or add a MISMATCH line. |
238
+ | `Parameter not implemented: X.y(z=)` | New parameter on existing method. | Add the kwarg in `_impl/`, or MISMATCH. |
239
+ | `Method vs property mismatch: X.y` | You implemented as a method but the doc treats it as a property (sync, no args, has return type). | Add `@property` in `_impl/`. |
240
+ | `Method not documented: X.y` | Python has it but `api.json` doesn't. | The upstream removed the API; remove from `_impl/` and from `_generated.py` callers. |
241
+ | `Parameter type mismatch in X.y(z=): documented as ..., code has ...` | Type signature doesn't line up. | Match the type in `_impl/`, or MISMATCH it for known historical divergences. |
242
+ | `pyright … reportInconsistentOverload` (single-event class) | A class gained its first event in `api.json`, so the generator emits one `Literal[…]` overload + impl, which pyright wants ≥2 of. | The generator already handles this — `documentation_provider.print_events` emits a second `@typing.overload` with `event: str` plus a generic impl. If you regress this, see how 1.59 handled `CDPSession` getting a `close` event. |
243
+ | `pre-commit` keeps reformatting `_generated.py` on each run | First run after regen always reformats once; rerun until idle. | `pre-commit run --all-files` to settle. |
244
+ | `Parameter not documented: X.y(z=)` | Python has a kwarg the docs don't mention (e.g. legacy name from a doc rename). | If the param is positional with no default, just rename it in `_impl/`. Check `protocol.yml` and the server dispatcher — if the wire field renamed too, also update the channel-send dict key. Only MISMATCH for genuinely hidden internal kwargs (`default_browser_type`). |
245
+ | `KeyError: 'templates'` deep in `inner_serialize_doc_type` | A `Promise<X>\|X` union upstream collapsed to a bare `Promise` with no templates in `api.json`. | `documentation_provider.inner_serialize_doc_type` should treat that as `Any` (`if "templates" not in type: return "Any"`). |
246
+ | `"void" is not defined (reportUndefinedVariable)` in generated event handlers | `api.json` has a `void`-typed event payload that the serializer left as the literal string `"void"`. | `documentation_provider.inner_serialize_doc_type` should map `"void"` to `"None"` alongside `"null"`. |
247
+ | `AttributeError: 'X' object has no attribute '_loop'` (or `_dispatcher_fiber`) at first use of a new wrapper class | The non-ChannelOwner wrapper isn't initializing the fields the generated `AsyncBase`/`SyncBase` reads. | In the wrapper's `__init__`, set `self._loop = parent._loop` and `self._dispatcher_fiber = parent._dispatcher_fiber`. |
248
+ | `'NoneType' object has no attribute 'get'` after `send_return_as_dict` | Method's protocol response carries no fields and `send_return_as_dict` returned `None`. | `(result or {}).get(...)`. |
249
+ | Frame/buffer payload arrives as a `str` instead of `bytes` | Protocol `binary` fields cross the wire as base64. | `base64.b64decode(value)` in the impl before exposing. |
250
+
251
+ After the script settles, run `pre-commit run --all-files` once more to confirm everything is idle.
252
+
253
+ ### 6. Add tests
254
+
255
+ For each PORT, add one async test and a matching sync test. Conventions:
256
+
257
+ - Tests go in the existing topic file (`test_page_network_request.py`, `test_browsercontext.py`, `test_dialog.py`, …) — don't create new files unless there's no obvious home.
258
+ - Use `from playwright.async_api import …`, **not** `from playwright._impl._page import Page` (the impl class doesn't have the public wrappers like `expect_console_message`).
259
+ - For event-info objects, `await message_info.value` (it's an `async` property).
260
+ - Don't write tests that hang the page (e.g. `page.evaluate(... fetch slow ...)` followed by `page.close()` from a fixture) — the request task gets a `TargetClosedError`. Use `page.on("event", handler)` to capture state at event time instead.
261
+ - `playwright install chromium` (no `--with-deps`) is sufficient for the test suite under sandbox.
262
+
263
+ ### 7. Update existing high-touch artifacts
264
+
265
+ - `DRIVER_VERSION` and `NODE_VERSION`: already done in step 2.
266
+ - `README.md`: gets the chromium/firefox/webkit version table updated automatically by `scripts/update_versions.py` (called from `update_api.sh`). Don't edit by hand.
267
+ - The "Backport changes" tracking issue on GitHub (filed by `microsoft-playwright-automation`) is the *intent* tracker, but it's frequently out of sync with what's actually been ported. Treat it as a starting point, not the source of truth — the `docs/src/api/` commit walk is authoritative.
268
+
269
+ ### 8. Final verification
270
+
271
+ ```sh
272
+ pre-commit run --all-files
273
+ mypy playwright # 2 pre-existing errors in _json_pipe.py and _artifact.py are unrelated
274
+ pytest --browser chromium tests/async/<files-you-touched> tests/sync/<files-you-touched>
275
+ ```
276
+
277
+ Then a smoke regression on a few neighboring suites (`tests/async/test_browser*.py`, `test_cdp_session.py`, `test_tracing.py`, `test_dialog.py`, `test_page_*.py`) to make sure nothing inherent to the port shifted.
278
+
279
+ ## Reference: `expected_api_mismatch.txt` line forms
280
+
281
+ Exact strings the generator emits (and that this file must contain to suppress):
282
+
283
+ ```
284
+ Method not implemented: <Class>.<snake_method>
285
+ Parameter not implemented: <Class>.<snake_method>(<snake_param>=)
286
+ Parameter not documented: <Class>.<snake_method>(<snake_param>=)
287
+ Method vs property mismatch: <Class>.<snake_method>
288
+ Method not documented: <Class>.<snake_method>
289
+ Parameter type mismatch in <Class>.<snake_method>(<arg>=): documented as <T1>, code has <T2>
290
+ ```
291
+
292
+ Class names use the upstream PascalCase (`BrowserContext`, `BrowserType`); method/param names are converted to `snake_case` matching the Python surface.
293
+
294
+ ## Tips & gotchas
295
+
296
+ - **`langs.only` is your filter — and the only filter.** Don't classify by name (`Screencast`, `Debugger`, `pickLocator`) or by intuition ("looks like internal tooling"). Always check `langs` in `api.json`. The 1.59 roll cost two extra audit passes by trusting names over `langs`.
297
+ - **Audit your own classifications a second time.** After the first walk through the commit range, before opening the PR, re-read every line in `expected_api_mismatch.txt` you added during this roll and ask "is this divergence justified, or did I skip a port?" Run the `langs`-dump snippet on each suspicious entry. The 1.59 roll's first PR had ~20 wrong suppressions; the second pass cut them to 0.
298
+ - **A cluster of suppressions on the same class is a smell.** If you're about to add five `Method not implemented: Foo.*` lines, you're almost certainly looking at a class that needs to be implemented. Implement the whole thing once and the suppressions disappear.
299
+ - **Watch for revert pairs in the same range.** 1.59 added and reverted `Browser.isRemote` (#39613 / #39620) inside the same release. Walking chronologically lets you skip the add when you see the revert later.
300
+ - **Watch for rename-revert pairs.** 1.59 had `Locator.normalize` → `Locator.toCode` (#39648) → `Locator.normalize` (#39754). Final state wins; only port the last.
301
+ - **Doc renames almost always include a wire-protocol rename.** Whenever you see `### param: X.y.oldName` → `### param: X.y.newName` in a doc commit, also `git -C "$PW_SRC_DIR" show <sha> -- packages/protocol/src/protocol.yml` and the corresponding `*Dispatcher.ts` file. If the wire field changed too, the channel-send dict key in `_impl/` must change. Suppressing the doc-side mismatch is hiding a real bug — the previous Python code is silently sending an unknown field that the new server ignores.
302
+ - **TypedDicts beat `Dict[str, X]` for any structured return.** When the docs describe a return as `[Object]` with named fields (or even `[Object=Foo]`), define a `TypedDict` in `_api_structures.py`, re-export from both public `__init__.py` files, and use it. Zero runtime cost (it's still a `dict`), and the doc generator's type comparator matches by structure via `get_type_hints`.
303
+ - **Positional renames are free.** A param with no default before any `*` separator is positional-or-keyword in Python, but realistic call sites pass it positionally. Renaming such a param doesn't break callers.
304
+ - **The "Backport changes" GitHub issue can be misleading.** In the 1.59 roll its checkboxes were all marked `[x]` with annotations like "✅ IMPLEMENTED", but several of those features had not actually been merged into the Python port. Trust the `docs/src/api/` walk over the issue.
305
+ - **`api.json` may carry doclint quirks.** 1.59 hit two: `Promise<X>|X` collapsed to a bare `Promise` with no `templates`, and `void`-typed events serialized as the literal string `"void"`. Both are upstream artifacts; patch `inner_serialize_doc_type` to handle them rather than fighting the api.json side.
306
+ - **Don't edit `_generated.py` to fix lint or typing.** Fix `_impl/`, `documentation_provider.py`, or `expected_api_mismatch.txt` instead. Hand-editing the generated file is reverted on the next regen.
307
+ - **`/tmp/roll-<new>-commits.md` is a working artifact, not a deliverable.** Don't commit it. The commit message and PR description are where the audit summary belongs.
@@ -0,0 +1,5 @@
1
+ # actionlint's built-in runner-label list predates GitHub's arm64 Windows
2
+ # runners, so declare the ones this repo's workflows use.
3
+ self-hosted-runner:
4
+ labels:
5
+ - windows-11-arm
@@ -21,25 +21,19 @@ jobs:
21
21
  name: Lint
22
22
  runs-on: ubuntu-latest
23
23
  steps:
24
- - uses: actions/checkout@v5
24
+ - uses: actions/checkout@v7
25
25
  - name: Set up Python
26
- uses: actions/setup-python@v6
26
+ uses: actions/setup-python@v7
27
27
  with:
28
28
  python-version: "3.10"
29
- - name: Install dependencies & browsers
29
+ - name: Install dependencies
30
30
  run: |
31
31
  python -m pip install --upgrade pip
32
32
  pip install -r local-requirements.txt
33
33
  pip install -r requirements.txt
34
34
  pip install -e .
35
- python -m build --wheel
36
- python -m playwright install --with-deps
37
35
  - name: Lint
38
36
  run: pre-commit run --show-diff-on-failure --color=always --all-files
39
- - name: Generate APIs
40
- run: bash scripts/update_api.sh
41
- - name: Verify generated API is up to date
42
- run: git diff --exit-code
43
37
 
44
38
  build:
45
39
  name: Build
@@ -48,9 +42,20 @@ jobs:
48
42
  fail-fast: false
49
43
  matrix:
50
44
  os: [ubuntu-latest, windows-latest, macos-latest]
51
- python-version: ['3.9', '3.10']
45
+ python-version: ['3.10', '3.14']
52
46
  browser: [chromium, firefox, webkit]
47
+ exclude:
48
+ # WebKit on standard macOS-latest (currently macos-15-arm64) is unstable;
49
+ # upstream pins paid macos-15-xlarge for cross-browser webkit too.
50
+ - os: macos-latest
51
+ browser: webkit
53
52
  include:
53
+ - os: macos-15-xlarge
54
+ python-version: '3.10'
55
+ browser: webkit
56
+ - os: macos-15-xlarge
57
+ python-version: '3.14'
58
+ browser: webkit
54
59
  - os: windows-latest
55
60
  python-version: '3.11'
56
61
  browser: chromium
@@ -80,9 +85,9 @@ jobs:
80
85
  browser: chromium
81
86
  runs-on: ${{ matrix.os }}
82
87
  steps:
83
- - uses: actions/checkout@v5
88
+ - uses: actions/checkout@v7
84
89
  - name: Set up Python
85
- uses: actions/setup-python@v6
90
+ uses: actions/setup-python@v7
86
91
  with:
87
92
  python-version: ${{ matrix.python-version }}
88
93
  - name: Install dependencies & browsers
@@ -127,9 +132,9 @@ jobs:
127
132
  browser-channel: msedge
128
133
  runs-on: ${{ matrix.os }}
129
134
  steps:
130
- - uses: actions/checkout@v5
135
+ - uses: actions/checkout@v7
131
136
  - name: Set up Python
132
- uses: actions/setup-python@v6
137
+ uses: actions/setup-python@v7
133
138
  with:
134
139
  python-version: "3.10"
135
140
  - name: Install dependencies & browsers
@@ -155,28 +160,6 @@ jobs:
155
160
  if: matrix.os == 'ubuntu-latest'
156
161
  run: xvfb-run pytest tests/async --browser=chromium --browser-channel=${{ matrix.browser-channel }} --timeout 90
157
162
 
158
- build-conda:
159
- name: Conda Build
160
- strategy:
161
- fail-fast: false
162
- matrix:
163
- os: [ubuntu-22.04, macos-13, windows-2022]
164
- runs-on: ${{ matrix.os }}
165
- steps:
166
- - uses: actions/checkout@v5
167
- with:
168
- fetch-depth: 0
169
- - name: Get conda
170
- uses: conda-incubator/setup-miniconda@v3
171
- with:
172
- python-version: 3.9
173
- channels: conda-forge
174
- miniconda-version: latest
175
- - name: Prepare
176
- run: conda install conda-build conda-verify
177
- - name: Build
178
- run: conda build .
179
-
180
163
  test_examples:
181
164
  name: Examples
182
165
  runs-on: ubuntu-22.04
@@ -184,9 +167,9 @@ jobs:
184
167
  run:
185
168
  working-directory: examples/todomvc/
186
169
  steps:
187
- - uses: actions/checkout@v5
170
+ - uses: actions/checkout@v7
188
171
  - name: Set up Python
189
- uses: actions/setup-python@v6
172
+ uses: actions/setup-python@v7
190
173
  with:
191
174
  python-version: '3.10'
192
175
  - name: Install dependencies & browsers