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.
- playwright/__init__.py +19 -0
- playwright/__main__.py +33 -0
- playwright/_impl/__init__.py +0 -0
- playwright/_impl/__pyinstaller/__init__.py +20 -0
- playwright/_impl/__pyinstaller/hook-playwright.async_api.py +17 -0
- playwright/_impl/__pyinstaller/hook-playwright.sync_api.py +17 -0
- playwright/_impl/_android.py +704 -0
- playwright/_impl/_api_structures.py +365 -0
- playwright/_impl/_artifact.py +87 -0
- playwright/_impl/_assertions.py +1124 -0
- playwright/_impl/_async_base.py +105 -0
- playwright/_impl/_browser.py +293 -0
- playwright/_impl/_browser_context.py +754 -0
- playwright/_impl/_browser_type.py +368 -0
- playwright/_impl/_cdp_session.py +46 -0
- playwright/_impl/_clock.py +104 -0
- playwright/_impl/_connection.py +764 -0
- playwright/_impl/_console_message.py +98 -0
- playwright/_impl/_credentials.py +57 -0
- playwright/_impl/_debugger.py +54 -0
- playwright/_impl/_dialog.py +63 -0
- playwright/_impl/_disposable.py +96 -0
- playwright/_impl/_download.py +64 -0
- playwright/_impl/_driver.py +41 -0
- playwright/_impl/_element_handle.py +480 -0
- playwright/_impl/_errors.py +64 -0
- playwright/_impl/_event_context_manager.py +33 -0
- playwright/_impl/_fetch.py +626 -0
- playwright/_impl/_file_chooser.py +57 -0
- playwright/_impl/_form_data.py +34 -0
- playwright/_impl/_frame.py +985 -0
- playwright/_impl/_glob.py +65 -0
- playwright/_impl/_greenlets.py +49 -0
- playwright/_impl/_har_router.py +122 -0
- playwright/_impl/_helper.py +601 -0
- playwright/_impl/_impl_to_api_mapping.py +158 -0
- playwright/_impl/_input.py +111 -0
- playwright/_impl/_js_handle.py +336 -0
- playwright/_impl/_json_pipe.py +97 -0
- playwright/_impl/_local_utils.py +95 -0
- playwright/_impl/_locator.py +1024 -0
- playwright/_impl/_map.py +31 -0
- playwright/_impl/_network.py +1017 -0
- playwright/_impl/_object_factory.py +116 -0
- playwright/_impl/_page.py +1637 -0
- playwright/_impl/_path_utils.py +27 -0
- playwright/_impl/_playwright.py +68 -0
- playwright/_impl/_screencast.py +177 -0
- playwright/_impl/_selectors.py +67 -0
- playwright/_impl/_set_input_files_helpers.py +158 -0
- playwright/_impl/_str_utils.py +76 -0
- playwright/_impl/_stream.py +46 -0
- playwright/_impl/_sync_base.py +151 -0
- playwright/_impl/_tracing.py +281 -0
- playwright/_impl/_transport.py +184 -0
- playwright/_impl/_video.py +56 -0
- playwright/_impl/_waiter.py +197 -0
- playwright/_impl/_web_error.py +48 -0
- playwright/_impl/_web_storage.py +58 -0
- playwright/_impl/_writable_stream.py +42 -0
- playwright/_repo_version.py +24 -0
- playwright/async_api/__init__.py +275 -0
- playwright/async_api/_android_generated.py +462 -0
- playwright/async_api/_context_manager.py +57 -0
- playwright/async_api/_generated.py +23875 -0
- playwright/driver/LICENSE +2946 -0
- playwright/driver/README.md +1 -0
- playwright/driver/node.exe +0 -0
- playwright/driver/package/LICENSE +202 -0
- playwright/driver/package/NOTICE +5 -0
- playwright/driver/package/README.md +3 -0
- playwright/driver/package/ThirdPartyNotices.txt +13 -0
- playwright/driver/package/bin/install_media_pack.ps1 +5 -0
- playwright/driver/package/bin/install_webkit_wsl.ps1 +33 -0
- playwright/driver/package/bin/reinstall_chrome_beta_linux.sh +42 -0
- playwright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
- playwright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
- playwright/driver/package/bin/reinstall_chrome_stable_linux.sh +42 -0
- playwright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
- playwright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
- playwright/driver/package/bin/reinstall_msedge_beta_linux.sh +48 -0
- playwright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
- playwright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
- playwright/driver/package/bin/reinstall_msedge_dev_linux.sh +48 -0
- playwright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
- playwright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
- playwright/driver/package/bin/reinstall_msedge_stable_linux.sh +48 -0
- playwright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
- playwright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
- playwright/driver/package/browsers.json +75 -0
- playwright/driver/package/cli.js +21 -0
- playwright/driver/package/index.d.ts +17 -0
- playwright/driver/package/index.js +17 -0
- playwright/driver/package/index.mjs +28 -0
- playwright/driver/package/lib/bootstrap.js +88 -0
- playwright/driver/package/lib/coreBundle.js +74830 -0
- playwright/driver/package/lib/entry/cliDaemon.js +5 -0
- playwright/driver/package/lib/entry/dashboardApp.js +3 -0
- playwright/driver/package/lib/entry/mcp.js +10 -0
- playwright/driver/package/lib/entry/oopBrowserDownload.js +3 -0
- playwright/driver/package/lib/package.js +50 -0
- playwright/driver/package/lib/server/chromium/appIcon.png +0 -0
- playwright/driver/package/lib/server/electron/loader.js +118 -0
- playwright/driver/package/lib/serverRegistry.js +7347 -0
- playwright/driver/package/lib/serverRegistry.js.LICENSE +354 -0
- playwright/driver/package/lib/tools/cli-client/channelSessions.js +141 -0
- playwright/driver/package/lib/tools/cli-client/cli.js +6 -0
- playwright/driver/package/lib/tools/cli-client/help.json +708 -0
- playwright/driver/package/lib/tools/cli-client/minimist.js +128 -0
- playwright/driver/package/lib/tools/cli-client/output.js +343 -0
- playwright/driver/package/lib/tools/cli-client/program.js +404 -0
- playwright/driver/package/lib/tools/cli-client/registry.js +176 -0
- playwright/driver/package/lib/tools/cli-client/session.js +258 -0
- playwright/driver/package/lib/tools/dashboard/appIcon.png +0 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/SKILL.md +420 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/element-attributes.md +23 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/playwright-tests.md +39 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/request-mocking.md +87 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/running-code.md +241 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/session-management.md +225 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/storage-state.md +275 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/test-generation.md +433 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/tracing.md +139 -0
- playwright/driver/package/lib/tools/skills/playwright-cli/references/video-recording.md +143 -0
- playwright/driver/package/lib/tools/skills/playwright-component-testing/SKILL.md +143 -0
- playwright/driver/package/lib/tools/skills/playwright-component-testing/references/gallery-spec.md +144 -0
- playwright/driver/package/lib/tools/skills/playwright-component-testing/references/migration.md +85 -0
- playwright/driver/package/lib/tools/skills/playwright-component-testing/references/react.md +67 -0
- playwright/driver/package/lib/tools/skills/playwright-component-testing/references/vue.md +75 -0
- playwright/driver/package/lib/tools/skills/playwright-trace/SKILL.md +171 -0
- playwright/driver/package/lib/tools/utils/extension.js +101 -0
- playwright/driver/package/lib/tools/utils/socketConnection.js +108 -0
- playwright/driver/package/lib/utilsBundle.js +90764 -0
- playwright/driver/package/lib/utilsBundle.js.LICENSE +2179 -0
- playwright/driver/package/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
- playwright/driver/package/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
- playwright/driver/package/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
- playwright/driver/package/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
- playwright/driver/package/lib/vite/dashboard/assets/index-CyWAfh-p.js +11 -0
- playwright/driver/package/lib/vite/dashboard/assets/index-DhC616m4.css +1 -0
- playwright/driver/package/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
- playwright/driver/package/lib/vite/dashboard/index.html +29 -0
- playwright/driver/package/lib/vite/dashboard/playwright-logo.svg +24 -0
- playwright/driver/package/lib/vite/htmlReport/index.html +16 -0
- playwright/driver/package/lib/vite/htmlReport/report.css +2 -0
- playwright/driver/package/lib/vite/htmlReport/report.js +32 -0
- playwright/driver/package/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
- playwright/driver/package/lib/vite/recorder/assets/codeMirrorModule-CwYYHbcZ.js +32 -0
- playwright/driver/package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- playwright/driver/package/lib/vite/recorder/assets/index-DYjdXIbE.js +129 -0
- playwright/driver/package/lib/vite/recorder/assets/index-l_lX622x.css +1 -0
- playwright/driver/package/lib/vite/recorder/index.html +29 -0
- playwright/driver/package/lib/vite/recorder/playwright-logo.svg +9 -0
- playwright/driver/package/lib/vite/traceViewer/assets/codeMirrorModule-By56iMx7.js +32 -0
- playwright/driver/package/lib/vite/traceViewer/assets/defaultSettingsView-B34OrIms.js +181 -0
- playwright/driver/package/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
- playwright/driver/package/lib/vite/traceViewer/assets/xtermModule-COQkjINf.js +7 -0
- playwright/driver/package/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
- playwright/driver/package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- playwright/driver/package/lib/vite/traceViewer/defaultSettingsView.BLFoOugd.css +1 -0
- playwright/driver/package/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
- playwright/driver/package/lib/vite/traceViewer/index.Dl36UVQT.js +1 -0
- playwright/driver/package/lib/vite/traceViewer/index.html +44 -0
- playwright/driver/package/lib/vite/traceViewer/manifest.webmanifest +16 -0
- playwright/driver/package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- playwright/driver/package/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
- playwright/driver/package/lib/vite/traceViewer/snapshot.html +10 -0
- playwright/driver/package/lib/vite/traceViewer/sw.bundle.js +4 -0
- playwright/driver/package/lib/vite/traceViewer/uiMode.C7UW1sC9.css +1 -0
- playwright/driver/package/lib/vite/traceViewer/uiMode.D962mr9b.js +5 -0
- playwright/driver/package/lib/vite/traceViewer/uiMode.html +18 -0
- playwright/driver/package/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
- playwright/driver/package/lib/webp_codec.LICENSE +173 -0
- playwright/driver/package/lib/webp_codec.wasm +0 -0
- playwright/driver/package/lib/xdg-open +1267 -0
- playwright/driver/package/package.json +34 -0
- playwright/driver/package/types/protocol.d.ts +24842 -0
- playwright/driver/package/types/structs.d.ts +47 -0
- playwright/driver/package/types/types.d.ts +26188 -0
- playwright/py.typed +0 -0
- playwright/sync_api/__init__.py +275 -0
- playwright/sync_api/_android_generated.py +494 -0
- playwright/sync_api/_context_manager.py +98 -0
- playwright/sync_api/_generated.py +24045 -0
- playwright_browserstack-1.62.0.dist-info/METADATA +82 -0
- playwright_browserstack-1.62.0.dist-info/RECORD +192 -0
- playwright_browserstack-1.62.0.dist-info/WHEEL +5 -0
- playwright_browserstack-1.62.0.dist-info/entry_points.txt +5 -0
- playwright_browserstack-1.62.0.dist-info/licenses/LICENSE +202 -0
- playwright_browserstack-1.62.0.dist-info/licenses/LICENSE.txt +51 -0
- playwright_browserstack-1.62.0.dist-info/licenses/NOTICE +18 -0
- 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()
|