playwright-browserstack 1.62.0__py3-none-win_amd64.whl

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 (192) hide show
  1. playwright/__init__.py +19 -0
  2. playwright/__main__.py +33 -0
  3. playwright/_impl/__init__.py +0 -0
  4. playwright/_impl/__pyinstaller/__init__.py +20 -0
  5. playwright/_impl/__pyinstaller/hook-playwright.async_api.py +17 -0
  6. playwright/_impl/__pyinstaller/hook-playwright.sync_api.py +17 -0
  7. playwright/_impl/_android.py +704 -0
  8. playwright/_impl/_api_structures.py +365 -0
  9. playwright/_impl/_artifact.py +87 -0
  10. playwright/_impl/_assertions.py +1124 -0
  11. playwright/_impl/_async_base.py +105 -0
  12. playwright/_impl/_browser.py +293 -0
  13. playwright/_impl/_browser_context.py +754 -0
  14. playwright/_impl/_browser_type.py +368 -0
  15. playwright/_impl/_cdp_session.py +46 -0
  16. playwright/_impl/_clock.py +104 -0
  17. playwright/_impl/_connection.py +764 -0
  18. playwright/_impl/_console_message.py +98 -0
  19. playwright/_impl/_credentials.py +57 -0
  20. playwright/_impl/_debugger.py +54 -0
  21. playwright/_impl/_dialog.py +63 -0
  22. playwright/_impl/_disposable.py +96 -0
  23. playwright/_impl/_download.py +64 -0
  24. playwright/_impl/_driver.py +41 -0
  25. playwright/_impl/_element_handle.py +480 -0
  26. playwright/_impl/_errors.py +64 -0
  27. playwright/_impl/_event_context_manager.py +33 -0
  28. playwright/_impl/_fetch.py +626 -0
  29. playwright/_impl/_file_chooser.py +57 -0
  30. playwright/_impl/_form_data.py +34 -0
  31. playwright/_impl/_frame.py +985 -0
  32. playwright/_impl/_glob.py +65 -0
  33. playwright/_impl/_greenlets.py +49 -0
  34. playwright/_impl/_har_router.py +122 -0
  35. playwright/_impl/_helper.py +601 -0
  36. playwright/_impl/_impl_to_api_mapping.py +158 -0
  37. playwright/_impl/_input.py +111 -0
  38. playwright/_impl/_js_handle.py +336 -0
  39. playwright/_impl/_json_pipe.py +97 -0
  40. playwright/_impl/_local_utils.py +95 -0
  41. playwright/_impl/_locator.py +1024 -0
  42. playwright/_impl/_map.py +31 -0
  43. playwright/_impl/_network.py +1017 -0
  44. playwright/_impl/_object_factory.py +116 -0
  45. playwright/_impl/_page.py +1637 -0
  46. playwright/_impl/_path_utils.py +27 -0
  47. playwright/_impl/_playwright.py +68 -0
  48. playwright/_impl/_screencast.py +177 -0
  49. playwright/_impl/_selectors.py +67 -0
  50. playwright/_impl/_set_input_files_helpers.py +158 -0
  51. playwright/_impl/_str_utils.py +76 -0
  52. playwright/_impl/_stream.py +46 -0
  53. playwright/_impl/_sync_base.py +151 -0
  54. playwright/_impl/_tracing.py +281 -0
  55. playwright/_impl/_transport.py +184 -0
  56. playwright/_impl/_video.py +56 -0
  57. playwright/_impl/_waiter.py +197 -0
  58. playwright/_impl/_web_error.py +48 -0
  59. playwright/_impl/_web_storage.py +58 -0
  60. playwright/_impl/_writable_stream.py +42 -0
  61. playwright/_repo_version.py +24 -0
  62. playwright/async_api/__init__.py +275 -0
  63. playwright/async_api/_android_generated.py +462 -0
  64. playwright/async_api/_context_manager.py +57 -0
  65. playwright/async_api/_generated.py +23875 -0
  66. playwright/driver/LICENSE +2946 -0
  67. playwright/driver/README.md +1 -0
  68. playwright/driver/node.exe +0 -0
  69. playwright/driver/package/LICENSE +202 -0
  70. playwright/driver/package/NOTICE +5 -0
  71. playwright/driver/package/README.md +3 -0
  72. playwright/driver/package/ThirdPartyNotices.txt +13 -0
  73. playwright/driver/package/bin/install_media_pack.ps1 +5 -0
  74. playwright/driver/package/bin/install_webkit_wsl.ps1 +33 -0
  75. playwright/driver/package/bin/reinstall_chrome_beta_linux.sh +42 -0
  76. playwright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
  77. playwright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  78. playwright/driver/package/bin/reinstall_chrome_stable_linux.sh +42 -0
  79. playwright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
  80. playwright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  81. playwright/driver/package/bin/reinstall_msedge_beta_linux.sh +48 -0
  82. playwright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
  83. playwright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  84. playwright/driver/package/bin/reinstall_msedge_dev_linux.sh +48 -0
  85. playwright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
  86. playwright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  87. playwright/driver/package/bin/reinstall_msedge_stable_linux.sh +48 -0
  88. playwright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
  89. playwright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  90. playwright/driver/package/browsers.json +75 -0
  91. playwright/driver/package/cli.js +21 -0
  92. playwright/driver/package/index.d.ts +17 -0
  93. playwright/driver/package/index.js +17 -0
  94. playwright/driver/package/index.mjs +28 -0
  95. playwright/driver/package/lib/bootstrap.js +88 -0
  96. playwright/driver/package/lib/coreBundle.js +74830 -0
  97. playwright/driver/package/lib/entry/cliDaemon.js +5 -0
  98. playwright/driver/package/lib/entry/dashboardApp.js +3 -0
  99. playwright/driver/package/lib/entry/mcp.js +10 -0
  100. playwright/driver/package/lib/entry/oopBrowserDownload.js +3 -0
  101. playwright/driver/package/lib/package.js +50 -0
  102. playwright/driver/package/lib/server/chromium/appIcon.png +0 -0
  103. playwright/driver/package/lib/server/electron/loader.js +118 -0
  104. playwright/driver/package/lib/serverRegistry.js +7347 -0
  105. playwright/driver/package/lib/serverRegistry.js.LICENSE +354 -0
  106. playwright/driver/package/lib/tools/cli-client/channelSessions.js +141 -0
  107. playwright/driver/package/lib/tools/cli-client/cli.js +6 -0
  108. playwright/driver/package/lib/tools/cli-client/help.json +708 -0
  109. playwright/driver/package/lib/tools/cli-client/minimist.js +128 -0
  110. playwright/driver/package/lib/tools/cli-client/output.js +343 -0
  111. playwright/driver/package/lib/tools/cli-client/program.js +404 -0
  112. playwright/driver/package/lib/tools/cli-client/registry.js +176 -0
  113. playwright/driver/package/lib/tools/cli-client/session.js +258 -0
  114. playwright/driver/package/lib/tools/dashboard/appIcon.png +0 -0
  115. playwright/driver/package/lib/tools/skills/playwright-cli/SKILL.md +420 -0
  116. playwright/driver/package/lib/tools/skills/playwright-cli/references/element-attributes.md +23 -0
  117. playwright/driver/package/lib/tools/skills/playwright-cli/references/playwright-tests.md +39 -0
  118. playwright/driver/package/lib/tools/skills/playwright-cli/references/request-mocking.md +87 -0
  119. playwright/driver/package/lib/tools/skills/playwright-cli/references/running-code.md +241 -0
  120. playwright/driver/package/lib/tools/skills/playwright-cli/references/session-management.md +225 -0
  121. playwright/driver/package/lib/tools/skills/playwright-cli/references/storage-state.md +275 -0
  122. playwright/driver/package/lib/tools/skills/playwright-cli/references/test-generation.md +433 -0
  123. playwright/driver/package/lib/tools/skills/playwright-cli/references/tracing.md +139 -0
  124. playwright/driver/package/lib/tools/skills/playwright-cli/references/video-recording.md +143 -0
  125. playwright/driver/package/lib/tools/skills/playwright-component-testing/SKILL.md +143 -0
  126. playwright/driver/package/lib/tools/skills/playwright-component-testing/references/gallery-spec.md +144 -0
  127. playwright/driver/package/lib/tools/skills/playwright-component-testing/references/migration.md +85 -0
  128. playwright/driver/package/lib/tools/skills/playwright-component-testing/references/react.md +67 -0
  129. playwright/driver/package/lib/tools/skills/playwright-component-testing/references/vue.md +75 -0
  130. playwright/driver/package/lib/tools/skills/playwright-trace/SKILL.md +171 -0
  131. playwright/driver/package/lib/tools/utils/extension.js +101 -0
  132. playwright/driver/package/lib/tools/utils/socketConnection.js +108 -0
  133. playwright/driver/package/lib/utilsBundle.js +90764 -0
  134. playwright/driver/package/lib/utilsBundle.js.LICENSE +2179 -0
  135. playwright/driver/package/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
  136. playwright/driver/package/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
  137. playwright/driver/package/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
  138. playwright/driver/package/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
  139. playwright/driver/package/lib/vite/dashboard/assets/index-CyWAfh-p.js +11 -0
  140. playwright/driver/package/lib/vite/dashboard/assets/index-DhC616m4.css +1 -0
  141. playwright/driver/package/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
  142. playwright/driver/package/lib/vite/dashboard/index.html +29 -0
  143. playwright/driver/package/lib/vite/dashboard/playwright-logo.svg +24 -0
  144. playwright/driver/package/lib/vite/htmlReport/index.html +16 -0
  145. playwright/driver/package/lib/vite/htmlReport/report.css +2 -0
  146. playwright/driver/package/lib/vite/htmlReport/report.js +32 -0
  147. playwright/driver/package/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
  148. playwright/driver/package/lib/vite/recorder/assets/codeMirrorModule-CwYYHbcZ.js +32 -0
  149. playwright/driver/package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  150. playwright/driver/package/lib/vite/recorder/assets/index-DYjdXIbE.js +129 -0
  151. playwright/driver/package/lib/vite/recorder/assets/index-l_lX622x.css +1 -0
  152. playwright/driver/package/lib/vite/recorder/index.html +29 -0
  153. playwright/driver/package/lib/vite/recorder/playwright-logo.svg +9 -0
  154. playwright/driver/package/lib/vite/traceViewer/assets/codeMirrorModule-By56iMx7.js +32 -0
  155. playwright/driver/package/lib/vite/traceViewer/assets/defaultSettingsView-B34OrIms.js +181 -0
  156. playwright/driver/package/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
  157. playwright/driver/package/lib/vite/traceViewer/assets/xtermModule-COQkjINf.js +7 -0
  158. playwright/driver/package/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
  159. playwright/driver/package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  160. playwright/driver/package/lib/vite/traceViewer/defaultSettingsView.BLFoOugd.css +1 -0
  161. playwright/driver/package/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
  162. playwright/driver/package/lib/vite/traceViewer/index.Dl36UVQT.js +1 -0
  163. playwright/driver/package/lib/vite/traceViewer/index.html +44 -0
  164. playwright/driver/package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  165. playwright/driver/package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  166. playwright/driver/package/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
  167. playwright/driver/package/lib/vite/traceViewer/snapshot.html +10 -0
  168. playwright/driver/package/lib/vite/traceViewer/sw.bundle.js +4 -0
  169. playwright/driver/package/lib/vite/traceViewer/uiMode.C7UW1sC9.css +1 -0
  170. playwright/driver/package/lib/vite/traceViewer/uiMode.D962mr9b.js +5 -0
  171. playwright/driver/package/lib/vite/traceViewer/uiMode.html +18 -0
  172. playwright/driver/package/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
  173. playwright/driver/package/lib/webp_codec.LICENSE +173 -0
  174. playwright/driver/package/lib/webp_codec.wasm +0 -0
  175. playwright/driver/package/lib/xdg-open +1267 -0
  176. playwright/driver/package/package.json +34 -0
  177. playwright/driver/package/types/protocol.d.ts +24842 -0
  178. playwright/driver/package/types/structs.d.ts +47 -0
  179. playwright/driver/package/types/types.d.ts +26188 -0
  180. playwright/py.typed +0 -0
  181. playwright/sync_api/__init__.py +275 -0
  182. playwright/sync_api/_android_generated.py +494 -0
  183. playwright/sync_api/_context_manager.py +98 -0
  184. playwright/sync_api/_generated.py +24045 -0
  185. playwright_browserstack-1.62.0.dist-info/METADATA +82 -0
  186. playwright_browserstack-1.62.0.dist-info/RECORD +192 -0
  187. playwright_browserstack-1.62.0.dist-info/WHEEL +5 -0
  188. playwright_browserstack-1.62.0.dist-info/entry_points.txt +5 -0
  189. playwright_browserstack-1.62.0.dist-info/licenses/LICENSE +202 -0
  190. playwright_browserstack-1.62.0.dist-info/licenses/LICENSE.txt +51 -0
  191. playwright_browserstack-1.62.0.dist-info/licenses/NOTICE +18 -0
  192. playwright_browserstack-1.62.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,462 @@
1
+ # Copyright (c) 2025 BrowserStack. All rights reserved.
2
+ #
3
+ # This software is the confidential and proprietary information of BrowserStack.
4
+ # You shall not disclose such Confidential Information and shall use it only in
5
+ # accordance with the terms of the license agreement you entered into with BrowserStack.
6
+
7
+ """BrowserStack Android API wrappers for the async API.
8
+
9
+ These wrappers are hand-maintained on purpose. Upstream marks the Android API
10
+ as JS-only (``langs.only``), so ``scripts/generate_async_api.py`` cannot emit
11
+ them: ``documentation_provider.py`` filters the classes out of ``api.json`` and
12
+ then raises ``Invalid class Android``.
13
+
14
+ They deliberately live outside ``_generated.py`` because
15
+ ``scripts/update_api.sh`` runs
16
+ ``git checkout HEAD -- playwright/async_api/_generated.py`` before
17
+ regenerating it, so anything added there is silently dropped on the next
18
+ upstream version bump. Anything here survives untouched.
19
+
20
+ Importing this module registers the Android impl->API mapping and attaches the
21
+ ``Playwright.android`` property, so ``playwright/async_api/__init__.py`` must
22
+ import it.
23
+ """
24
+
25
+ import pathlib
26
+ import typing
27
+ from typing import Literal
28
+
29
+ from playwright._impl._android import Android as AndroidImpl
30
+ from playwright._impl._android import AndroidDevice as AndroidDeviceImpl
31
+ from playwright._impl._android import AndroidInput as AndroidInputImpl
32
+ from playwright._impl._android import AndroidSocket as AndroidSocketImpl
33
+ from playwright._impl._android import AndroidWebView as AndroidWebViewImpl
34
+ from playwright._impl._async_base import AsyncBase, mapping
35
+ from playwright.async_api._generated import BrowserContext, Page, Playwright
36
+
37
+ __all__ = [
38
+ "Android",
39
+ "AndroidDevice",
40
+ "AndroidInput",
41
+ "AndroidSocket",
42
+ "AndroidWebView",
43
+ ]
44
+
45
+ # Referenced by the string annotations in the wrappers below; imported for
46
+ # runtime type resolution, not used directly here.
47
+ _ = (BrowserContext, Page)
48
+
49
+
50
+ class AndroidSocket(AsyncBase):
51
+
52
+ async def write(self, data: bytes) -> None:
53
+ return mapping.from_maybe_impl(await self._impl_obj.write(data=data))
54
+
55
+ async def close(self) -> None:
56
+ return mapping.from_maybe_impl(await self._impl_obj.close())
57
+
58
+
59
+ mapping.register(AndroidSocketImpl, AndroidSocket)
60
+
61
+
62
+ class AndroidWebView(AsyncBase):
63
+
64
+ def __init__(self, impl_obj: AndroidWebViewImpl) -> None:
65
+ self._impl_obj = impl_obj
66
+ self._loop = impl_obj._device._loop
67
+ self._dispatcher_fiber = impl_obj._device._dispatcher_fiber
68
+
69
+ @property
70
+ def pid(self) -> int:
71
+ return self._impl_obj.pid
72
+
73
+ @property
74
+ def pkg(self) -> str:
75
+ return self._impl_obj.pkg
76
+
77
+ async def page(self) -> "Page":
78
+ return mapping.from_impl(await self._impl_obj.page())
79
+
80
+
81
+ mapping.register(AndroidWebViewImpl, AndroidWebView)
82
+
83
+
84
+ class AndroidInput(AsyncBase):
85
+
86
+ def __init__(self, impl_obj: AndroidInputImpl) -> None:
87
+ self._impl_obj = impl_obj
88
+ self._loop = impl_obj._device._loop
89
+ self._dispatcher_fiber = impl_obj._device._dispatcher_fiber
90
+
91
+ async def type(self, text: str) -> None:
92
+ return mapping.from_maybe_impl(await self._impl_obj.type(text=text))
93
+
94
+ async def press(self, key: str) -> None:
95
+ return mapping.from_maybe_impl(await self._impl_obj.press(key=key))
96
+
97
+ async def tap(self, point: typing.Dict) -> None:
98
+ return mapping.from_maybe_impl(await self._impl_obj.tap(point=point))
99
+
100
+ async def swipe(
101
+ self,
102
+ start: typing.Dict,
103
+ segments: typing.List[typing.Dict],
104
+ steps: int,
105
+ ) -> None:
106
+ return mapping.from_maybe_impl(
107
+ await self._impl_obj.swipe(start=start, segments=segments, steps=steps)
108
+ )
109
+
110
+ async def drag(self, start: typing.Dict, end: typing.Dict, steps: int) -> None:
111
+ return mapping.from_maybe_impl(
112
+ await self._impl_obj.drag(start=start, end=end, steps=steps)
113
+ )
114
+
115
+
116
+ mapping.register(AndroidInputImpl, AndroidInput)
117
+
118
+
119
+ class AndroidDevice(AsyncBase):
120
+
121
+ @property
122
+ def input(self) -> "AndroidInput":
123
+ return mapping.from_impl(self._impl_obj.input)
124
+
125
+ @property
126
+ def serial(self) -> str:
127
+ return self._impl_obj.serial
128
+
129
+ @property
130
+ def model(self) -> str:
131
+ return self._impl_obj.model
132
+
133
+ async def screenshot(
134
+ self, *, path: typing.Optional[typing.Union[str, pathlib.Path]] = None
135
+ ) -> bytes:
136
+ return mapping.from_maybe_impl(await self._impl_obj.screenshot(path=path))
137
+
138
+ async def shell(self, command: str) -> bytes:
139
+ return mapping.from_maybe_impl(await self._impl_obj.shell(command=command))
140
+
141
+ async def open(self, command: str) -> "AndroidSocket":
142
+ return mapping.from_impl(await self._impl_obj.open(command=command))
143
+
144
+ async def install_apk(
145
+ self,
146
+ file: typing.Union[str, pathlib.Path, bytes],
147
+ *,
148
+ args: typing.Optional[typing.List[str]] = None,
149
+ ) -> None:
150
+ return mapping.from_maybe_impl(
151
+ await self._impl_obj.install_apk(file=file, args=args)
152
+ )
153
+
154
+ async def push(
155
+ self,
156
+ file: typing.Union[str, pathlib.Path, bytes],
157
+ path: str,
158
+ *,
159
+ mode: typing.Optional[int] = None,
160
+ ) -> None:
161
+ return mapping.from_maybe_impl(
162
+ await self._impl_obj.push(file=file, path=path, mode=mode)
163
+ )
164
+
165
+ async def launch_browser(
166
+ self,
167
+ *,
168
+ pkg: typing.Optional[str] = None,
169
+ args: typing.Optional[typing.List[str]] = None,
170
+ proxy: typing.Optional[typing.Dict] = None,
171
+ permissions: typing.Optional[typing.List[str]] = None,
172
+ extra_http_headers: typing.Optional[typing.Dict[str, str]] = None,
173
+ offline: typing.Optional[bool] = None,
174
+ http_credentials: typing.Optional[typing.Dict] = None,
175
+ device_scale_factor: typing.Optional[float] = None,
176
+ is_mobile: typing.Optional[bool] = None,
177
+ has_touch: typing.Optional[bool] = None,
178
+ color_scheme: typing.Optional[
179
+ Literal["dark", "light", "no-preference", "null"]
180
+ ] = None,
181
+ locale: typing.Optional[str] = None,
182
+ timezone_id: typing.Optional[str] = None,
183
+ geolocation: typing.Optional[typing.Dict] = None,
184
+ user_agent: typing.Optional[str] = None,
185
+ accept_downloads: typing.Optional[bool] = None,
186
+ ignore_https_errors: typing.Optional[bool] = None,
187
+ java_script_enabled: typing.Optional[bool] = None,
188
+ bypass_csp: typing.Optional[bool] = None,
189
+ viewport: typing.Optional[typing.Dict] = None,
190
+ screen: typing.Optional[typing.Dict] = None,
191
+ no_viewport: typing.Optional[bool] = None,
192
+ record_video: typing.Optional[typing.Dict] = None,
193
+ record_har: typing.Optional[typing.Dict] = None,
194
+ base_url: typing.Optional[str] = None,
195
+ strict_selectors: typing.Optional[bool] = None,
196
+ service_workers: typing.Optional[Literal["allow", "block"]] = None,
197
+ ) -> "BrowserContext":
198
+ return mapping.from_impl(
199
+ await self._impl_obj.launch_browser(
200
+ pkg=pkg,
201
+ args=args,
202
+ proxy=proxy,
203
+ permissions=permissions,
204
+ extraHTTPHeaders=extra_http_headers,
205
+ offline=offline,
206
+ httpCredentials=http_credentials,
207
+ deviceScaleFactor=device_scale_factor,
208
+ isMobile=is_mobile,
209
+ hasTouch=has_touch,
210
+ colorScheme=color_scheme,
211
+ locale=locale,
212
+ timezoneId=timezone_id,
213
+ geolocation=geolocation,
214
+ userAgent=user_agent,
215
+ acceptDownloads=accept_downloads,
216
+ ignoreHTTPSErrors=ignore_https_errors,
217
+ javaScriptEnabled=java_script_enabled,
218
+ bypassCSP=bypass_csp,
219
+ viewport=viewport,
220
+ screen=screen,
221
+ noViewport=no_viewport,
222
+ recordVideo=record_video,
223
+ recordHar=record_har,
224
+ baseURL=base_url,
225
+ strictSelectors=strict_selectors,
226
+ serviceWorkers=service_workers,
227
+ )
228
+ )
229
+
230
+ async def web_views(self) -> typing.List["AndroidWebView"]:
231
+ return mapping.from_impl_list(self._impl_obj.web_views())
232
+
233
+ async def web_view(
234
+ self, selector: typing.Dict, *, timeout: typing.Optional[float] = None
235
+ ) -> "AndroidWebView":
236
+ return mapping.from_impl(
237
+ await self._impl_obj.web_view(selector=selector, timeout=timeout)
238
+ )
239
+
240
+ async def wait(
241
+ self,
242
+ selector: typing.Dict,
243
+ *,
244
+ state: typing.Optional[Literal["gone"]] = None,
245
+ timeout: typing.Optional[float] = None,
246
+ ) -> None:
247
+ return mapping.from_maybe_impl(
248
+ await self._impl_obj.wait(selector=selector, state=state, timeout=timeout)
249
+ )
250
+
251
+ async def fill(
252
+ self,
253
+ selector: typing.Dict,
254
+ text: str,
255
+ *,
256
+ timeout: typing.Optional[float] = None,
257
+ ) -> None:
258
+ return mapping.from_maybe_impl(
259
+ await self._impl_obj.fill(selector=selector, text=text, timeout=timeout)
260
+ )
261
+
262
+ async def tap(
263
+ self,
264
+ selector: typing.Dict,
265
+ *,
266
+ duration: typing.Optional[float] = None,
267
+ timeout: typing.Optional[float] = None,
268
+ ) -> None:
269
+ return mapping.from_maybe_impl(
270
+ await self._impl_obj.tap(
271
+ selector=selector, duration=duration, timeout=timeout
272
+ )
273
+ )
274
+
275
+ async def long_tap(
276
+ self, selector: typing.Dict, *, timeout: typing.Optional[float] = None
277
+ ) -> None:
278
+ return mapping.from_maybe_impl(
279
+ await self._impl_obj.long_tap(selector=selector, timeout=timeout)
280
+ )
281
+
282
+ async def drag(
283
+ self,
284
+ selector: typing.Dict,
285
+ dest: typing.Dict,
286
+ *,
287
+ speed: typing.Optional[int] = None,
288
+ timeout: typing.Optional[float] = None,
289
+ ) -> None:
290
+ return mapping.from_maybe_impl(
291
+ await self._impl_obj.drag(
292
+ selector=selector, dest=dest, speed=speed, timeout=timeout
293
+ )
294
+ )
295
+
296
+ async def fling(
297
+ self,
298
+ selector: typing.Dict,
299
+ direction: Literal["down", "left", "right", "up"],
300
+ *,
301
+ speed: typing.Optional[int] = None,
302
+ timeout: typing.Optional[float] = None,
303
+ ) -> None:
304
+ return mapping.from_maybe_impl(
305
+ await self._impl_obj.fling(
306
+ selector=selector, direction=direction, speed=speed, timeout=timeout
307
+ )
308
+ )
309
+
310
+ async def pinch_close(
311
+ self,
312
+ selector: typing.Dict,
313
+ percent: float,
314
+ *,
315
+ speed: typing.Optional[int] = None,
316
+ timeout: typing.Optional[float] = None,
317
+ ) -> None:
318
+ return mapping.from_maybe_impl(
319
+ await self._impl_obj.pinch_close(
320
+ selector=selector, percent=percent, speed=speed, timeout=timeout
321
+ )
322
+ )
323
+
324
+ async def pinch_open(
325
+ self,
326
+ selector: typing.Dict,
327
+ percent: float,
328
+ *,
329
+ speed: typing.Optional[int] = None,
330
+ timeout: typing.Optional[float] = None,
331
+ ) -> None:
332
+ return mapping.from_maybe_impl(
333
+ await self._impl_obj.pinch_open(
334
+ selector=selector, percent=percent, speed=speed, timeout=timeout
335
+ )
336
+ )
337
+
338
+ async def scroll(
339
+ self,
340
+ selector: typing.Dict,
341
+ direction: Literal["down", "left", "right", "up"],
342
+ percent: float,
343
+ *,
344
+ speed: typing.Optional[int] = None,
345
+ timeout: typing.Optional[float] = None,
346
+ ) -> None:
347
+ return mapping.from_maybe_impl(
348
+ await self._impl_obj.scroll(
349
+ selector=selector,
350
+ direction=direction,
351
+ percent=percent,
352
+ speed=speed,
353
+ timeout=timeout,
354
+ )
355
+ )
356
+
357
+ async def swipe(
358
+ self,
359
+ selector: typing.Dict,
360
+ direction: Literal["down", "left", "right", "up"],
361
+ percent: float,
362
+ *,
363
+ speed: typing.Optional[int] = None,
364
+ timeout: typing.Optional[float] = None,
365
+ ) -> None:
366
+ return mapping.from_maybe_impl(
367
+ await self._impl_obj.swipe(
368
+ selector=selector,
369
+ direction=direction,
370
+ percent=percent,
371
+ speed=speed,
372
+ timeout=timeout,
373
+ )
374
+ )
375
+
376
+ async def press(
377
+ self,
378
+ selector: typing.Dict,
379
+ key: str,
380
+ *,
381
+ timeout: typing.Optional[float] = None,
382
+ ) -> None:
383
+ return mapping.from_maybe_impl(
384
+ await self._impl_obj.press(selector=selector, key=key, timeout=timeout)
385
+ )
386
+
387
+ async def info(self, selector: typing.Dict) -> typing.Dict:
388
+ return mapping.from_maybe_impl(await self._impl_obj.info(selector=selector))
389
+
390
+ def set_default_timeout(self, timeout: float) -> None:
391
+ return mapping.from_maybe_impl(
392
+ self._impl_obj.set_default_timeout(timeout=timeout)
393
+ )
394
+
395
+ async def wait_for_event(
396
+ self,
397
+ event: str,
398
+ *,
399
+ predicate: typing.Optional[typing.Callable] = None,
400
+ timeout: typing.Optional[float] = None,
401
+ ) -> typing.Any:
402
+ return mapping.from_maybe_impl(
403
+ await self._impl_obj.wait_for_event(
404
+ event=event, predicate=predicate, timeout=timeout
405
+ )
406
+ )
407
+
408
+ async def close(self) -> None:
409
+ return mapping.from_maybe_impl(await self._impl_obj.close())
410
+
411
+
412
+ mapping.register(AndroidDeviceImpl, AndroidDevice)
413
+
414
+
415
+ class Android(AsyncBase):
416
+
417
+ async def devices(
418
+ self, *, port: typing.Optional[int] = None
419
+ ) -> typing.List["AndroidDevice"]:
420
+ return mapping.from_impl_list(await self._impl_obj.devices(port=port))
421
+
422
+ def set_default_timeout(self, timeout: float) -> None:
423
+ return mapping.from_maybe_impl(
424
+ self._impl_obj.set_default_timeout(timeout=timeout)
425
+ )
426
+
427
+ async def connect(
428
+ self,
429
+ ws_endpoint: str,
430
+ *,
431
+ headers: typing.Optional[typing.Dict[str, str]] = None,
432
+ slow_mo: typing.Optional[float] = None,
433
+ timeout: typing.Optional[float] = None,
434
+ ) -> "AndroidDevice":
435
+ return mapping.from_impl(
436
+ await self._impl_obj.connect(
437
+ wsEndpoint=ws_endpoint,
438
+ headers=headers,
439
+ slowMo=slow_mo,
440
+ timeout=timeout,
441
+ )
442
+ )
443
+
444
+
445
+ mapping.register(AndroidImpl, Android)
446
+
447
+
448
+ # Attached here rather than in _generated.py so that regenerating that file
449
+ # cannot drop it. See the module docstring.
450
+ def _android(self: Playwright) -> Android:
451
+ """Playwright.android
452
+
453
+ Android support for Playwright.
454
+
455
+ Returns
456
+ -------
457
+ Android
458
+ """
459
+ return mapping.from_impl(self._impl_obj.android)
460
+
461
+
462
+ Playwright.android = property(_android) # type: ignore[attr-defined]
@@ -0,0 +1,57 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import asyncio
16
+ from typing import Any
17
+
18
+ from playwright._impl._connection import Connection
19
+ from playwright._impl._object_factory import create_remote_object
20
+ from playwright._impl._transport import PipeTransport
21
+ from playwright.async_api._generated import Playwright as AsyncPlaywright
22
+
23
+
24
+ class PlaywrightContextManager:
25
+ def __init__(self) -> None:
26
+ self._connection: Connection
27
+ self._exit_was_called = False
28
+
29
+ async def __aenter__(self) -> AsyncPlaywright:
30
+ loop = asyncio.get_running_loop()
31
+ self._connection = Connection(
32
+ None,
33
+ create_remote_object,
34
+ PipeTransport(loop),
35
+ loop,
36
+ )
37
+ loop.create_task(self._connection.run())
38
+ playwright_future = self._connection.playwright_future
39
+
40
+ done, _ = await asyncio.wait(
41
+ {self._connection._transport.on_error_future, playwright_future},
42
+ return_when=asyncio.FIRST_COMPLETED,
43
+ )
44
+ if not playwright_future.done():
45
+ playwright_future.cancel()
46
+ playwright = AsyncPlaywright(next(iter(done)).result())
47
+ playwright.stop = self.__aexit__ # type: ignore
48
+ return playwright
49
+
50
+ async def start(self) -> AsyncPlaywright:
51
+ return await self.__aenter__()
52
+
53
+ async def __aexit__(self, *args: Any) -> None:
54
+ if self._exit_was_called:
55
+ return
56
+ self._exit_was_called = True
57
+ await self._connection.stop_async()