@checkly/playwright-core 1.41.2-beta.0
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.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +3 -0
- package/ThirdPartyNotices.txt +1513 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +23 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +23 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +22 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +22 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +23 -0
- package/browsers.json +64 -0
- package/cli.js +17 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +97 -0
- package/lib/cli/program.js +582 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +272 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +509 -0
- package/lib/client/browserType.js +233 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +229 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +40 -0
- package/lib/client/connection.js +327 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +130 -0
- package/lib/client/elementHandle.js +291 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/events.js +93 -0
- package/lib/client/fetch.js +343 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +506 -0
- package/lib/client/harRouter.js +93 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +123 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +432 -0
- package/lib/client/network.js +601 -0
- package/lib/client/page.js +707 -0
- package/lib/client/playwright.js +74 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +135 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +172 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2599 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/browser.js +129 -0
- package/lib/server/browserContext.js +609 -0
- package/lib/server/browserType.js +300 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +346 -0
- package/lib/server/chromium/chromiumSwitches.js +41 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +521 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +144 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +723 -0
- package/lib/server/chromium/crPage.js +1173 -0
- package/lib/server/chromium/crPdf.js +147 -0
- package/lib/server/chromium/crProtocolHelper.js +131 -0
- package/lib/server/chromium/crServiceWorker.js +115 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/console.js +59 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +236 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +21 -0
- package/lib/server/deviceDescriptorsSource.json +1549 -0
- package/lib/server/dialog.js +70 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +400 -0
- package/lib/server/dispatchers/electronDispatcher.js +80 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +287 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +363 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
- package/lib/server/dom.js +808 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +254 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +611 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +71 -0
- package/lib/server/firefox/ffAccessibility.js +215 -0
- package/lib/server/firefox/ffBrowser.js +447 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +138 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +231 -0
- package/lib/server/firefox/ffPage.js +558 -0
- package/lib/server/firefox/firefox.js +91 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1597 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +539 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +96 -0
- package/lib/server/input.js +301 -0
- package/lib/server/instrumentation.js +74 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
- package/lib/server/javascript.js +305 -0
- package/lib/server/launchApp.js +90 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +607 -0
- package/lib/server/page.js +793 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +82 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/codeGenerator.js +153 -0
- package/lib/server/recorder/csharp.js +310 -0
- package/lib/server/recorder/java.js +216 -0
- package/lib/server/recorder/javascript.js +229 -0
- package/lib/server/recorder/jsonl.js +47 -0
- package/lib/server/recorder/language.js +44 -0
- package/lib/server/recorder/python.js +275 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +181 -0
- package/lib/server/recorder/recorderUtils.js +48 -0
- package/lib/server/recorder/utils.js +45 -0
- package/lib/server/recorder.js +700 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +925 -0
- package/lib/server/registry/nativeDeps.js +383 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +354 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +168 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +552 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +229 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +328 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +146 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +158 -0
- package/lib/server/webkit/wkPage.js +1198 -0
- package/lib/server/webkit/wkProvisionalPage.js +59 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +33 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +89 -0
- package/lib/utils/env.js +47 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/fileUtils.js +66 -0
- package/lib/utils/glob.js +83 -0
- package/lib/utils/happy-eyeballs.js +154 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +124 -0
- package/lib/utils/httpServer.js +195 -0
- package/lib/utils/index.js +324 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +651 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +107 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/mimeType.js +29 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +189 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +41 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +123 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +131 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +125 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +99 -0
- package/lib/utilsBundle.js +81 -0
- package/lib/utilsBundleImpl/index.js +51 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
- package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
- package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
- package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
- package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
- package/lib/vite/traceViewer/index.html +26 -0
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
- package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +17 -0
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
- package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +43 -0
- package/types/protocol.d.ts +20304 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +20626 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Accessibility = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
9
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
* you may not use this file except in compliance with the License.
|
|
13
|
+
* You may obtain a copy of the License at
|
|
14
|
+
*
|
|
15
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
*
|
|
17
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
* See the License for the specific language governing permissions and
|
|
21
|
+
* limitations under the License.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
function axNodeFromProtocol(axNode) {
|
|
25
|
+
const result = {
|
|
26
|
+
...axNode,
|
|
27
|
+
value: axNode.valueNumber !== undefined ? axNode.valueNumber : axNode.valueString,
|
|
28
|
+
checked: axNode.checked === 'checked' ? true : axNode.checked === 'unchecked' ? false : axNode.checked,
|
|
29
|
+
pressed: axNode.pressed === 'pressed' ? true : axNode.pressed === 'released' ? false : axNode.pressed,
|
|
30
|
+
children: axNode.children ? axNode.children.map(axNodeFromProtocol) : undefined
|
|
31
|
+
};
|
|
32
|
+
delete result.valueNumber;
|
|
33
|
+
delete result.valueString;
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
class Accessibility {
|
|
37
|
+
constructor(channel) {
|
|
38
|
+
this._channel = void 0;
|
|
39
|
+
this._channel = channel;
|
|
40
|
+
}
|
|
41
|
+
async snapshot(options = {}) {
|
|
42
|
+
const root = options.root ? options.root._elementChannel : undefined;
|
|
43
|
+
const result = await this._channel.accessibilitySnapshot({
|
|
44
|
+
interestingOnly: options.interestingOnly,
|
|
45
|
+
root
|
|
46
|
+
});
|
|
47
|
+
return result.rootAXNode ? axNodeFromProtocol(result.rootAXNode) : null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.Accessibility = Accessibility;
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AndroidWebView = exports.AndroidSocket = exports.AndroidInput = exports.AndroidDevice = exports.Android = void 0;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _utils = require("../utils");
|
|
9
|
+
var _events = require("./events");
|
|
10
|
+
var _browserContext = require("./browserContext");
|
|
11
|
+
var _channelOwner = require("./channelOwner");
|
|
12
|
+
var _timeoutSettings = require("../common/timeoutSettings");
|
|
13
|
+
var _waiter = require("./waiter");
|
|
14
|
+
var _events2 = require("events");
|
|
15
|
+
var _connection = require("./connection");
|
|
16
|
+
var _errors = require("./errors");
|
|
17
|
+
var _timeoutRunner = require("../utils/timeoutRunner");
|
|
18
|
+
let _Symbol$asyncDispose;
|
|
19
|
+
/**
|
|
20
|
+
* Copyright (c) Microsoft Corporation.
|
|
21
|
+
*
|
|
22
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
23
|
+
* you may not use this file except in compliance with the License.
|
|
24
|
+
* You may obtain a copy of the License at
|
|
25
|
+
*
|
|
26
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
27
|
+
*
|
|
28
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
29
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
30
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
31
|
+
* See the License for the specific language governing permissions and
|
|
32
|
+
* limitations under the License.
|
|
33
|
+
*/
|
|
34
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
|
+
class Android extends _channelOwner.ChannelOwner {
|
|
36
|
+
static from(android) {
|
|
37
|
+
return android._object;
|
|
38
|
+
}
|
|
39
|
+
constructor(parent, type, guid, initializer) {
|
|
40
|
+
super(parent, type, guid, initializer);
|
|
41
|
+
this._timeoutSettings = void 0;
|
|
42
|
+
this._serverLauncher = void 0;
|
|
43
|
+
this._timeoutSettings = new _timeoutSettings.TimeoutSettings();
|
|
44
|
+
}
|
|
45
|
+
setDefaultTimeout(timeout) {
|
|
46
|
+
this._timeoutSettings.setDefaultTimeout(timeout);
|
|
47
|
+
this._channel.setDefaultTimeoutNoReply({
|
|
48
|
+
timeout
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async devices(options = {}) {
|
|
52
|
+
const {
|
|
53
|
+
devices
|
|
54
|
+
} = await this._channel.devices(options);
|
|
55
|
+
return devices.map(d => AndroidDevice.from(d));
|
|
56
|
+
}
|
|
57
|
+
async launchServer(options = {}) {
|
|
58
|
+
if (!this._serverLauncher) throw new Error('Launching server is not supported');
|
|
59
|
+
return await this._serverLauncher.launchServer(options);
|
|
60
|
+
}
|
|
61
|
+
async connect(wsEndpoint, options = {}) {
|
|
62
|
+
return await this._wrapApiCall(async () => {
|
|
63
|
+
const deadline = options.timeout ? (0, _utils.monotonicTime)() + options.timeout : 0;
|
|
64
|
+
const headers = {
|
|
65
|
+
'x-playwright-browser': 'android',
|
|
66
|
+
...options.headers
|
|
67
|
+
};
|
|
68
|
+
const localUtils = this._connection.localUtils();
|
|
69
|
+
const connectParams = {
|
|
70
|
+
wsEndpoint,
|
|
71
|
+
headers,
|
|
72
|
+
slowMo: options.slowMo,
|
|
73
|
+
timeout: options.timeout
|
|
74
|
+
};
|
|
75
|
+
const {
|
|
76
|
+
pipe
|
|
77
|
+
} = await localUtils._channel.connect(connectParams);
|
|
78
|
+
const closePipe = () => pipe.close().catch(() => {});
|
|
79
|
+
const connection = new _connection.Connection(localUtils, this._instrumentation);
|
|
80
|
+
connection.markAsRemote();
|
|
81
|
+
connection.on('close', closePipe);
|
|
82
|
+
let device;
|
|
83
|
+
let closeError;
|
|
84
|
+
const onPipeClosed = () => {
|
|
85
|
+
var _device;
|
|
86
|
+
(_device = device) === null || _device === void 0 || _device._didClose();
|
|
87
|
+
connection.close(closeError);
|
|
88
|
+
};
|
|
89
|
+
pipe.on('closed', onPipeClosed);
|
|
90
|
+
connection.onmessage = message => pipe.send({
|
|
91
|
+
message
|
|
92
|
+
}).catch(onPipeClosed);
|
|
93
|
+
pipe.on('message', ({
|
|
94
|
+
message
|
|
95
|
+
}) => {
|
|
96
|
+
try {
|
|
97
|
+
connection.dispatch(message);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
closeError = e;
|
|
100
|
+
closePipe();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
const result = await (0, _timeoutRunner.raceAgainstDeadline)(async () => {
|
|
104
|
+
const playwright = await connection.initializePlaywright();
|
|
105
|
+
if (!playwright._initializer.preConnectedAndroidDevice) {
|
|
106
|
+
closePipe();
|
|
107
|
+
throw new Error('Malformed endpoint. Did you use Android.launchServer method?');
|
|
108
|
+
}
|
|
109
|
+
device = AndroidDevice.from(playwright._initializer.preConnectedAndroidDevice);
|
|
110
|
+
device._shouldCloseConnectionOnClose = true;
|
|
111
|
+
device.on(_events.Events.AndroidDevice.Close, closePipe);
|
|
112
|
+
return device;
|
|
113
|
+
}, deadline);
|
|
114
|
+
if (!result.timedOut) {
|
|
115
|
+
return result.result;
|
|
116
|
+
} else {
|
|
117
|
+
closePipe();
|
|
118
|
+
throw new Error(`Timeout ${options.timeout}ms exceeded`);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.Android = Android;
|
|
124
|
+
_Symbol$asyncDispose = Symbol.asyncDispose;
|
|
125
|
+
class AndroidDevice extends _channelOwner.ChannelOwner {
|
|
126
|
+
static from(androidDevice) {
|
|
127
|
+
return androidDevice._object;
|
|
128
|
+
}
|
|
129
|
+
constructor(parent, type, guid, initializer) {
|
|
130
|
+
super(parent, type, guid, initializer);
|
|
131
|
+
this._timeoutSettings = void 0;
|
|
132
|
+
this._webViews = new Map();
|
|
133
|
+
this._shouldCloseConnectionOnClose = false;
|
|
134
|
+
this.input = void 0;
|
|
135
|
+
this.input = new AndroidInput(this);
|
|
136
|
+
this._timeoutSettings = new _timeoutSettings.TimeoutSettings(parent._timeoutSettings);
|
|
137
|
+
this._channel.on('webViewAdded', ({
|
|
138
|
+
webView
|
|
139
|
+
}) => this._onWebViewAdded(webView));
|
|
140
|
+
this._channel.on('webViewRemoved', ({
|
|
141
|
+
socketName
|
|
142
|
+
}) => this._onWebViewRemoved(socketName));
|
|
143
|
+
this._channel.on('close', () => this._didClose());
|
|
144
|
+
}
|
|
145
|
+
_onWebViewAdded(webView) {
|
|
146
|
+
const view = new AndroidWebView(this, webView);
|
|
147
|
+
this._webViews.set(webView.socketName, view);
|
|
148
|
+
this.emit(_events.Events.AndroidDevice.WebView, view);
|
|
149
|
+
}
|
|
150
|
+
_onWebViewRemoved(socketName) {
|
|
151
|
+
const view = this._webViews.get(socketName);
|
|
152
|
+
this._webViews.delete(socketName);
|
|
153
|
+
if (view) view.emit(_events.Events.AndroidWebView.Close);
|
|
154
|
+
}
|
|
155
|
+
setDefaultTimeout(timeout) {
|
|
156
|
+
this._timeoutSettings.setDefaultTimeout(timeout);
|
|
157
|
+
this._channel.setDefaultTimeoutNoReply({
|
|
158
|
+
timeout
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
serial() {
|
|
162
|
+
return this._initializer.serial;
|
|
163
|
+
}
|
|
164
|
+
model() {
|
|
165
|
+
return this._initializer.model;
|
|
166
|
+
}
|
|
167
|
+
webViews() {
|
|
168
|
+
return [...this._webViews.values()];
|
|
169
|
+
}
|
|
170
|
+
async webView(selector, options) {
|
|
171
|
+
const predicate = v => {
|
|
172
|
+
if (selector.pkg) return v.pkg() === selector.pkg;
|
|
173
|
+
if (selector.socketName) return v._socketName() === selector.socketName;
|
|
174
|
+
return false;
|
|
175
|
+
};
|
|
176
|
+
const webView = [...this._webViews.values()].find(predicate);
|
|
177
|
+
if (webView) return webView;
|
|
178
|
+
return await this.waitForEvent('webview', {
|
|
179
|
+
...options,
|
|
180
|
+
predicate
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async wait(selector, options) {
|
|
184
|
+
await this._channel.wait({
|
|
185
|
+
selector: toSelectorChannel(selector),
|
|
186
|
+
...options
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async fill(selector, text, options) {
|
|
190
|
+
await this._channel.fill({
|
|
191
|
+
selector: toSelectorChannel(selector),
|
|
192
|
+
text,
|
|
193
|
+
...options
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async press(selector, key, options) {
|
|
197
|
+
await this.tap(selector, options);
|
|
198
|
+
await this.input.press(key);
|
|
199
|
+
}
|
|
200
|
+
async tap(selector, options) {
|
|
201
|
+
await this._channel.tap({
|
|
202
|
+
selector: toSelectorChannel(selector),
|
|
203
|
+
...options
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async drag(selector, dest, options) {
|
|
207
|
+
await this._channel.drag({
|
|
208
|
+
selector: toSelectorChannel(selector),
|
|
209
|
+
dest,
|
|
210
|
+
...options
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
async fling(selector, direction, options) {
|
|
214
|
+
await this._channel.fling({
|
|
215
|
+
selector: toSelectorChannel(selector),
|
|
216
|
+
direction,
|
|
217
|
+
...options
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async longTap(selector, options) {
|
|
221
|
+
await this._channel.longTap({
|
|
222
|
+
selector: toSelectorChannel(selector),
|
|
223
|
+
...options
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async pinchClose(selector, percent, options) {
|
|
227
|
+
await this._channel.pinchClose({
|
|
228
|
+
selector: toSelectorChannel(selector),
|
|
229
|
+
percent,
|
|
230
|
+
...options
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async pinchOpen(selector, percent, options) {
|
|
234
|
+
await this._channel.pinchOpen({
|
|
235
|
+
selector: toSelectorChannel(selector),
|
|
236
|
+
percent,
|
|
237
|
+
...options
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async scroll(selector, direction, percent, options) {
|
|
241
|
+
await this._channel.scroll({
|
|
242
|
+
selector: toSelectorChannel(selector),
|
|
243
|
+
direction,
|
|
244
|
+
percent,
|
|
245
|
+
...options
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
async swipe(selector, direction, percent, options) {
|
|
249
|
+
await this._channel.swipe({
|
|
250
|
+
selector: toSelectorChannel(selector),
|
|
251
|
+
direction,
|
|
252
|
+
percent,
|
|
253
|
+
...options
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async info(selector) {
|
|
257
|
+
return (await this._channel.info({
|
|
258
|
+
selector: toSelectorChannel(selector)
|
|
259
|
+
})).info;
|
|
260
|
+
}
|
|
261
|
+
async screenshot(options = {}) {
|
|
262
|
+
const {
|
|
263
|
+
binary
|
|
264
|
+
} = await this._channel.screenshot();
|
|
265
|
+
if (options.path) await _fs.default.promises.writeFile(options.path, binary);
|
|
266
|
+
return binary;
|
|
267
|
+
}
|
|
268
|
+
async [_Symbol$asyncDispose]() {
|
|
269
|
+
await this.close();
|
|
270
|
+
}
|
|
271
|
+
async close() {
|
|
272
|
+
try {
|
|
273
|
+
if (this._shouldCloseConnectionOnClose) this._connection.close();else await this._channel.close();
|
|
274
|
+
} catch (e) {
|
|
275
|
+
if ((0, _errors.isTargetClosedError)(e)) return;
|
|
276
|
+
throw e;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
_didClose() {
|
|
280
|
+
this.emit(_events.Events.AndroidDevice.Close, this);
|
|
281
|
+
}
|
|
282
|
+
async shell(command) {
|
|
283
|
+
const {
|
|
284
|
+
result
|
|
285
|
+
} = await this._channel.shell({
|
|
286
|
+
command
|
|
287
|
+
});
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
async open(command) {
|
|
291
|
+
return AndroidSocket.from((await this._channel.open({
|
|
292
|
+
command
|
|
293
|
+
})).socket);
|
|
294
|
+
}
|
|
295
|
+
async installApk(file, options) {
|
|
296
|
+
await this._channel.installApk({
|
|
297
|
+
file: await loadFile(file),
|
|
298
|
+
args: options && options.args
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
async push(file, path, options) {
|
|
302
|
+
await this._channel.push({
|
|
303
|
+
file: await loadFile(file),
|
|
304
|
+
path,
|
|
305
|
+
mode: options ? options.mode : undefined
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async launchBrowser(options = {}) {
|
|
309
|
+
const contextOptions = await (0, _browserContext.prepareBrowserContextParams)(options);
|
|
310
|
+
const result = await this._channel.launchBrowser(contextOptions);
|
|
311
|
+
const context = _browserContext.BrowserContext.from(result.context);
|
|
312
|
+
context._setOptions(contextOptions, {});
|
|
313
|
+
return context;
|
|
314
|
+
}
|
|
315
|
+
async waitForEvent(event, optionsOrPredicate = {}) {
|
|
316
|
+
return await this._wrapApiCall(async () => {
|
|
317
|
+
const timeout = this._timeoutSettings.timeout(typeof optionsOrPredicate === 'function' ? {} : optionsOrPredicate);
|
|
318
|
+
const predicate = typeof optionsOrPredicate === 'function' ? optionsOrPredicate : optionsOrPredicate.predicate;
|
|
319
|
+
const waiter = _waiter.Waiter.createForEvent(this, event);
|
|
320
|
+
waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`);
|
|
321
|
+
if (event !== _events.Events.AndroidDevice.Close) waiter.rejectOnEvent(this, _events.Events.AndroidDevice.Close, () => new _errors.TargetClosedError());
|
|
322
|
+
const result = await waiter.waitForEvent(this, event, predicate);
|
|
323
|
+
waiter.dispose();
|
|
324
|
+
return result;
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
exports.AndroidDevice = AndroidDevice;
|
|
329
|
+
class AndroidSocket extends _channelOwner.ChannelOwner {
|
|
330
|
+
static from(androidDevice) {
|
|
331
|
+
return androidDevice._object;
|
|
332
|
+
}
|
|
333
|
+
constructor(parent, type, guid, initializer) {
|
|
334
|
+
super(parent, type, guid, initializer);
|
|
335
|
+
this._channel.on('data', ({
|
|
336
|
+
data
|
|
337
|
+
}) => this.emit(_events.Events.AndroidSocket.Data, data));
|
|
338
|
+
this._channel.on('close', () => this.emit(_events.Events.AndroidSocket.Close));
|
|
339
|
+
}
|
|
340
|
+
async write(data) {
|
|
341
|
+
await this._channel.write({
|
|
342
|
+
data
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
async close() {
|
|
346
|
+
await this._channel.close();
|
|
347
|
+
}
|
|
348
|
+
async [Symbol.asyncDispose]() {
|
|
349
|
+
await this.close();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
exports.AndroidSocket = AndroidSocket;
|
|
353
|
+
async function loadFile(file) {
|
|
354
|
+
if ((0, _utils.isString)(file)) return await _fs.default.promises.readFile(file);
|
|
355
|
+
return file;
|
|
356
|
+
}
|
|
357
|
+
class AndroidInput {
|
|
358
|
+
constructor(device) {
|
|
359
|
+
this._device = void 0;
|
|
360
|
+
this._device = device;
|
|
361
|
+
}
|
|
362
|
+
async type(text) {
|
|
363
|
+
await this._device._channel.inputType({
|
|
364
|
+
text
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
async press(key) {
|
|
368
|
+
await this._device._channel.inputPress({
|
|
369
|
+
key
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
async tap(point) {
|
|
373
|
+
await this._device._channel.inputTap({
|
|
374
|
+
point
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
async swipe(from, segments, steps) {
|
|
378
|
+
await this._device._channel.inputSwipe({
|
|
379
|
+
segments,
|
|
380
|
+
steps
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
async drag(from, to, steps) {
|
|
384
|
+
await this._device._channel.inputDrag({
|
|
385
|
+
from,
|
|
386
|
+
to,
|
|
387
|
+
steps
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.AndroidInput = AndroidInput;
|
|
392
|
+
function toSelectorChannel(selector) {
|
|
393
|
+
const {
|
|
394
|
+
checkable,
|
|
395
|
+
checked,
|
|
396
|
+
clazz,
|
|
397
|
+
clickable,
|
|
398
|
+
depth,
|
|
399
|
+
desc,
|
|
400
|
+
enabled,
|
|
401
|
+
focusable,
|
|
402
|
+
focused,
|
|
403
|
+
hasChild,
|
|
404
|
+
hasDescendant,
|
|
405
|
+
longClickable,
|
|
406
|
+
pkg,
|
|
407
|
+
res,
|
|
408
|
+
scrollable,
|
|
409
|
+
selected,
|
|
410
|
+
text
|
|
411
|
+
} = selector;
|
|
412
|
+
const toRegex = value => {
|
|
413
|
+
if (value === undefined) return undefined;
|
|
414
|
+
if ((0, _utils.isRegExp)(value)) return value.source;
|
|
415
|
+
return '^' + value.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d') + '$';
|
|
416
|
+
};
|
|
417
|
+
return {
|
|
418
|
+
checkable,
|
|
419
|
+
checked,
|
|
420
|
+
clazz: toRegex(clazz),
|
|
421
|
+
pkg: toRegex(pkg),
|
|
422
|
+
desc: toRegex(desc),
|
|
423
|
+
res: toRegex(res),
|
|
424
|
+
text: toRegex(text),
|
|
425
|
+
clickable,
|
|
426
|
+
depth,
|
|
427
|
+
enabled,
|
|
428
|
+
focusable,
|
|
429
|
+
focused,
|
|
430
|
+
hasChild: hasChild ? {
|
|
431
|
+
selector: toSelectorChannel(hasChild.selector)
|
|
432
|
+
} : undefined,
|
|
433
|
+
hasDescendant: hasDescendant ? {
|
|
434
|
+
selector: toSelectorChannel(hasDescendant.selector),
|
|
435
|
+
maxDepth: hasDescendant.maxDepth
|
|
436
|
+
} : undefined,
|
|
437
|
+
longClickable,
|
|
438
|
+
scrollable,
|
|
439
|
+
selected
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
class AndroidWebView extends _events2.EventEmitter {
|
|
443
|
+
constructor(device, data) {
|
|
444
|
+
super();
|
|
445
|
+
this._device = void 0;
|
|
446
|
+
this._data = void 0;
|
|
447
|
+
this._pagePromise = void 0;
|
|
448
|
+
this._device = device;
|
|
449
|
+
this._data = data;
|
|
450
|
+
}
|
|
451
|
+
pid() {
|
|
452
|
+
return this._data.pid;
|
|
453
|
+
}
|
|
454
|
+
pkg() {
|
|
455
|
+
return this._data.pkg;
|
|
456
|
+
}
|
|
457
|
+
_socketName() {
|
|
458
|
+
return this._data.socketName;
|
|
459
|
+
}
|
|
460
|
+
async page() {
|
|
461
|
+
if (!this._pagePromise) this._pagePromise = this._fetchPage();
|
|
462
|
+
return await this._pagePromise;
|
|
463
|
+
}
|
|
464
|
+
async _fetchPage() {
|
|
465
|
+
const {
|
|
466
|
+
context
|
|
467
|
+
} = await this._device._channel.connectToWebView({
|
|
468
|
+
socketName: this._data.socketName
|
|
469
|
+
});
|
|
470
|
+
return _browserContext.BrowserContext.from(context).pages()[0];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
exports.AndroidWebView = AndroidWebView;
|