@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.
Files changed (305) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +3 -0
  4. package/ThirdPartyNotices.txt +1513 -0
  5. package/bin/PrintDeps.exe +0 -0
  6. package/bin/README.md +2 -0
  7. package/bin/install_media_pack.ps1 +5 -0
  8. package/bin/reinstall_chrome_beta_linux.sh +40 -0
  9. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  10. package/bin/reinstall_chrome_beta_win.ps1 +23 -0
  11. package/bin/reinstall_chrome_stable_linux.sh +40 -0
  12. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  13. package/bin/reinstall_chrome_stable_win.ps1 +23 -0
  14. package/bin/reinstall_msedge_beta_linux.sh +40 -0
  15. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  16. package/bin/reinstall_msedge_beta_win.ps1 +22 -0
  17. package/bin/reinstall_msedge_dev_linux.sh +40 -0
  18. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  19. package/bin/reinstall_msedge_dev_win.ps1 +22 -0
  20. package/bin/reinstall_msedge_stable_linux.sh +40 -0
  21. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  22. package/bin/reinstall_msedge_stable_win.ps1 +23 -0
  23. package/browsers.json +64 -0
  24. package/cli.js +17 -0
  25. package/index.d.ts +17 -0
  26. package/index.js +33 -0
  27. package/index.mjs +28 -0
  28. package/lib/androidServerImpl.js +69 -0
  29. package/lib/browserServerImpl.js +92 -0
  30. package/lib/cli/driver.js +97 -0
  31. package/lib/cli/program.js +582 -0
  32. package/lib/cli/programWithTestStub.js +67 -0
  33. package/lib/client/accessibility.js +50 -0
  34. package/lib/client/android.js +473 -0
  35. package/lib/client/api.js +272 -0
  36. package/lib/client/artifact.js +79 -0
  37. package/lib/client/browser.js +145 -0
  38. package/lib/client/browserContext.js +509 -0
  39. package/lib/client/browserType.js +233 -0
  40. package/lib/client/cdpSession.js +53 -0
  41. package/lib/client/channelOwner.js +229 -0
  42. package/lib/client/clientHelper.js +57 -0
  43. package/lib/client/clientInstrumentation.js +40 -0
  44. package/lib/client/connection.js +327 -0
  45. package/lib/client/consoleMessage.js +55 -0
  46. package/lib/client/coverage.js +41 -0
  47. package/lib/client/dialog.js +57 -0
  48. package/lib/client/download.js +62 -0
  49. package/lib/client/electron.js +130 -0
  50. package/lib/client/elementHandle.js +291 -0
  51. package/lib/client/errors.js +77 -0
  52. package/lib/client/events.js +93 -0
  53. package/lib/client/fetch.js +343 -0
  54. package/lib/client/fileChooser.js +45 -0
  55. package/lib/client/frame.js +506 -0
  56. package/lib/client/harRouter.js +93 -0
  57. package/lib/client/input.js +111 -0
  58. package/lib/client/jsHandle.js +123 -0
  59. package/lib/client/jsonPipe.js +35 -0
  60. package/lib/client/localUtils.js +35 -0
  61. package/lib/client/locator.js +432 -0
  62. package/lib/client/network.js +601 -0
  63. package/lib/client/page.js +707 -0
  64. package/lib/client/playwright.js +74 -0
  65. package/lib/client/selectors.js +67 -0
  66. package/lib/client/stream.js +54 -0
  67. package/lib/client/tracing.js +135 -0
  68. package/lib/client/types.js +24 -0
  69. package/lib/client/video.js +51 -0
  70. package/lib/client/waiter.js +158 -0
  71. package/lib/client/webError.js +37 -0
  72. package/lib/client/worker.js +71 -0
  73. package/lib/client/writableStream.js +54 -0
  74. package/lib/common/socksProxy.js +569 -0
  75. package/lib/common/timeoutSettings.js +73 -0
  76. package/lib/common/types.js +5 -0
  77. package/lib/generated/consoleApiSource.js +7 -0
  78. package/lib/generated/injectedScriptSource.js +7 -0
  79. package/lib/generated/recorderSource.js +7 -0
  80. package/lib/generated/utilityScriptSource.js +7 -0
  81. package/lib/image_tools/colorUtils.js +98 -0
  82. package/lib/image_tools/compare.js +108 -0
  83. package/lib/image_tools/imageChannel.js +70 -0
  84. package/lib/image_tools/stats.js +102 -0
  85. package/lib/inProcessFactory.js +54 -0
  86. package/lib/inprocess.js +20 -0
  87. package/lib/outofprocess.js +67 -0
  88. package/lib/protocol/debug.js +27 -0
  89. package/lib/protocol/serializers.js +172 -0
  90. package/lib/protocol/transport.js +82 -0
  91. package/lib/protocol/validator.js +2599 -0
  92. package/lib/protocol/validatorPrimitives.js +139 -0
  93. package/lib/remote/playwrightConnection.js +274 -0
  94. package/lib/remote/playwrightServer.js +110 -0
  95. package/lib/server/accessibility.js +62 -0
  96. package/lib/server/android/android.js +441 -0
  97. package/lib/server/android/backendAdb.js +172 -0
  98. package/lib/server/artifact.js +104 -0
  99. package/lib/server/browser.js +129 -0
  100. package/lib/server/browserContext.js +609 -0
  101. package/lib/server/browserType.js +300 -0
  102. package/lib/server/chromium/appIcon.png +0 -0
  103. package/lib/server/chromium/chromium.js +346 -0
  104. package/lib/server/chromium/chromiumSwitches.js +41 -0
  105. package/lib/server/chromium/crAccessibility.js +237 -0
  106. package/lib/server/chromium/crBrowser.js +521 -0
  107. package/lib/server/chromium/crConnection.js +228 -0
  108. package/lib/server/chromium/crCoverage.js +246 -0
  109. package/lib/server/chromium/crDevTools.js +104 -0
  110. package/lib/server/chromium/crDragDrop.js +144 -0
  111. package/lib/server/chromium/crExecutionContext.js +156 -0
  112. package/lib/server/chromium/crInput.js +171 -0
  113. package/lib/server/chromium/crNetworkManager.js +723 -0
  114. package/lib/server/chromium/crPage.js +1173 -0
  115. package/lib/server/chromium/crPdf.js +147 -0
  116. package/lib/server/chromium/crProtocolHelper.js +131 -0
  117. package/lib/server/chromium/crServiceWorker.js +115 -0
  118. package/lib/server/chromium/defaultFontFamilies.js +145 -0
  119. package/lib/server/chromium/videoRecorder.js +155 -0
  120. package/lib/server/console.js +59 -0
  121. package/lib/server/cookieStore.js +112 -0
  122. package/lib/server/debugController.js +236 -0
  123. package/lib/server/debugger.js +132 -0
  124. package/lib/server/deviceDescriptors.js +21 -0
  125. package/lib/server/deviceDescriptorsSource.json +1549 -0
  126. package/lib/server/dialog.js +70 -0
  127. package/lib/server/dispatchers/androidDispatcher.js +193 -0
  128. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  129. package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
  130. package/lib/server/dispatchers/browserDispatcher.js +170 -0
  131. package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  132. package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  133. package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  134. package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  135. package/lib/server/dispatchers/dispatcher.js +400 -0
  136. package/lib/server/dispatchers/electronDispatcher.js +80 -0
  137. package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  138. package/lib/server/dispatchers/frameDispatcher.js +287 -0
  139. package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
  140. package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
  141. package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
  142. package/lib/server/dispatchers/networkDispatchers.js +221 -0
  143. package/lib/server/dispatchers/pageDispatcher.js +363 -0
  144. package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
  145. package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  146. package/lib/server/dispatchers/streamDispatcher.js +62 -0
  147. package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  148. package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
  149. package/lib/server/dom.js +808 -0
  150. package/lib/server/download.js +53 -0
  151. package/lib/server/electron/electron.js +254 -0
  152. package/lib/server/electron/loader.js +57 -0
  153. package/lib/server/errors.js +68 -0
  154. package/lib/server/fetch.js +611 -0
  155. package/lib/server/fileChooser.js +42 -0
  156. package/lib/server/fileUploadUtils.js +71 -0
  157. package/lib/server/firefox/ffAccessibility.js +215 -0
  158. package/lib/server/firefox/ffBrowser.js +447 -0
  159. package/lib/server/firefox/ffConnection.js +168 -0
  160. package/lib/server/firefox/ffExecutionContext.js +138 -0
  161. package/lib/server/firefox/ffInput.js +150 -0
  162. package/lib/server/firefox/ffNetworkManager.js +231 -0
  163. package/lib/server/firefox/ffPage.js +558 -0
  164. package/lib/server/firefox/firefox.js +91 -0
  165. package/lib/server/formData.js +75 -0
  166. package/lib/server/frameSelectors.js +171 -0
  167. package/lib/server/frames.js +1597 -0
  168. package/lib/server/har/harRecorder.js +139 -0
  169. package/lib/server/har/harTracer.js +539 -0
  170. package/lib/server/helper.js +103 -0
  171. package/lib/server/index.js +96 -0
  172. package/lib/server/input.js +301 -0
  173. package/lib/server/instrumentation.js +74 -0
  174. package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
  175. package/lib/server/javascript.js +305 -0
  176. package/lib/server/launchApp.js +90 -0
  177. package/lib/server/macEditingCommands.js +139 -0
  178. package/lib/server/network.js +607 -0
  179. package/lib/server/page.js +793 -0
  180. package/lib/server/pipeTransport.js +85 -0
  181. package/lib/server/playwright.js +82 -0
  182. package/lib/server/progress.js +102 -0
  183. package/lib/server/protocolError.js +49 -0
  184. package/lib/server/recorder/codeGenerator.js +153 -0
  185. package/lib/server/recorder/csharp.js +310 -0
  186. package/lib/server/recorder/java.js +216 -0
  187. package/lib/server/recorder/javascript.js +229 -0
  188. package/lib/server/recorder/jsonl.js +47 -0
  189. package/lib/server/recorder/language.js +44 -0
  190. package/lib/server/recorder/python.js +275 -0
  191. package/lib/server/recorder/recorderActions.js +5 -0
  192. package/lib/server/recorder/recorderApp.js +181 -0
  193. package/lib/server/recorder/recorderUtils.js +48 -0
  194. package/lib/server/recorder/utils.js +45 -0
  195. package/lib/server/recorder.js +700 -0
  196. package/lib/server/registry/browserFetcher.js +168 -0
  197. package/lib/server/registry/dependencies.js +322 -0
  198. package/lib/server/registry/index.js +925 -0
  199. package/lib/server/registry/nativeDeps.js +383 -0
  200. package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  201. package/lib/server/screenshotter.js +354 -0
  202. package/lib/server/selectors.js +73 -0
  203. package/lib/server/socksInterceptor.js +100 -0
  204. package/lib/server/trace/recorder/snapshotter.js +168 -0
  205. package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  206. package/lib/server/trace/recorder/tracing.js +552 -0
  207. package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  208. package/lib/server/trace/viewer/traceViewer.js +229 -0
  209. package/lib/server/transport.js +191 -0
  210. package/lib/server/types.js +24 -0
  211. package/lib/server/usKeyboardLayout.js +555 -0
  212. package/lib/server/webkit/webkit.js +87 -0
  213. package/lib/server/webkit/wkAccessibility.js +194 -0
  214. package/lib/server/webkit/wkBrowser.js +328 -0
  215. package/lib/server/webkit/wkConnection.js +173 -0
  216. package/lib/server/webkit/wkExecutionContext.js +146 -0
  217. package/lib/server/webkit/wkInput.js +169 -0
  218. package/lib/server/webkit/wkInterceptableRequest.js +158 -0
  219. package/lib/server/webkit/wkPage.js +1198 -0
  220. package/lib/server/webkit/wkProvisionalPage.js +59 -0
  221. package/lib/server/webkit/wkWorkers.js +104 -0
  222. package/lib/third_party/diff_match_patch.js +2222 -0
  223. package/lib/third_party/pixelmatch.js +255 -0
  224. package/lib/utils/ascii.js +31 -0
  225. package/lib/utils/comparators.js +171 -0
  226. package/lib/utils/crypto.js +33 -0
  227. package/lib/utils/debug.js +46 -0
  228. package/lib/utils/debugLogger.js +89 -0
  229. package/lib/utils/env.js +47 -0
  230. package/lib/utils/eventsHelper.js +38 -0
  231. package/lib/utils/fileUtils.js +66 -0
  232. package/lib/utils/glob.js +83 -0
  233. package/lib/utils/happy-eyeballs.js +154 -0
  234. package/lib/utils/headers.js +52 -0
  235. package/lib/utils/hostPlatform.js +124 -0
  236. package/lib/utils/httpServer.js +195 -0
  237. package/lib/utils/index.js +324 -0
  238. package/lib/utils/isomorphic/cssParser.js +250 -0
  239. package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  240. package/lib/utils/isomorphic/locatorGenerators.js +651 -0
  241. package/lib/utils/isomorphic/locatorParser.js +179 -0
  242. package/lib/utils/isomorphic/locatorUtils.js +62 -0
  243. package/lib/utils/isomorphic/selectorParser.js +397 -0
  244. package/lib/utils/isomorphic/stringUtils.js +107 -0
  245. package/lib/utils/isomorphic/traceUtils.js +39 -0
  246. package/lib/utils/linuxUtils.js +78 -0
  247. package/lib/utils/manualPromise.js +109 -0
  248. package/lib/utils/mimeType.js +29 -0
  249. package/lib/utils/multimap.js +75 -0
  250. package/lib/utils/network.js +189 -0
  251. package/lib/utils/processLauncher.js +248 -0
  252. package/lib/utils/profiler.js +53 -0
  253. package/lib/utils/rtti.js +41 -0
  254. package/lib/utils/semaphore.js +51 -0
  255. package/lib/utils/spawnAsync.js +45 -0
  256. package/lib/utils/stackTrace.js +123 -0
  257. package/lib/utils/task.js +58 -0
  258. package/lib/utils/time.js +37 -0
  259. package/lib/utils/timeoutRunner.js +131 -0
  260. package/lib/utils/traceUtils.js +44 -0
  261. package/lib/utils/userAgent.js +105 -0
  262. package/lib/utils/wsServer.js +125 -0
  263. package/lib/utils/zipFile.js +75 -0
  264. package/lib/utils/zones.js +99 -0
  265. package/lib/utilsBundle.js +81 -0
  266. package/lib/utilsBundleImpl/index.js +51 -0
  267. package/lib/utilsBundleImpl/xdg-open +1066 -0
  268. package/lib/vite/htmlReport/index.html +66 -0
  269. package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
  270. package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
  271. package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
  272. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
  273. package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
  274. package/lib/vite/recorder/index.html +29 -0
  275. package/lib/vite/recorder/playwright-logo.svg +9 -0
  276. package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
  278. package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
  279. package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
  280. package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
  281. package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
  282. package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
  283. package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
  284. package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
  285. package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
  286. package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
  287. package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
  288. package/lib/vite/traceViewer/index.html +26 -0
  289. package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
  290. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  291. package/lib/vite/traceViewer/snapshot.html +21 -0
  292. package/lib/vite/traceViewer/sw.bundle.js +4 -0
  293. package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
  294. package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
  295. package/lib/vite/traceViewer/uiMode.html +17 -0
  296. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
  297. package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
  298. package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
  299. package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
  300. package/lib/zipBundle.js +25 -0
  301. package/lib/zipBundleImpl.js +5 -0
  302. package/package.json +43 -0
  303. package/types/protocol.d.ts +20304 -0
  304. package/types/structs.d.ts +45 -0
  305. package/types/types.d.ts +20626 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CSharpLanguageGenerator = void 0;
7
+ var _language = require("./language");
8
+ var _utils = require("./utils");
9
+ var _stringUtils = require("../../utils/isomorphic/stringUtils");
10
+ var _locatorGenerators = require("../../utils/isomorphic/locatorGenerators");
11
+ /**
12
+ * Copyright (c) Microsoft Corporation.
13
+ *
14
+ * Licensed under the Apache License, Version 2.0 (the "License");
15
+ * you may not use this file except in compliance with the License.
16
+ * You may obtain a copy of the License at
17
+ *
18
+ * http://www.apache.org/licenses/LICENSE-2.0
19
+ *
20
+ * Unless required by applicable law or agreed to in writing, software
21
+ * distributed under the License is distributed on an "AS IS" BASIS,
22
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
+ * See the License for the specific language governing permissions and
24
+ * limitations under the License.
25
+ */
26
+
27
+ const deviceDescriptors = require('../deviceDescriptorsSource.json');
28
+ class CSharpLanguageGenerator {
29
+ constructor(mode) {
30
+ this.id = void 0;
31
+ this.groupName = '.NET C#';
32
+ this.name = void 0;
33
+ this.highlighter = 'csharp';
34
+ this._mode = void 0;
35
+ if (mode === 'library') {
36
+ this.name = 'Library';
37
+ this.id = 'csharp';
38
+ } else if (mode === 'mstest') {
39
+ this.name = 'MSTest';
40
+ this.id = 'csharp-mstest';
41
+ } else if (mode === 'nunit') {
42
+ this.name = 'NUnit';
43
+ this.id = 'csharp-nunit';
44
+ } else {
45
+ throw new Error(`Unknown C# language mode: ${mode}`);
46
+ }
47
+ this._mode = mode;
48
+ }
49
+ generateAction(actionInContext) {
50
+ const action = this._generateActionInner(actionInContext);
51
+ if (action) return action;
52
+ return '';
53
+ }
54
+ _generateActionInner(actionInContext) {
55
+ const action = actionInContext.action;
56
+ if (this._mode !== 'library' && (action.name === 'openPage' || action.name === 'closePage')) return '';
57
+ let pageAlias = actionInContext.frame.pageAlias;
58
+ if (this._mode !== 'library') pageAlias = pageAlias.replace('page', 'Page');
59
+ const formatter = new CSharpFormatter(this._mode === 'library' ? 0 : 8);
60
+ if (action.name === 'openPage') {
61
+ formatter.add(`var ${pageAlias} = await context.NewPageAsync();`);
62
+ if (action.url && action.url !== 'about:blank' && action.url !== 'chrome://newtab/') formatter.add(`await ${pageAlias}.GotoAsync(${quote(action.url)});`);
63
+ return formatter.format();
64
+ }
65
+ let subject;
66
+ if (actionInContext.frame.isMainFrame) {
67
+ subject = pageAlias;
68
+ } else {
69
+ const locators = actionInContext.frame.selectorsChain.map(selector => `.FrameLocator(${quote(selector)})`);
70
+ subject = `${pageAlias}${locators.join('')}`;
71
+ }
72
+ const signals = (0, _language.toSignalMap)(action);
73
+ if (signals.dialog) {
74
+ formatter.add(` void ${pageAlias}_Dialog${signals.dialog.dialogAlias}_EventHandler(object sender, IDialog dialog)
75
+ {
76
+ Console.WriteLine($"Dialog message: {dialog.Message}");
77
+ dialog.DismissAsync();
78
+ ${pageAlias}.Dialog -= ${pageAlias}_Dialog${signals.dialog.dialogAlias}_EventHandler;
79
+ }
80
+ ${pageAlias}.Dialog += ${pageAlias}_Dialog${signals.dialog.dialogAlias}_EventHandler;`);
81
+ }
82
+ const lines = [];
83
+ lines.push(this._generateActionCall(subject, action));
84
+ if (signals.download) {
85
+ lines.unshift(`var download${signals.download.downloadAlias} = await ${pageAlias}.RunAndWaitForDownloadAsync(async () =>\n{`);
86
+ lines.push(`});`);
87
+ }
88
+ if (signals.popup) {
89
+ lines.unshift(`var ${signals.popup.popupAlias} = await ${pageAlias}.RunAndWaitForPopupAsync(async () =>\n{`);
90
+ lines.push(`});`);
91
+ }
92
+ for (const line of lines) formatter.add(line);
93
+ return formatter.format();
94
+ }
95
+ _generateActionCall(subject, action) {
96
+ switch (action.name) {
97
+ case 'openPage':
98
+ throw Error('Not reached');
99
+ case 'closePage':
100
+ return `await ${subject}.CloseAsync();`;
101
+ case 'click':
102
+ {
103
+ let method = 'Click';
104
+ if (action.clickCount === 2) method = 'DblClick';
105
+ const modifiers = (0, _utils.toModifiers)(action.modifiers);
106
+ const options = {};
107
+ if (action.button !== 'left') options.button = action.button;
108
+ if (modifiers.length) options.modifiers = modifiers;
109
+ if (action.clickCount > 2) options.clickCount = action.clickCount;
110
+ if (action.position) options.position = action.position;
111
+ if (!Object.entries(options).length) return `await ${subject}.${this._asLocator(action.selector)}.${method}Async();`;
112
+ const optionsString = formatObject(options, ' ', 'Locator' + method + 'Options');
113
+ return `await ${subject}.${this._asLocator(action.selector)}.${method}Async(${optionsString});`;
114
+ }
115
+ case 'check':
116
+ return `await ${subject}.${this._asLocator(action.selector)}.CheckAsync();`;
117
+ case 'uncheck':
118
+ return `await ${subject}.${this._asLocator(action.selector)}.UncheckAsync();`;
119
+ case 'fill':
120
+ return `await ${subject}.${this._asLocator(action.selector)}.FillAsync(${quote(action.text)});`;
121
+ case 'setInputFiles':
122
+ return `await ${subject}.${this._asLocator(action.selector)}.SetInputFilesAsync(${formatObject(action.files)});`;
123
+ case 'press':
124
+ {
125
+ const modifiers = (0, _utils.toModifiers)(action.modifiers);
126
+ const shortcut = [...modifiers, action.key].join('+');
127
+ return `await ${subject}.${this._asLocator(action.selector)}.PressAsync(${quote(shortcut)});`;
128
+ }
129
+ case 'navigate':
130
+ return `await ${subject}.GotoAsync(${quote(action.url)});`;
131
+ case 'select':
132
+ return `await ${subject}.${this._asLocator(action.selector)}.SelectOptionAsync(${formatObject(action.options)});`;
133
+ case 'assertText':
134
+ return `await Expect(${subject}.${this._asLocator(action.selector)}).${action.substring ? 'ToContainTextAsync' : 'ToHaveTextAsync'}(${quote(action.text)});`;
135
+ case 'assertChecked':
136
+ return `await Expect(${subject}.${this._asLocator(action.selector)})${action.checked ? '' : '.Not'}.ToBeCheckedAsync();`;
137
+ case 'assertVisible':
138
+ return `await Expect(${subject}.${this._asLocator(action.selector)}).ToBeVisibleAsync();`;
139
+ case 'assertValue':
140
+ {
141
+ const assertion = action.value ? `ToHaveValueAsync(${quote(action.value)})` : `ToBeEmptyAsync()`;
142
+ return `await Expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
143
+ }
144
+ }
145
+ }
146
+ _asLocator(selector) {
147
+ return (0, _locatorGenerators.asLocator)('csharp', selector);
148
+ }
149
+ generateHeader(options) {
150
+ if (this._mode === 'library') return this.generateStandaloneHeader(options);
151
+ return this.generateTestRunnerHeader(options);
152
+ }
153
+ generateStandaloneHeader(options) {
154
+ const formatter = new CSharpFormatter(0);
155
+ formatter.add(`
156
+ using Microsoft.Playwright;
157
+ using System;
158
+ using System.Threading.Tasks;
159
+
160
+ using var playwright = await Playwright.CreateAsync();
161
+ await using var browser = await playwright.${toPascal(options.browserName)}.LaunchAsync(${formatObject(options.launchOptions, ' ', 'BrowserTypeLaunchOptions')});
162
+ var context = await browser.NewContextAsync(${formatContextOptions(options.contextOptions, options.deviceName)});`);
163
+ formatter.newLine();
164
+ return formatter.format();
165
+ }
166
+ generateTestRunnerHeader(options) {
167
+ const formatter = new CSharpFormatter(0);
168
+ formatter.add(`
169
+ using Microsoft.Playwright.${this._mode === 'nunit' ? 'NUnit' : 'MSTest'};
170
+ using Microsoft.Playwright;
171
+
172
+ ${this._mode === 'nunit' ? `[Parallelizable(ParallelScope.Self)]
173
+ [TestFixture]` : '[TestClass]'}
174
+ public class Tests : PageTest
175
+ {`);
176
+ const formattedContextOptions = formatContextOptions(options.contextOptions, options.deviceName);
177
+ if (formattedContextOptions) {
178
+ formatter.add(`public override BrowserNewContextOptions ContextOptions()
179
+ {
180
+ return ${formattedContextOptions};
181
+ }`);
182
+ formatter.newLine();
183
+ }
184
+ formatter.add(` [${this._mode === 'nunit' ? 'Test' : 'TestMethod'}]
185
+ public async Task MyTest()
186
+ {`);
187
+ return formatter.format();
188
+ }
189
+ generateFooter(saveStorage) {
190
+ const offset = this._mode === 'library' ? '' : ' ';
191
+ let storageStateLine = saveStorage ? `\n${offset}await context.StorageStateAsync(new BrowserContextStorageStateOptions\n${offset}{\n${offset} Path = ${quote(saveStorage)}\n${offset}});\n` : '';
192
+ if (this._mode !== 'library') storageStateLine += ` }\n}\n`;
193
+ return storageStateLine;
194
+ }
195
+ }
196
+ exports.CSharpLanguageGenerator = CSharpLanguageGenerator;
197
+ function formatObject(value, indent = ' ', name = '') {
198
+ if (typeof value === 'string') {
199
+ if (['permissions', 'colorScheme', 'modifiers', 'button', 'recordHarContent', 'recordHarMode', 'serviceWorkers'].includes(name)) return `${getClassName(name)}.${toPascal(value)}`;
200
+ return quote(value);
201
+ }
202
+ if (Array.isArray(value)) return `new[] { ${value.map(o => formatObject(o, indent, name)).join(', ')} }`;
203
+ if (typeof value === 'object') {
204
+ const keys = Object.keys(value).filter(key => value[key] !== undefined).sort();
205
+ if (!keys.length) return name ? `new ${getClassName(name)}` : '';
206
+ const tokens = [];
207
+ for (const key of keys) {
208
+ const property = getPropertyName(key);
209
+ tokens.push(`${property} = ${formatObject(value[key], indent, key)},`);
210
+ }
211
+ if (name) return `new ${getClassName(name)}\n{\n${indent}${tokens.join(`\n${indent}`)}\n${indent}}`;
212
+ return `{\n${indent}${tokens.join(`\n${indent}`)}\n${indent}}`;
213
+ }
214
+ if (name === 'latitude' || name === 'longitude') return String(value) + 'm';
215
+ return String(value);
216
+ }
217
+ function getClassName(value) {
218
+ switch (value) {
219
+ case 'viewport':
220
+ return 'ViewportSize';
221
+ case 'proxy':
222
+ return 'ProxySettings';
223
+ case 'permissions':
224
+ return 'ContextPermission';
225
+ case 'modifiers':
226
+ return 'KeyboardModifier';
227
+ case 'button':
228
+ return 'MouseButton';
229
+ case 'recordHarMode':
230
+ return 'HarMode';
231
+ case 'recordHarContent':
232
+ return 'HarContentPolicy';
233
+ case 'serviceWorkers':
234
+ return 'ServiceWorkerPolicy';
235
+ default:
236
+ return toPascal(value);
237
+ }
238
+ }
239
+ function getPropertyName(key) {
240
+ switch (key) {
241
+ case 'storageState':
242
+ return 'StorageStatePath';
243
+ case 'viewport':
244
+ return 'ViewportSize';
245
+ default:
246
+ return toPascal(key);
247
+ }
248
+ }
249
+ function toPascal(value) {
250
+ return value[0].toUpperCase() + value.slice(1);
251
+ }
252
+ function convertContextOptions(options) {
253
+ const result = {
254
+ ...options
255
+ };
256
+ if (options.recordHar) {
257
+ result['recordHarPath'] = options.recordHar.path;
258
+ result['recordHarContent'] = options.recordHar.content;
259
+ result['recordHarMode'] = options.recordHar.mode;
260
+ result['recordHarOmitContent'] = options.recordHar.omitContent;
261
+ result['recordHarUrlFilter'] = options.recordHar.urlFilter;
262
+ delete result.recordHar;
263
+ }
264
+ return result;
265
+ }
266
+ function formatContextOptions(options, deviceName) {
267
+ const device = deviceName && deviceDescriptors[deviceName];
268
+ if (!device) {
269
+ if (!Object.entries(options).length) return '';
270
+ return formatObject(convertContextOptions(options), ' ', 'BrowserNewContextOptions');
271
+ }
272
+ options = (0, _language.sanitizeDeviceOptions)(device, options);
273
+ if (!Object.entries(options).length) return `playwright.Devices[${quote(deviceName)}]`;
274
+ return formatObject(convertContextOptions(options), ' ', `BrowserNewContextOptions(playwright.Devices[${quote(deviceName)}])`);
275
+ }
276
+ class CSharpFormatter {
277
+ constructor(offset = 0) {
278
+ this._baseIndent = void 0;
279
+ this._baseOffset = void 0;
280
+ this._lines = [];
281
+ this._baseIndent = ' '.repeat(4);
282
+ this._baseOffset = ' '.repeat(offset);
283
+ }
284
+ prepend(text) {
285
+ this._lines = text.trim().split('\n').map(line => line.trim()).concat(this._lines);
286
+ }
287
+ add(text) {
288
+ this._lines.push(...text.trim().split('\n').map(line => line.trim()));
289
+ }
290
+ newLine() {
291
+ this._lines.push('');
292
+ }
293
+ format() {
294
+ let spaces = '';
295
+ let previousLine = '';
296
+ return this._lines.map(line => {
297
+ if (line === '') return line;
298
+ if (line.startsWith('}') || line.startsWith(']') || line.includes('});') || line === ');') spaces = spaces.substring(this._baseIndent.length);
299
+ const extraSpaces = /^(for|while|if).*\(.*\)$/.test(previousLine) ? this._baseIndent : '';
300
+ previousLine = line;
301
+ line = spaces + extraSpaces + line;
302
+ if (line.endsWith('{') || line.endsWith('[') || line.endsWith('(')) spaces += this._baseIndent;
303
+ if (line.endsWith('));')) spaces = spaces.substring(this._baseIndent.length);
304
+ return this._baseOffset + line;
305
+ }).join('\n');
306
+ }
307
+ }
308
+ function quote(text) {
309
+ return (0, _stringUtils.escapeWithQuotes)(text, '\"');
310
+ }
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.JavaLanguageGenerator = void 0;
7
+ var _language = require("./language");
8
+ var _utils = require("./utils");
9
+ var _javascript = require("./javascript");
10
+ var _stringUtils = require("../../utils/isomorphic/stringUtils");
11
+ var _locatorGenerators = require("../../utils/isomorphic/locatorGenerators");
12
+ /**
13
+ * Copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ const deviceDescriptors = require('../deviceDescriptorsSource.json');
29
+ class JavaLanguageGenerator {
30
+ constructor() {
31
+ this.id = 'java';
32
+ this.groupName = 'Java';
33
+ this.name = 'Library';
34
+ this.highlighter = 'java';
35
+ }
36
+ generateAction(actionInContext) {
37
+ const action = actionInContext.action;
38
+ const pageAlias = actionInContext.frame.pageAlias;
39
+ const formatter = new _javascript.JavaScriptFormatter(6);
40
+ if (action.name === 'openPage') {
41
+ formatter.add(`Page ${pageAlias} = context.newPage();`);
42
+ if (action.url && action.url !== 'about:blank' && action.url !== 'chrome://newtab/') formatter.add(`${pageAlias}.navigate(${quote(action.url)});`);
43
+ return formatter.format();
44
+ }
45
+ let subject;
46
+ let inFrameLocator = false;
47
+ if (actionInContext.frame.isMainFrame) {
48
+ subject = pageAlias;
49
+ } else {
50
+ const locators = actionInContext.frame.selectorsChain.map(selector => `.frameLocator(${quote(selector)})`);
51
+ subject = `${pageAlias}${locators.join('')}`;
52
+ inFrameLocator = true;
53
+ }
54
+ const signals = (0, _language.toSignalMap)(action);
55
+ if (signals.dialog) {
56
+ formatter.add(` ${pageAlias}.onceDialog(dialog -> {
57
+ System.out.println(String.format("Dialog message: %s", dialog.message()));
58
+ dialog.dismiss();
59
+ });`);
60
+ }
61
+ let code = this._generateActionCall(subject, action, inFrameLocator);
62
+ if (signals.popup) {
63
+ code = `Page ${signals.popup.popupAlias} = ${pageAlias}.waitForPopup(() -> {
64
+ ${code}
65
+ });`;
66
+ }
67
+ if (signals.download) {
68
+ code = `Download download${signals.download.downloadAlias} = ${pageAlias}.waitForDownload(() -> {
69
+ ${code}
70
+ });`;
71
+ }
72
+ formatter.add(code);
73
+ return formatter.format();
74
+ }
75
+ _generateActionCall(subject, action, inFrameLocator) {
76
+ switch (action.name) {
77
+ case 'openPage':
78
+ throw Error('Not reached');
79
+ case 'closePage':
80
+ return `${subject}.close();`;
81
+ case 'click':
82
+ {
83
+ let method = 'click';
84
+ if (action.clickCount === 2) method = 'dblclick';
85
+ const modifiers = (0, _utils.toModifiers)(action.modifiers);
86
+ const options = {};
87
+ if (action.button !== 'left') options.button = action.button;
88
+ if (modifiers.length) options.modifiers = modifiers;
89
+ if (action.clickCount > 2) options.clickCount = action.clickCount;
90
+ if (action.position) options.position = action.position;
91
+ const optionsText = formatClickOptions(options);
92
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.${method}(${optionsText});`;
93
+ }
94
+ case 'check':
95
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.check();`;
96
+ case 'uncheck':
97
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.uncheck();`;
98
+ case 'fill':
99
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.fill(${quote(action.text)});`;
100
+ case 'setInputFiles':
101
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.setInputFiles(${formatPath(action.files.length === 1 ? action.files[0] : action.files)});`;
102
+ case 'press':
103
+ {
104
+ const modifiers = (0, _utils.toModifiers)(action.modifiers);
105
+ const shortcut = [...modifiers, action.key].join('+');
106
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.press(${quote(shortcut)});`;
107
+ }
108
+ case 'navigate':
109
+ return `${subject}.navigate(${quote(action.url)});`;
110
+ case 'select':
111
+ return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.selectOption(${formatSelectOption(action.options.length > 1 ? action.options : action.options[0])});`;
112
+ case 'assertText':
113
+ return `assertThat(${subject}.${this._asLocator(action.selector, inFrameLocator)}).${action.substring ? 'containsText' : 'hasText'}(${quote(action.text)});`;
114
+ case 'assertChecked':
115
+ return `assertThat(${subject}.${this._asLocator(action.selector, inFrameLocator)})${action.checked ? '' : '.not()'}.isChecked();`;
116
+ case 'assertVisible':
117
+ return `assertThat(${subject}.${this._asLocator(action.selector, inFrameLocator)}).isVisible();`;
118
+ case 'assertValue':
119
+ {
120
+ const assertion = action.value ? `hasValue(${quote(action.value)})` : `isEmpty()`;
121
+ return `assertThat(${subject}.${this._asLocator(action.selector, inFrameLocator)}).${assertion};`;
122
+ }
123
+ }
124
+ }
125
+ _asLocator(selector, inFrameLocator) {
126
+ return (0, _locatorGenerators.asLocator)('java', selector, inFrameLocator);
127
+ }
128
+ generateHeader(options) {
129
+ const formatter = new _javascript.JavaScriptFormatter();
130
+ formatter.add(`
131
+ import com.microsoft.playwright.*;
132
+ import com.microsoft.playwright.options.*;
133
+ import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
134
+ import java.util.*;
135
+
136
+ public class Example {
137
+ public static void main(String[] args) {
138
+ try (Playwright playwright = Playwright.create()) {
139
+ Browser browser = playwright.${options.browserName}().launch(${formatLaunchOptions(options.launchOptions)});
140
+ BrowserContext context = browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName)});`);
141
+ return formatter.format();
142
+ }
143
+ generateFooter(saveStorage) {
144
+ const storageStateLine = saveStorage ? `\n context.storageState(new BrowserContext.StorageStateOptions().setPath(${quote(saveStorage)}));\n` : '';
145
+ return `${storageStateLine} }
146
+ }
147
+ }`;
148
+ }
149
+ }
150
+ exports.JavaLanguageGenerator = JavaLanguageGenerator;
151
+ function formatPath(files) {
152
+ if (Array.isArray(files)) {
153
+ if (files.length === 0) return 'new Path[0]';
154
+ return `new Path[] {${files.map(s => 'Paths.get(' + quote(s) + ')').join(', ')}}`;
155
+ }
156
+ return `Paths.get(${quote(files)})`;
157
+ }
158
+ function formatSelectOption(options) {
159
+ if (Array.isArray(options)) {
160
+ if (options.length === 0) return 'new String[0]';
161
+ return `new String[] {${options.map(s => quote(s)).join(', ')}}`;
162
+ }
163
+ return quote(options);
164
+ }
165
+ function formatLaunchOptions(options) {
166
+ const lines = [];
167
+ if (!Object.keys(options).filter(key => options[key] !== undefined).length) return '';
168
+ lines.push('new BrowserType.LaunchOptions()');
169
+ if (options.channel) lines.push(` .setChannel(${quote(options.channel)})`);
170
+ if (typeof options.headless === 'boolean') lines.push(` .setHeadless(false)`);
171
+ return lines.join('\n');
172
+ }
173
+ function formatContextOptions(contextOptions, deviceName) {
174
+ var _options$recordHar, _options$recordHar2, _options$recordHar3, _options$recordHar4, _options$recordHar5, _options$recordHar6, _options$recordHar7;
175
+ const lines = [];
176
+ if (!Object.keys(contextOptions).length && !deviceName) return '';
177
+ const device = deviceName ? deviceDescriptors[deviceName] : {};
178
+ const options = {
179
+ ...device,
180
+ ...contextOptions
181
+ };
182
+ lines.push('new Browser.NewContextOptions()');
183
+ if (options.acceptDownloads) lines.push(` .setAcceptDownloads(true)`);
184
+ if (options.bypassCSP) lines.push(` .setBypassCSP(true)`);
185
+ if (options.colorScheme) lines.push(` .setColorScheme(ColorScheme.${options.colorScheme.toUpperCase()})`);
186
+ if (options.deviceScaleFactor) lines.push(` .setDeviceScaleFactor(${options.deviceScaleFactor})`);
187
+ if (options.geolocation) lines.push(` .setGeolocation(${options.geolocation.latitude}, ${options.geolocation.longitude})`);
188
+ if (options.hasTouch) lines.push(` .setHasTouch(${options.hasTouch})`);
189
+ if (options.isMobile) lines.push(` .setIsMobile(${options.isMobile})`);
190
+ if (options.locale) lines.push(` .setLocale(${quote(options.locale)})`);
191
+ if (options.proxy) lines.push(` .setProxy(new Proxy(${quote(options.proxy.server)}))`);
192
+ if ((_options$recordHar = options.recordHar) !== null && _options$recordHar !== void 0 && _options$recordHar.content) lines.push(` .setRecordHarContent(HarContentPolicy.${(_options$recordHar2 = options.recordHar) === null || _options$recordHar2 === void 0 ? void 0 : _options$recordHar2.content.toUpperCase()})`);
193
+ if ((_options$recordHar3 = options.recordHar) !== null && _options$recordHar3 !== void 0 && _options$recordHar3.mode) lines.push(` .setRecordHarMode(HarMode.${(_options$recordHar4 = options.recordHar) === null || _options$recordHar4 === void 0 ? void 0 : _options$recordHar4.mode.toUpperCase()})`);
194
+ if ((_options$recordHar5 = options.recordHar) !== null && _options$recordHar5 !== void 0 && _options$recordHar5.omitContent) lines.push(` .setRecordHarOmitContent(true)`);
195
+ if ((_options$recordHar6 = options.recordHar) !== null && _options$recordHar6 !== void 0 && _options$recordHar6.path) lines.push(` .setRecordHarPath(Paths.get(${quote(options.recordHar.path)}))`);
196
+ if ((_options$recordHar7 = options.recordHar) !== null && _options$recordHar7 !== void 0 && _options$recordHar7.urlFilter) lines.push(` .setRecordHarUrlFilter(${quote(options.recordHar.urlFilter)})`);
197
+ if (options.serviceWorkers) lines.push(` .setServiceWorkers(ServiceWorkerPolicy.${options.serviceWorkers.toUpperCase()})`);
198
+ if (options.storageState) lines.push(` .setStorageStatePath(Paths.get(${quote(options.storageState)}))`);
199
+ if (options.timezoneId) lines.push(` .setTimezoneId(${quote(options.timezoneId)})`);
200
+ if (options.userAgent) lines.push(` .setUserAgent(${quote(options.userAgent)})`);
201
+ if (options.viewport) lines.push(` .setViewportSize(${options.viewport.width}, ${options.viewport.height})`);
202
+ return lines.join('\n');
203
+ }
204
+ function formatClickOptions(options) {
205
+ const lines = [];
206
+ if (options.button) lines.push(` .setButton(MouseButton.${options.button.toUpperCase()})`);
207
+ if (options.modifiers) lines.push(` .setModifiers(Arrays.asList(${options.modifiers.map(m => `KeyboardModifier.${m.toUpperCase()}`).join(', ')}))`);
208
+ if (options.clickCount) lines.push(` .setClickCount(${options.clickCount})`);
209
+ if (options.position) lines.push(` .setPosition(${options.position.x}, ${options.position.y})`);
210
+ if (!lines.length) return '';
211
+ lines.unshift(`new Locator.ClickOptions()`);
212
+ return lines.join('\n');
213
+ }
214
+ function quote(text) {
215
+ return (0, _stringUtils.escapeWithQuotes)(text, '\"');
216
+ }