@checkly/playwright-core 1.41.26 → 1.42.12
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/ThirdPartyNotices.txt +3 -3
- package/bin/reinstall_chrome_beta_win.ps1 +2 -1
- package/bin/reinstall_chrome_stable_win.ps1 +2 -1
- package/bin/reinstall_msedge_beta_win.ps1 +2 -1
- package/bin/reinstall_msedge_dev_win.ps1 +2 -1
- package/bin/reinstall_msedge_stable_win.ps1 +2 -1
- package/browsers.json +14 -15
- package/cli.js +2 -1
- package/lib/checkly/fetch.js +28 -1
- package/lib/cli/driver.js +9 -1
- package/lib/cli/program.js +12 -4
- package/lib/client/browserContext.js +1 -1
- package/lib/client/channelOwner.js +1 -1
- package/lib/client/clientHelper.js +5 -1
- package/lib/client/connection.js +1 -1
- package/lib/client/consoleMessage.js +1 -1
- package/lib/client/electron.js +3 -0
- package/lib/client/events.js +1 -0
- package/lib/client/frame.js +2 -1
- package/lib/client/harRouter.js +7 -1
- package/lib/client/page.js +25 -6
- package/lib/common/socksProxy.js +1 -1
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/outofprocess.js +1 -1
- package/lib/protocol/validator.js +60 -30
- package/lib/remote/playwrightConnection.js +1 -1
- package/lib/remote/playwrightServer.js +72 -166
- package/lib/server/android/android.js +1 -1
- package/lib/server/browserType.js +2 -2
- package/lib/server/chromium/chromium.js +5 -4
- package/lib/server/chromium/crConnection.js +1 -1
- package/lib/server/chromium/crNetworkManager.js +1 -3
- package/lib/server/chromium/crPage.js +45 -2
- package/lib/server/chromium/crPdf.js +8 -2
- package/lib/server/console.js +1 -3
- package/lib/server/debugController.js +0 -3
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dispatchers/browserContextDispatcher.js +3 -2
- package/lib/server/dispatchers/dispatcher.js +9 -10
- package/lib/server/dispatchers/electronDispatcher.js +13 -0
- package/lib/server/dispatchers/frameDispatcher.js +0 -6
- package/lib/server/dispatchers/networkDispatchers.js +1 -0
- package/lib/server/dispatchers/pageDispatcher.js +14 -10
- package/lib/server/dom.js +130 -167
- package/lib/server/electron/electron.js +38 -12
- package/lib/server/electron/loader.js +4 -2
- package/lib/server/fetch.js +1 -0
- package/lib/server/firefox/ffAccessibility.js +2 -1
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffPage.js +1 -1
- package/lib/server/frames.js +39 -20
- package/lib/server/helper.js +1 -1
- package/lib/server/page.js +49 -5
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +1 -1
- package/lib/server/progress.js +3 -11
- package/lib/server/recorder/csharp.js +1 -1
- package/lib/server/recorder/java.js +36 -4
- package/lib/server/recorder.js +2 -2
- package/lib/server/registry/browserFetcher.js +1 -1
- package/lib/server/registry/dependencies.js +5 -4
- package/lib/server/registry/index.js +48 -30
- package/lib/server/registry/nativeDeps.js +0 -94
- package/lib/server/trace/recorder/snapshotter.js +1 -1
- package/lib/server/trace/recorder/tracing.js +5 -2
- package/lib/server/trace/viewer/traceViewer.js +1 -1
- package/lib/server/transport.js +4 -2
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkPage.js +2 -2
- package/lib/utils/comparators.js +4 -4
- package/lib/utils/fileUtils.js +4 -0
- package/lib/utils/hostPlatform.js +1 -1
- package/lib/utils/index.js +33 -0
- package/lib/utils/isomorphic/locatorParser.js +6 -4
- package/lib/utils/isomorphic/stringUtils.js +5 -0
- package/lib/utils/network.js +32 -0
- package/lib/utils/processLauncher.js +7 -0
- package/lib/utils/rtti.js +7 -4
- package/lib/utils/wsServer.js +5 -3
- package/lib/utilsBundleImpl/index.js +4 -4
- package/lib/vite/htmlReport/index.html +11 -11
- package/lib/vite/traceViewer/assets/{codeMirrorModule-2ImvVqMb.js → codeMirrorModule-BK3t1EEu.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
- package/lib/vite/traceViewer/assets/{codeMirrorModule-y3M3aAqy.js → codeMirrorModule-Vg1kIqMp.js} +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-fqJB1XDu.js → codeMirrorModule-wLpsbIhd.js} +13 -13
- package/lib/vite/traceViewer/assets/{wsPort-L8WBvZfK.js → wsPort-964mA9MZ.js} +18 -18
- package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
- package/lib/vite/traceViewer/assets/{wsPort-uVqol1LI.js → wsPort-RIoVGhlT.js} +18 -18
- package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
- package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
- package/lib/vite/traceViewer/{index.LR1HufLs.js → index.-_8-eHEE.js} +1 -1
- package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
- package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
- package/lib/vite/traceViewer/{index.4X7zDysg.js → index.cbtHmFgM.js} +1 -1
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/{index.4xhUWj1f.js → index.qOFdH9Ja.js} +1 -1
- package/lib/vite/traceViewer/sw.bundle.js +4 -4
- package/lib/vite/traceViewer/{uiMode.PlLkrJDI.js → uiMode.9CwNsWc6.js} +1 -1
- package/lib/vite/traceViewer/{uiMode.qpn6w4df.js → uiMode.fcU_T5Nf.js} +1 -1
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/{uiMode.GTNzARcV.js → uiMode.iNIhieBM.js} +1 -1
- package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
- package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
- package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
- package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
- package/package.json +6 -5
- package/types/protocol.d.ts +367 -53
- package/types/types.d.ts +220 -50
- package/LICENSE +0 -202
- package/NOTICE +0 -5
- package/lib/cli/cli.js +0 -61
- package/lib/common/debugLogger.js +0 -89
- package/lib/vite/traceViewer/assets/codeMirrorModule-2mdjgmqe.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-56536a77.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-75b0ca4f.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-A2_PGeGB.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-GJA8DRmd.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-aUzO-LID.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-b361a51f.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-c1454a2e.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-f333a775.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-722747dc.js +0 -64
- package/lib/vite/traceViewer/assets/wsPort-762c6840.js +0 -64
- package/lib/vite/traceViewer/assets/wsPort-93o0i57c.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-98e00a94.js +0 -64
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-db501ca9.js +0 -64
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-ee2830d7.js +0 -64
- package/lib/vite/traceViewer/assets/wsPort-qI0zJPR7.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-sh0wpjYp.js +0 -69
- package/lib/vite/traceViewer/assets/xtermModule-443332e6.js +0 -9
- package/lib/vite/traceViewer/codeMirrorModule.5d0f417c.css +0 -1
- package/lib/vite/traceViewer/codicon.79f233d0.ttf +0 -0
- package/lib/vite/traceViewer/index.0d08c336.js +0 -2
- package/lib/vite/traceViewer/index.1a1fe659.css +0 -1
- package/lib/vite/traceViewer/index.HkJgzlGy.js +0 -2
- package/lib/vite/traceViewer/index.Ox-CymYJ.js +0 -2
- package/lib/vite/traceViewer/index.a265fbdb.js +0 -2
- package/lib/vite/traceViewer/index.d05939c9.js +0 -2
- package/lib/vite/traceViewer/index.decad628.js +0 -2
- package/lib/vite/traceViewer/index.ed9a3c58.js +0 -2
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +0 -2
- package/lib/vite/traceViewer/index.krETyIB_.js +0 -2
- package/lib/vite/traceViewer/index.o6j3Cv4u.js +0 -2
- package/lib/vite/traceViewer/uiMode.08ab2d90.js +0 -4
- package/lib/vite/traceViewer/uiMode.0d0d667b.js +0 -4
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +0 -10
- package/lib/vite/traceViewer/uiMode.3ff70f7d.js +0 -4
- package/lib/vite/traceViewer/uiMode.8b41a49d.css +0 -1
- package/lib/vite/traceViewer/uiMode.8e0454c4.js +0 -4
- package/lib/vite/traceViewer/uiMode.Rcwfn0db.js +0 -10
- package/lib/vite/traceViewer/uiMode.YGPXSUMv.js +0 -10
- package/lib/vite/traceViewer/uiMode.YYFJGvtV.js +0 -10
- package/lib/vite/traceViewer/uiMode.c1ebfc43.js +0 -4
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +0 -10
- package/lib/vite/traceViewer/wsPort.9c9a6767.css +0 -1
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +0 -1
- package/lib/vite/traceViewer/xtermModule.6428296b.css +0 -32
package/lib/server/frames.js
CHANGED
|
@@ -15,7 +15,7 @@ var _browserContext = require("./browserContext");
|
|
|
15
15
|
var _progress = require("./progress");
|
|
16
16
|
var _utils = require("../utils");
|
|
17
17
|
var _manualPromise = require("../utils/manualPromise");
|
|
18
|
-
var _debugLogger = require("../
|
|
18
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
19
19
|
var _instrumentation = require("./instrumentation");
|
|
20
20
|
var _protocolError = require("./protocolError");
|
|
21
21
|
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
@@ -930,9 +930,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
930
930
|
// Retry upon all other errors.
|
|
931
931
|
return false;
|
|
932
932
|
}
|
|
933
|
-
async _retryWithProgressIfNotConnected(progress, selector, strict, action) {
|
|
933
|
+
async _retryWithProgressIfNotConnected(progress, selector, strict, performLocatorHandlersCheckpoint, action) {
|
|
934
934
|
progress.log(`waiting for ${this._asLocator(selector)}`);
|
|
935
935
|
return this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
|
|
936
|
+
if (performLocatorHandlersCheckpoint) await this._page.performLocatorHandlersCheckpoint(progress);
|
|
936
937
|
const resolved = await this.selectors.resolveInjectedForSelector(selector, {
|
|
937
938
|
strict
|
|
938
939
|
});
|
|
@@ -985,7 +986,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
985
986
|
});
|
|
986
987
|
}
|
|
987
988
|
async rafrafTimeoutScreenshotElementWithProgress(progress, selector, timeout, options) {
|
|
988
|
-
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, async handle => {
|
|
989
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performLocatorHandlersCheckpoint */, async handle => {
|
|
989
990
|
await handle._frame.rafrafTimeout(timeout);
|
|
990
991
|
return await this._page._screenshotter.screenshotElement(progress, handle, options);
|
|
991
992
|
});
|
|
@@ -993,19 +994,19 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
993
994
|
async click(metadata, selector, options) {
|
|
994
995
|
const controller = new _progress.ProgressController(metadata, this);
|
|
995
996
|
return controller.run(async progress => {
|
|
996
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._click(progress, options)));
|
|
997
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._click(progress, options)));
|
|
997
998
|
}, this._page._timeoutSettings.timeout(options));
|
|
998
999
|
}
|
|
999
1000
|
async dblclick(metadata, selector, options = {}) {
|
|
1000
1001
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1001
1002
|
return controller.run(async progress => {
|
|
1002
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._dblclick(progress, options)));
|
|
1003
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._dblclick(progress, options)));
|
|
1003
1004
|
}, this._page._timeoutSettings.timeout(options));
|
|
1004
1005
|
}
|
|
1005
1006
|
async dragAndDrop(metadata, source, target, options = {}) {
|
|
1006
1007
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1007
1008
|
await controller.run(async progress => {
|
|
1008
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, source, options.strict, async handle => {
|
|
1009
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, source, options.strict, !options.force /* performLocatorHandlersCheckpoint */, async handle => {
|
|
1009
1010
|
return handle._retryPointerAction(progress, 'move and down', false, async point => {
|
|
1010
1011
|
await this._page.mouse.move(point.x, point.y);
|
|
1011
1012
|
await this._page.mouse.down();
|
|
@@ -1015,7 +1016,8 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1015
1016
|
timeout: progress.timeUntilDeadline()
|
|
1016
1017
|
});
|
|
1017
1018
|
}));
|
|
1018
|
-
|
|
1019
|
+
// Note: do not perform locator handlers checkpoint to avoid moving the mouse in the middle of a drag operation.
|
|
1020
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, target, options.strict, false /* performLocatorHandlersCheckpoint */, async handle => {
|
|
1019
1021
|
return handle._retryPointerAction(progress, 'move and up', false, async point => {
|
|
1020
1022
|
await this._page.mouse.move(point.x, point.y);
|
|
1021
1023
|
await this._page.mouse.up();
|
|
@@ -1031,25 +1033,25 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1031
1033
|
if (!this._page._browserContext._options.hasTouch) throw new Error('The page does not support tap. Use hasTouch context option to enable touch support.');
|
|
1032
1034
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1033
1035
|
return controller.run(async progress => {
|
|
1034
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._tap(progress, options)));
|
|
1036
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._tap(progress, options)));
|
|
1035
1037
|
}, this._page._timeoutSettings.timeout(options));
|
|
1036
1038
|
}
|
|
1037
1039
|
async fill(metadata, selector, value, options) {
|
|
1038
1040
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1039
1041
|
return controller.run(async progress => {
|
|
1040
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._fill(progress, value, options)));
|
|
1042
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._fill(progress, value, options)));
|
|
1041
1043
|
}, this._page._timeoutSettings.timeout(options));
|
|
1042
1044
|
}
|
|
1043
1045
|
async focus(metadata, selector, options = {}) {
|
|
1044
1046
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1045
1047
|
await controller.run(async progress => {
|
|
1046
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._focus(progress)));
|
|
1048
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._focus(progress)));
|
|
1047
1049
|
}, this._page._timeoutSettings.timeout(options));
|
|
1048
1050
|
}
|
|
1049
1051
|
async blur(metadata, selector, options = {}) {
|
|
1050
1052
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1051
1053
|
await controller.run(async progress => {
|
|
1052
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._blur(progress)));
|
|
1054
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._blur(progress)));
|
|
1053
1055
|
}, this._page._timeoutSettings.timeout(options));
|
|
1054
1056
|
}
|
|
1055
1057
|
async textContent(metadata, selector, options = {}, scope) {
|
|
@@ -1108,6 +1110,11 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1108
1110
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1109
1111
|
return controller.run(async progress => {
|
|
1110
1112
|
progress.log(` checking visibility of ${this._asLocator(selector)}`);
|
|
1113
|
+
return await this.isVisibleInternal(selector, options, scope);
|
|
1114
|
+
}, this._page._timeoutSettings.timeout({}));
|
|
1115
|
+
}
|
|
1116
|
+
async isVisibleInternal(selector, options = {}, scope) {
|
|
1117
|
+
try {
|
|
1111
1118
|
const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
|
|
1112
1119
|
if (!resolved) return false;
|
|
1113
1120
|
return await resolved.injected.evaluate((injected, {
|
|
@@ -1121,10 +1128,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1121
1128
|
info: resolved.info,
|
|
1122
1129
|
root: resolved.frame === this ? scope : undefined
|
|
1123
1130
|
});
|
|
1124
|
-
}
|
|
1131
|
+
} catch (e) {
|
|
1125
1132
|
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
|
|
1126
1133
|
return false;
|
|
1127
|
-
}
|
|
1134
|
+
}
|
|
1128
1135
|
}
|
|
1129
1136
|
async isHidden(metadata, selector, options = {}, scope) {
|
|
1130
1137
|
return !(await this.isVisible(metadata, selector, options, scope));
|
|
@@ -1144,44 +1151,44 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1144
1151
|
async hover(metadata, selector, options = {}) {
|
|
1145
1152
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1146
1153
|
return controller.run(async progress => {
|
|
1147
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._hover(progress, options)));
|
|
1154
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._hover(progress, options)));
|
|
1148
1155
|
}, this._page._timeoutSettings.timeout(options));
|
|
1149
1156
|
}
|
|
1150
1157
|
async selectOption(metadata, selector, elements, values, options = {}) {
|
|
1151
1158
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1152
1159
|
return controller.run(async progress => {
|
|
1153
|
-
return await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._selectOption(progress, elements, values, options));
|
|
1160
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._selectOption(progress, elements, values, options));
|
|
1154
1161
|
}, this._page._timeoutSettings.timeout(options));
|
|
1155
1162
|
}
|
|
1156
1163
|
async setInputFiles(metadata, selector, params) {
|
|
1157
1164
|
const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this, params);
|
|
1158
1165
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1159
1166
|
return controller.run(async progress => {
|
|
1160
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, handle => handle._setInputFiles(progress, inputFileItems, params)));
|
|
1167
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._setInputFiles(progress, inputFileItems, params)));
|
|
1161
1168
|
}, this._page._timeoutSettings.timeout(params));
|
|
1162
1169
|
}
|
|
1163
1170
|
async type(metadata, selector, text, options = {}) {
|
|
1164
1171
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1165
1172
|
return controller.run(async progress => {
|
|
1166
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._type(progress, text, options)));
|
|
1173
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._type(progress, text, options)));
|
|
1167
1174
|
}, this._page._timeoutSettings.timeout(options));
|
|
1168
1175
|
}
|
|
1169
1176
|
async press(metadata, selector, key, options = {}) {
|
|
1170
1177
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1171
1178
|
return controller.run(async progress => {
|
|
1172
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._press(progress, key, options)));
|
|
1179
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._press(progress, key, options)));
|
|
1173
1180
|
}, this._page._timeoutSettings.timeout(options));
|
|
1174
1181
|
}
|
|
1175
1182
|
async check(metadata, selector, options = {}) {
|
|
1176
1183
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1177
1184
|
return controller.run(async progress => {
|
|
1178
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._setChecked(progress, true, options)));
|
|
1185
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._setChecked(progress, true, options)));
|
|
1179
1186
|
}, this._page._timeoutSettings.timeout(options));
|
|
1180
1187
|
}
|
|
1181
1188
|
async uncheck(metadata, selector, options = {}) {
|
|
1182
1189
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1183
1190
|
return controller.run(async progress => {
|
|
1184
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, handle => handle._setChecked(progress, false, options)));
|
|
1191
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._setChecked(progress, false, options)));
|
|
1185
1192
|
}, this._page._timeoutSettings.timeout(options));
|
|
1186
1193
|
}
|
|
1187
1194
|
async waitForTimeout(metadata, timeout) {
|
|
@@ -1191,6 +1198,17 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1191
1198
|
});
|
|
1192
1199
|
}
|
|
1193
1200
|
async expect(metadata, selector, options) {
|
|
1201
|
+
const result = await this._expectImpl(metadata, selector, options);
|
|
1202
|
+
// Library mode special case for the expect errors which are return values, not exceptions.
|
|
1203
|
+
if (result.matches === options.isNot) metadata.error = {
|
|
1204
|
+
error: {
|
|
1205
|
+
name: 'Expect',
|
|
1206
|
+
message: 'Expect failed'
|
|
1207
|
+
}
|
|
1208
|
+
};
|
|
1209
|
+
return result;
|
|
1210
|
+
}
|
|
1211
|
+
async _expectImpl(metadata, selector, options) {
|
|
1194
1212
|
let timeout = this._page._timeoutSettings.timeout(options);
|
|
1195
1213
|
const start = timeout > 0 ? (0, _utils.monotonicTime)() : 0;
|
|
1196
1214
|
const lastIntermediateResult = {
|
|
@@ -1219,6 +1237,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1219
1237
|
}
|
|
1220
1238
|
return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
|
|
1221
1239
|
var _info$world;
|
|
1240
|
+
await this._page.performLocatorHandlersCheckpoint(progress);
|
|
1222
1241
|
const selectorInFrame = await this.selectors.resolveFrameForSelector(selector, {
|
|
1223
1242
|
strict: true
|
|
1224
1243
|
});
|
package/lib/server/helper.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.helper = void 0;
|
|
7
|
-
var _debugLogger = require("../
|
|
7
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
8
8
|
var _eventsHelper = require("../utils/eventsHelper");
|
|
9
9
|
/**
|
|
10
10
|
* Copyright 2017 Google Inc. All rights reserved.
|
package/lib/server/page.js
CHANGED
|
@@ -17,12 +17,13 @@ var _fileChooser = require("./fileChooser");
|
|
|
17
17
|
var _progress = require("./progress");
|
|
18
18
|
var _utils = require("../utils");
|
|
19
19
|
var _manualPromise = require("../utils/manualPromise");
|
|
20
|
-
var _debugLogger = require("../
|
|
20
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
21
21
|
var _comparators = require("../utils/comparators");
|
|
22
22
|
var _instrumentation = require("./instrumentation");
|
|
23
23
|
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
24
24
|
var _utilityScriptSerializers = require("./isomorphic/utilityScriptSerializers");
|
|
25
25
|
var _errors = require("./errors");
|
|
26
|
+
var _locatorGenerators = require("../utils/isomorphic/locatorGenerators");
|
|
26
27
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
27
28
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
28
29
|
/**
|
|
@@ -76,6 +77,9 @@ class Page extends _instrumentation.SdkObject {
|
|
|
76
77
|
this._video = null;
|
|
77
78
|
this._opener = void 0;
|
|
78
79
|
this._isServerSideOnly = false;
|
|
80
|
+
this._locatorHandlers = new Map();
|
|
81
|
+
this._lastLocatorHandlerUid = 0;
|
|
82
|
+
this._locatorHandlerRunningCounter = 0;
|
|
79
83
|
// Aiming at 25 fps by default - each frame is 40ms, but we give some slack with 35ms.
|
|
80
84
|
// When throttling for tracing, 200ms between frames, except for 10 frames around the action.
|
|
81
85
|
this._frameThrottler = new FrameThrottler(10, 35, 200);
|
|
@@ -139,6 +143,7 @@ class Page extends _instrumentation.SdkObject {
|
|
|
139
143
|
async resetForReuse(metadata) {
|
|
140
144
|
this.setDefaultNavigationTimeout(undefined);
|
|
141
145
|
this.setDefaultTimeout(undefined);
|
|
146
|
+
this._locatorHandlers.clear();
|
|
142
147
|
await this._removeExposedBindings();
|
|
143
148
|
await this._removeInitScripts();
|
|
144
149
|
await this.setClientRequestInterceptor(undefined);
|
|
@@ -282,6 +287,43 @@ class Page extends _instrumentation.SdkObject {
|
|
|
282
287
|
return response;
|
|
283
288
|
}), this._timeoutSettings.navigationTimeout(options));
|
|
284
289
|
}
|
|
290
|
+
registerLocatorHandler(selector) {
|
|
291
|
+
const uid = ++this._lastLocatorHandlerUid;
|
|
292
|
+
this._locatorHandlers.set(uid, {
|
|
293
|
+
selector
|
|
294
|
+
});
|
|
295
|
+
return uid;
|
|
296
|
+
}
|
|
297
|
+
resolveLocatorHandler(uid) {
|
|
298
|
+
const handler = this._locatorHandlers.get(uid);
|
|
299
|
+
if (handler) {
|
|
300
|
+
var _handler$resolved;
|
|
301
|
+
(_handler$resolved = handler.resolved) === null || _handler$resolved === void 0 || _handler$resolved.resolve();
|
|
302
|
+
handler.resolved = undefined;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async performLocatorHandlersCheckpoint(progress) {
|
|
306
|
+
// Do not run locator handlers from inside locator handler callbacks to avoid deadlocks.
|
|
307
|
+
if (this._locatorHandlerRunningCounter) return;
|
|
308
|
+
for (const [uid, handler] of this._locatorHandlers) {
|
|
309
|
+
if (!handler.resolved) {
|
|
310
|
+
if (await this.mainFrame().isVisibleInternal(handler.selector, {
|
|
311
|
+
strict: true
|
|
312
|
+
})) {
|
|
313
|
+
handler.resolved = new _manualPromise.ManualPromise();
|
|
314
|
+
this.emit(Page.Events.LocatorHandlerTriggered, uid);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (handler.resolved) {
|
|
318
|
+
++this._locatorHandlerRunningCounter;
|
|
319
|
+
progress.log(` found ${(0, _locatorGenerators.asLocator)(this.attribution.playwright.options.sdkLanguage, handler.selector)}, intercepting action to run the handler`);
|
|
320
|
+
await this.openScope.race(handler.resolved).finally(() => --this._locatorHandlerRunningCounter);
|
|
321
|
+
// Avoid side-effects after long-running operation.
|
|
322
|
+
progress.throwIfAborted();
|
|
323
|
+
progress.log(` interception handler has finished, continuing`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
285
327
|
async emulateMedia(options) {
|
|
286
328
|
if (options.media !== undefined) this._emulatedMedia.media = options.media;
|
|
287
329
|
if (options.colorScheme !== undefined) this._emulatedMedia.colorScheme = options.colorScheme;
|
|
@@ -347,10 +389,11 @@ class Page extends _instrumentation.SdkObject {
|
|
|
347
389
|
async expectScreenshot(metadata, options = {}) {
|
|
348
390
|
const locator = options.locator;
|
|
349
391
|
const rafrafScreenshot = locator ? async (progress, timeout) => {
|
|
350
|
-
return await locator.frame.rafrafTimeoutScreenshotElementWithProgress(progress, locator.selector, timeout, options
|
|
392
|
+
return await locator.frame.rafrafTimeoutScreenshotElementWithProgress(progress, locator.selector, timeout, options || {});
|
|
351
393
|
} : async (progress, timeout) => {
|
|
394
|
+
await this.performLocatorHandlersCheckpoint(progress);
|
|
352
395
|
await this.mainFrame().rafrafTimeout(timeout);
|
|
353
|
-
return await this._screenshotter.screenshotPage(progress, options
|
|
396
|
+
return await this._screenshotter.screenshotPage(progress, options || {});
|
|
354
397
|
};
|
|
355
398
|
const comparator = (0, _comparators.getComparator)('image/png');
|
|
356
399
|
const controller = new _progress.ProgressController(metadata, this);
|
|
@@ -358,7 +401,7 @@ class Page extends _instrumentation.SdkObject {
|
|
|
358
401
|
errorMessage: '"not" matcher requires expected result'
|
|
359
402
|
};
|
|
360
403
|
try {
|
|
361
|
-
const format = (0, _screenshotter.validateScreenshotOptions)(options
|
|
404
|
+
const format = (0, _screenshotter.validateScreenshotOptions)(options || {});
|
|
362
405
|
if (format !== 'png') throw new Error('Only PNG screenshots are supported');
|
|
363
406
|
} catch (error) {
|
|
364
407
|
return {
|
|
@@ -367,7 +410,7 @@ class Page extends _instrumentation.SdkObject {
|
|
|
367
410
|
}
|
|
368
411
|
let intermediateResult = undefined;
|
|
369
412
|
const areEqualScreenshots = (actual, expected, previous) => {
|
|
370
|
-
const comparatorResult = actual && expected ? comparator(actual, expected, options
|
|
413
|
+
const comparatorResult = actual && expected ? comparator(actual, expected, options) : undefined;
|
|
371
414
|
if (comparatorResult !== undefined && !!comparatorResult === !!options.isNot) return true;
|
|
372
415
|
if (comparatorResult) intermediateResult = {
|
|
373
416
|
errorMessage: comparatorResult.errorMessage,
|
|
@@ -520,6 +563,7 @@ Page.Events = {
|
|
|
520
563
|
FrameAttached: 'frameattached',
|
|
521
564
|
FrameDetached: 'framedetached',
|
|
522
565
|
InternalFrameNavigatedToNewDocument: 'internalframenavigatedtonewdocument',
|
|
566
|
+
LocatorHandlerTriggered: 'locatorhandlertriggered',
|
|
523
567
|
ScreencastFrame: 'screencastframe',
|
|
524
568
|
Video: 'video',
|
|
525
569
|
WebSocket: 'websocket',
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.PipeTransport = void 0;
|
|
7
7
|
var _utils = require("../utils");
|
|
8
|
-
var _debugLogger = require("../
|
|
8
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
9
9
|
/**
|
|
10
10
|
* Copyright 2018 Google Inc. All rights reserved.
|
|
11
11
|
* Modifications copyright (c) Microsoft Corporation.
|
package/lib/server/playwright.js
CHANGED
|
@@ -13,7 +13,7 @@ var _firefox = require("./firefox/firefox");
|
|
|
13
13
|
var _selectors = require("./selectors");
|
|
14
14
|
var _webkit = require("./webkit/webkit");
|
|
15
15
|
var _instrumentation = require("./instrumentation");
|
|
16
|
-
var _debugLogger = require("../
|
|
16
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
17
17
|
var _debugController = require("./debugController");
|
|
18
18
|
/**
|
|
19
19
|
* Copyright (c) Microsoft Corporation.
|
package/lib/server/progress.js
CHANGED
|
@@ -57,17 +57,9 @@ class ProgressController {
|
|
|
57
57
|
(_this$sdkObject$attri = this.sdkObject.attribution.context) === null || _this$sdkObject$attri === void 0 || _this$sdkObject$attri._activeProgressControllers.add(this);
|
|
58
58
|
const progress = {
|
|
59
59
|
log: message => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
},
|
|
64
|
-
logEntry: entry => {
|
|
65
|
-
if ('message' in entry) {
|
|
66
|
-
const message = entry.message;
|
|
67
|
-
if (this._state === 'running') this.metadata.log.push(message);
|
|
68
|
-
// Note: we might be sending logs after progress has finished, for example browser logs.
|
|
69
|
-
this.instrumentation.onCallLog(this.sdkObject, this.metadata, this._logName, message);
|
|
70
|
-
}
|
|
60
|
+
if (this._state === 'running') this.metadata.log.push(message);
|
|
61
|
+
// Note: we might be sending logs after progress has finished, for example browser logs.
|
|
62
|
+
this.instrumentation.onCallLog(this.sdkObject, this.metadata, this._logName, message);
|
|
71
63
|
},
|
|
72
64
|
timeUntilDeadline: () => this._deadline ? this._deadline - (0, _utils.monotonicTime)() : 2147483647,
|
|
73
65
|
// 2^31-1 safe setTimeout in Node.
|
|
@@ -138,7 +138,7 @@ class CSharpLanguageGenerator {
|
|
|
138
138
|
return `await Expect(${subject}.${this._asLocator(action.selector)}).ToBeVisibleAsync();`;
|
|
139
139
|
case 'assertValue':
|
|
140
140
|
{
|
|
141
|
-
const assertion = action.value ? `ToHaveValueAsync(${quote(action.value)})` : `
|
|
141
|
+
const assertion = action.value ? `ToHaveValueAsync(${quote(action.value)})` : `ToBeEmptyAsync()`;
|
|
142
142
|
return `await Expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
@@ -27,16 +27,29 @@ var _locatorGenerators = require("../../utils/isomorphic/locatorGenerators");
|
|
|
27
27
|
|
|
28
28
|
const deviceDescriptors = require('../deviceDescriptorsSource.json');
|
|
29
29
|
class JavaLanguageGenerator {
|
|
30
|
-
constructor() {
|
|
31
|
-
this.id =
|
|
30
|
+
constructor(mode) {
|
|
31
|
+
this.id = void 0;
|
|
32
32
|
this.groupName = 'Java';
|
|
33
|
-
this.name =
|
|
33
|
+
this.name = void 0;
|
|
34
34
|
this.highlighter = 'java';
|
|
35
|
+
this._mode = void 0;
|
|
36
|
+
if (mode === 'library') {
|
|
37
|
+
this.name = 'Library';
|
|
38
|
+
this.id = 'java';
|
|
39
|
+
} else if (mode === 'junit') {
|
|
40
|
+
this.name = 'JUnit';
|
|
41
|
+
this.id = 'java-junit';
|
|
42
|
+
} else {
|
|
43
|
+
throw new Error(`Unknown Java language mode: ${mode}`);
|
|
44
|
+
}
|
|
45
|
+
this._mode = mode;
|
|
35
46
|
}
|
|
36
47
|
generateAction(actionInContext) {
|
|
37
48
|
const action = actionInContext.action;
|
|
38
49
|
const pageAlias = actionInContext.frame.pageAlias;
|
|
39
|
-
const
|
|
50
|
+
const offset = this._mode === 'junit' ? 4 : 6;
|
|
51
|
+
const formatter = new _javascript.JavaScriptFormatter(offset);
|
|
52
|
+
if (this._mode !== 'library' && (action.name === 'openPage' || action.name === 'closePage')) return '';
|
|
40
53
|
if (action.name === 'openPage') {
|
|
41
54
|
formatter.add(`Page ${pageAlias} = context.newPage();`);
|
|
42
55
|
if (action.url && action.url !== 'about:blank' && action.url !== 'chrome://newtab/') formatter.add(`${pageAlias}.navigate(${quote(action.url)});`);
|
|
@@ -127,6 +140,21 @@ class JavaLanguageGenerator {
|
|
|
127
140
|
}
|
|
128
141
|
generateHeader(options) {
|
|
129
142
|
const formatter = new _javascript.JavaScriptFormatter();
|
|
143
|
+
if (this._mode === 'junit') {
|
|
144
|
+
formatter.add(`
|
|
145
|
+
import com.microsoft.playwright.junit.UsePlaywright;
|
|
146
|
+
import com.microsoft.playwright.Page;
|
|
147
|
+
import com.microsoft.playwright.options.*;
|
|
148
|
+
|
|
149
|
+
import org.junit.jupiter.api.*;
|
|
150
|
+
import static com.microsoft.playwright.assertions.PlaywrightAssertions.*;
|
|
151
|
+
|
|
152
|
+
@UsePlaywright
|
|
153
|
+
public class TestExample {
|
|
154
|
+
@Test
|
|
155
|
+
void test(Page page) {`);
|
|
156
|
+
return formatter.format();
|
|
157
|
+
}
|
|
130
158
|
formatter.add(`
|
|
131
159
|
import com.microsoft.playwright.*;
|
|
132
160
|
import com.microsoft.playwright.options.*;
|
|
@@ -142,6 +170,10 @@ class JavaLanguageGenerator {
|
|
|
142
170
|
}
|
|
143
171
|
generateFooter(saveStorage) {
|
|
144
172
|
const storageStateLine = saveStorage ? `\n context.storageState(new BrowserContext.StorageStateOptions().setPath(${quote(saveStorage)}));\n` : '';
|
|
173
|
+
if (this._mode === 'junit') {
|
|
174
|
+
return `${storageStateLine} }
|
|
175
|
+
}`;
|
|
176
|
+
}
|
|
145
177
|
return `${storageStateLine} }
|
|
146
178
|
}
|
|
147
179
|
}`;
|
package/lib/server/recorder.js
CHANGED
|
@@ -403,7 +403,7 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
403
403
|
}
|
|
404
404
|
setOutput(codegenId, outputFile) {
|
|
405
405
|
var _this$_generator;
|
|
406
|
-
const languages = new Set([new _java.JavaLanguageGenerator(), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */false), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */false), new _python.PythonLanguageGenerator( /* isAsync */true, /* isPytest */false), new _csharp.CSharpLanguageGenerator('mstest'), new _csharp.CSharpLanguageGenerator('nunit'), new _csharp.CSharpLanguageGenerator('library'), new _jsonl.JsonlLanguageGenerator()]);
|
|
406
|
+
const languages = new Set([new _java.JavaLanguageGenerator('junit'), new _java.JavaLanguageGenerator('library'), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */false), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */false), new _python.PythonLanguageGenerator( /* isAsync */true, /* isPytest */false), new _csharp.CSharpLanguageGenerator('mstest'), new _csharp.CSharpLanguageGenerator('nunit'), new _csharp.CSharpLanguageGenerator('library'), new _jsonl.JsonlLanguageGenerator()]);
|
|
407
407
|
const primaryLanguage = [...languages].find(l => l.id === codegenId);
|
|
408
408
|
if (!primaryLanguage) throw new Error(`\n===============================\nUnsupported language: '${codegenId}'\n===============================\n`);
|
|
409
409
|
languages.delete(primaryLanguage);
|
|
@@ -690,7 +690,7 @@ async function findFrameSelector(frame) {
|
|
|
690
690
|
const utility = await parent._utilityContext();
|
|
691
691
|
const injected = await utility.injectedScript();
|
|
692
692
|
const selector = await injected.evaluate((injected, element) => {
|
|
693
|
-
return injected.
|
|
693
|
+
return injected.generateSelectorSimple(element, {
|
|
694
694
|
testIdAttributeName: '',
|
|
695
695
|
omitInternalEngines: true
|
|
696
696
|
});
|
|
@@ -10,7 +10,7 @@ var _os = _interopRequireDefault(require("os"));
|
|
|
10
10
|
var _path = _interopRequireDefault(require("path"));
|
|
11
11
|
var _child_process = _interopRequireDefault(require("child_process"));
|
|
12
12
|
var _fileUtils = require("../../utils/fileUtils");
|
|
13
|
-
var _debugLogger = require("../../
|
|
13
|
+
var _debugLogger = require("../../utils/debugLogger");
|
|
14
14
|
var _manualPromise = require("../../utils/manualPromise");
|
|
15
15
|
var _utilsBundle = require("../../utilsBundle");
|
|
16
16
|
var _ = require(".");
|
|
@@ -166,7 +166,7 @@ async function validateDependenciesWindows(windowsExeAndDllDirectories) {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpenLibraries) {
|
|
169
|
-
var _deps$hostPlatform;
|
|
169
|
+
var _deps$hostPlatform, _process$getuid, _process;
|
|
170
170
|
const directoryPaths = linuxLddDirectories;
|
|
171
171
|
const lddPaths = [];
|
|
172
172
|
for (const directoryPath of directoryPaths) lddPaths.push(...(await executablesOrSharedLibraries(directoryPath)));
|
|
@@ -192,7 +192,7 @@ async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpe
|
|
|
192
192
|
missingDeps.delete(missingDep);
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
const maybeSudo = process.getuid
|
|
195
|
+
const maybeSudo = (_process$getuid = (_process = process).getuid) !== null && _process$getuid !== void 0 && _process$getuid.call(_process) && os.platform() !== 'win32' ? 'sudo ' : '';
|
|
196
196
|
const dockerInfo = readDockerVersionSync();
|
|
197
197
|
const errorLines = [`Host system is missing dependencies to run browsers.`];
|
|
198
198
|
// Ignore patch versions when comparing docker container version and Playwright version:
|
|
@@ -202,7 +202,7 @@ async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpe
|
|
|
202
202
|
// In this case, we know how to install dependencies in it.
|
|
203
203
|
const pwVersion = (0, _userAgent.getPlaywrightVersion)();
|
|
204
204
|
const requiredDockerImage = dockerInfo.dockerImageName.replace(dockerInfo.driverVersion, pwVersion);
|
|
205
|
-
errorLines.push(...[`This is most likely due to
|
|
205
|
+
errorLines.push(...[`This is most likely due to Docker image version not matching Playwright version:`, `- Playwright : ${pwVersion}`, `- Docker image: ${dockerInfo.driverVersion}`, ``, `Either:`, `- (recommended) use Docker image "${requiredDockerImage}"`, `- (alternative 1) run the following command inside Docker to install missing dependencies:`, ``, ` ${maybeSudo}${(0, _.buildPlaywrightCLICommand)(sdkLanguage, 'install-deps')}`, ``, `- (alternative 2) use apt inside Docker:`, ``, ` ${maybeSudo}apt-get install ${[...missingPackages].join('\\\n ')}`, ``, `<3 Playwright Team`]);
|
|
206
206
|
} else if (missingPackages.size && !missingDeps.size) {
|
|
207
207
|
// Only known dependencies are missing for browsers.
|
|
208
208
|
// Suggest installation with a Playwright CLI.
|
|
@@ -301,7 +301,8 @@ function quoteProcessArgs(args) {
|
|
|
301
301
|
});
|
|
302
302
|
}
|
|
303
303
|
async function transformCommandsForRoot(commands) {
|
|
304
|
-
|
|
304
|
+
var _process$getuid2, _process2;
|
|
305
|
+
const isRoot = ((_process$getuid2 = (_process2 = process).getuid) === null || _process$getuid2 === void 0 ? void 0 : _process$getuid2.call(_process2)) === 0;
|
|
305
306
|
if (isRoot) return {
|
|
306
307
|
command: 'sh',
|
|
307
308
|
args: ['-c', `${commands.join('&& ')}`],
|