@checkly/playwright-core 1.48.22 → 1.51.11-beta.2

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 (307) hide show
  1. package/ThirdPartyNotices.txt +60 -48
  2. package/bin/reinstall_chrome_beta_linux.sh +10 -8
  3. package/bin/reinstall_chrome_stable_linux.sh +10 -8
  4. package/bin/reinstall_msedge_beta_linux.sh +17 -9
  5. package/bin/reinstall_msedge_dev_linux.sh +17 -9
  6. package/bin/reinstall_msedge_stable_linux.sh +17 -9
  7. package/browsers.json +33 -12
  8. package/index.js +0 -1
  9. package/lib/androidServerImpl.js +5 -5
  10. package/lib/browserServerImpl.js +18 -9
  11. package/lib/checkly/secretsFilter.js +1 -1
  12. package/lib/cli/driver.js +6 -6
  13. package/lib/cli/program.js +38 -43
  14. package/lib/cli/programWithTestStub.js +2 -1
  15. package/lib/client/android.js +37 -58
  16. package/lib/client/artifact.js +4 -7
  17. package/lib/client/browser.js +10 -15
  18. package/lib/client/browserContext.js +69 -62
  19. package/lib/client/browserType.js +30 -64
  20. package/lib/client/channelOwner.js +53 -68
  21. package/lib/client/clientHelper.js +4 -6
  22. package/lib/client/clientInstrumentation.js +2 -0
  23. package/lib/client/clientStackTrace.js +65 -0
  24. package/lib/client/connection.js +48 -41
  25. package/lib/client/consoleMessage.js +4 -7
  26. package/lib/client/electron.js +10 -10
  27. package/lib/client/elementHandle.js +32 -33
  28. package/lib/client/errors.js +2 -2
  29. package/lib/client/eventEmitter.js +5 -8
  30. package/lib/client/fetch.js +61 -62
  31. package/lib/client/fileUtils.js +31 -0
  32. package/lib/client/frame.js +22 -23
  33. package/lib/client/harRouter.js +7 -9
  34. package/lib/client/jsHandle.js +3 -4
  35. package/lib/client/localUtils.js +24 -0
  36. package/lib/client/locator.js +27 -13
  37. package/lib/client/network.js +44 -37
  38. package/lib/client/page.js +50 -41
  39. package/lib/client/platform.js +71 -0
  40. package/lib/client/playwright.js +21 -1
  41. package/lib/client/selectors.js +8 -2
  42. package/lib/client/stream.js +2 -21
  43. package/lib/client/timeoutSettings.js +65 -0
  44. package/lib/client/tracing.js +29 -7
  45. package/lib/client/video.js +2 -2
  46. package/lib/client/waiter.js +19 -16
  47. package/lib/client/webSocket.js +106 -0
  48. package/lib/client/worker.js +4 -4
  49. package/lib/client/writableStream.js +2 -21
  50. package/lib/generated/consoleApiSource.js +1 -1
  51. package/lib/generated/injectedScriptSource.js +1 -1
  52. package/lib/generated/pollingRecorderSource.js +1 -1
  53. package/lib/generated/recorderSource.js +7 -0
  54. package/lib/generated/webSocketMockSource.js +1 -1
  55. package/lib/inProcessFactory.js +8 -3
  56. package/lib/outofprocess.js +12 -8
  57. package/lib/protocol/debug.js +1 -1
  58. package/lib/protocol/validator.js +77 -11
  59. package/lib/protocol/validatorPrimitives.js +1 -2
  60. package/lib/remote/playwrightConnection.js +21 -12
  61. package/lib/remote/playwrightServer.js +22 -8
  62. package/lib/server/android/android.js +17 -14
  63. package/lib/server/android/backendAdb.js +14 -14
  64. package/lib/server/artifact.js +3 -3
  65. package/lib/server/bidi/bidiBrowser.js +11 -8
  66. package/lib/server/bidi/bidiChromium.js +5 -4
  67. package/lib/server/bidi/bidiConnection.js +1 -3
  68. package/lib/server/bidi/bidiExecutionContext.js +71 -25
  69. package/lib/server/bidi/bidiFirefox.js +4 -3
  70. package/lib/server/bidi/bidiInput.js +11 -12
  71. package/lib/server/bidi/bidiNetworkManager.js +11 -12
  72. package/lib/server/bidi/bidiOverCdp.js +2 -2
  73. package/lib/server/bidi/bidiPage.js +39 -66
  74. package/lib/server/bidi/third_party/bidiKeyboard.js +9 -7
  75. package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
  76. package/lib/server/browser.js +2 -2
  77. package/lib/server/browserContext.js +60 -55
  78. package/lib/server/browserType.js +22 -18
  79. package/lib/server/callLog.js +79 -0
  80. package/lib/server/chromium/chromium.js +20 -16
  81. package/lib/server/chromium/chromiumSwitches.js +32 -9
  82. package/lib/server/chromium/crBrowser.js +25 -24
  83. package/lib/server/chromium/crConnection.js +2 -2
  84. package/lib/server/chromium/crCoverage.js +1 -1
  85. package/lib/server/chromium/crDevTools.js +1 -1
  86. package/lib/server/chromium/crDragDrop.js +1 -1
  87. package/lib/server/chromium/crExecutionContext.js +26 -35
  88. package/lib/server/chromium/crInput.js +17 -6
  89. package/lib/server/chromium/crNetworkManager.js +3 -3
  90. package/lib/server/chromium/crPage.js +43 -55
  91. package/lib/server/chromium/crPdf.js +1 -1
  92. package/lib/server/chromium/crProtocolHelper.js +3 -3
  93. package/lib/server/chromium/crServiceWorker.js +2 -2
  94. package/lib/server/chromium/videoRecorder.js +2 -2
  95. package/lib/server/clock.js +1 -1
  96. package/lib/server/codegen/csharp.js +21 -16
  97. package/lib/server/codegen/java.js +17 -9
  98. package/lib/server/codegen/javascript.js +37 -7
  99. package/lib/server/codegen/jsonl.js +1 -1
  100. package/lib/server/codegen/languages.js +2 -2
  101. package/lib/server/codegen/python.js +14 -17
  102. package/lib/server/debugController.js +23 -45
  103. package/lib/server/debugger.js +1 -1
  104. package/lib/server/deviceDescriptors.js +1 -1
  105. package/lib/server/deviceDescriptorsSource.json +131 -131
  106. package/lib/server/dispatchers/androidDispatcher.js +14 -3
  107. package/lib/server/dispatchers/artifactDispatcher.js +3 -3
  108. package/lib/server/dispatchers/browserContextDispatcher.js +21 -32
  109. package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
  110. package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
  111. package/lib/server/dispatchers/debugControllerDispatcher.js +5 -3
  112. package/lib/server/dispatchers/dispatcher.js +27 -25
  113. package/lib/server/dispatchers/electronDispatcher.js +3 -3
  114. package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
  115. package/lib/server/dispatchers/frameDispatcher.js +9 -3
  116. package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
  117. package/lib/server/dispatchers/localUtilsDispatcher.js +25 -291
  118. package/lib/server/dispatchers/networkDispatchers.js +3 -3
  119. package/lib/server/dispatchers/pageDispatcher.js +10 -8
  120. package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
  121. package/lib/server/dispatchers/streamDispatcher.js +4 -3
  122. package/lib/server/dispatchers/tracingDispatcher.js +10 -0
  123. package/lib/server/dispatchers/webSocketRouteDispatcher.js +18 -18
  124. package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
  125. package/lib/server/dom.js +102 -48
  126. package/lib/server/download.js +1 -1
  127. package/lib/server/electron/electron.js +17 -16
  128. package/lib/server/errors.js +1 -1
  129. package/lib/server/fetch.js +49 -33
  130. package/lib/server/fileUploadUtils.js +7 -4
  131. package/lib/server/firefox/ffBrowser.js +17 -9
  132. package/lib/server/firefox/ffConnection.js +1 -1
  133. package/lib/server/firefox/ffExecutionContext.js +25 -29
  134. package/lib/server/firefox/ffInput.js +15 -4
  135. package/lib/server/firefox/ffNetworkManager.js +3 -3
  136. package/lib/server/firefox/ffPage.js +29 -50
  137. package/lib/server/firefox/firefox.js +7 -9
  138. package/lib/server/frameSelectors.js +1 -1
  139. package/lib/server/frames.js +65 -55
  140. package/lib/server/har/harRecorder.js +4 -4
  141. package/lib/server/har/harTracer.js +8 -9
  142. package/lib/server/harBackend.js +157 -0
  143. package/lib/server/helper.js +2 -2
  144. package/lib/server/index.js +1 -14
  145. package/lib/server/input.js +3 -4
  146. package/lib/server/instrumentation.js +2 -2
  147. package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
  148. package/lib/server/javascript.js +26 -33
  149. package/lib/server/launchApp.js +7 -7
  150. package/lib/server/localUtils.js +203 -0
  151. package/lib/server/network.js +5 -5
  152. package/lib/server/page.js +76 -37
  153. package/lib/server/pipeTransport.js +1 -1
  154. package/lib/server/playwright.js +5 -5
  155. package/lib/server/progress.js +1 -4
  156. package/lib/server/protocolError.js +1 -1
  157. package/lib/server/recorder/chat.js +177 -0
  158. package/lib/server/recorder/codeGenerator.js +154 -0
  159. package/lib/server/recorder/contextRecorder.js +9 -18
  160. package/lib/server/recorder/csharp.js +311 -0
  161. package/lib/server/recorder/java.js +249 -0
  162. package/lib/server/recorder/javascript.js +230 -0
  163. package/lib/server/recorder/jsonl.js +48 -0
  164. package/lib/server/recorder/language.js +45 -0
  165. package/lib/server/recorder/python.js +276 -0
  166. package/lib/server/recorder/recorderActions.js +6 -0
  167. package/lib/server/recorder/recorderApp.js +25 -28
  168. package/lib/server/recorder/recorderCollection.js +9 -21
  169. package/lib/server/recorder/recorderInTraceViewer.js +1 -1
  170. package/lib/server/recorder/recorderRunner.js +7 -3
  171. package/lib/server/recorder/recorderUtils.js +5 -28
  172. package/lib/server/recorder/throttledFile.js +3 -4
  173. package/lib/server/recorder/utils.js +46 -0
  174. package/lib/server/recorder.js +83 -43
  175. package/lib/server/registry/browserFetcher.js +10 -8
  176. package/lib/server/registry/dependencies.js +20 -20
  177. package/lib/server/registry/index.js +215 -61
  178. package/lib/server/registry/nativeDeps.js +10 -4
  179. package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
  180. package/lib/server/screenshotter.js +1 -1
  181. package/lib/server/selectors.js +3 -3
  182. package/lib/server/socksClientCertificatesInterceptor.js +8 -8
  183. package/lib/server/socksInterceptor.js +8 -5
  184. package/lib/server/storageScript.js +160 -0
  185. package/lib/server/timeoutSettings.js +74 -0
  186. package/lib/server/trace/recorder/snapshotter.js +10 -20
  187. package/lib/server/trace/recorder/snapshotterInjected.js +26 -1
  188. package/lib/server/trace/recorder/tracing.js +108 -45
  189. package/lib/server/trace/test/inMemorySnapshotter.js +6 -6
  190. package/lib/server/trace/viewer/traceViewer.js +21 -7
  191. package/lib/server/transport.js +3 -2
  192. package/lib/server/utils/ascii.js +31 -0
  193. package/lib/server/utils/comparators.js +159 -0
  194. package/lib/server/utils/crypto.js +171 -0
  195. package/lib/server/utils/debug.js +38 -0
  196. package/lib/server/utils/debugLogger.js +93 -0
  197. package/lib/server/utils/env.js +53 -0
  198. package/lib/server/utils/eventsHelper.js +38 -0
  199. package/lib/server/utils/expectUtils.js +33 -0
  200. package/lib/server/utils/fileUtils.js +204 -0
  201. package/lib/server/utils/happyEyeballs.js +207 -0
  202. package/lib/server/utils/hostPlatform.js +145 -0
  203. package/lib/server/utils/httpServer.js +233 -0
  204. package/lib/server/utils/image_tools/colorUtils.js +98 -0
  205. package/lib/server/utils/image_tools/compare.js +108 -0
  206. package/lib/server/utils/image_tools/imageChannel.js +70 -0
  207. package/lib/server/utils/image_tools/stats.js +102 -0
  208. package/lib/server/utils/linuxUtils.js +58 -0
  209. package/lib/server/utils/network.js +160 -0
  210. package/lib/server/utils/nodePlatform.js +140 -0
  211. package/lib/server/utils/pipeTransport.js +82 -0
  212. package/lib/server/utils/processLauncher.js +248 -0
  213. package/lib/server/utils/profiler.js +52 -0
  214. package/lib/server/utils/socksProxy.js +570 -0
  215. package/lib/server/utils/spawnAsync.js +45 -0
  216. package/lib/server/utils/task.js +58 -0
  217. package/lib/server/utils/userAgent.js +91 -0
  218. package/lib/server/utils/wsServer.js +128 -0
  219. package/lib/server/utils/zipFile.js +75 -0
  220. package/lib/server/utils/zones.js +54 -0
  221. package/lib/server/webkit/webkit.js +4 -4
  222. package/lib/server/webkit/wkBrowser.js +10 -10
  223. package/lib/server/webkit/wkConnection.js +1 -1
  224. package/lib/server/webkit/wkExecutionContext.js +26 -30
  225. package/lib/server/webkit/wkInput.js +17 -7
  226. package/lib/server/webkit/wkInterceptableRequest.js +2 -2
  227. package/lib/server/webkit/wkPage.js +80 -66
  228. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  229. package/lib/server/webkit/wkWorkers.js +2 -2
  230. package/lib/utils/fileUtils.js +1 -1
  231. package/lib/utils/glob.js +84 -0
  232. package/lib/utils/isomorphic/ariaSnapshot.js +392 -0
  233. package/lib/utils/isomorphic/assert.js +25 -0
  234. package/lib/utils/isomorphic/colors.js +65 -0
  235. package/lib/utils/isomorphic/cssParser.js +5 -5
  236. package/lib/utils/isomorphic/headers.js +52 -0
  237. package/lib/utils/isomorphic/locatorGenerators.js +38 -8
  238. package/lib/utils/isomorphic/locatorParser.js +19 -13
  239. package/lib/utils/isomorphic/manualPromise.js +107 -0
  240. package/lib/utils/isomorphic/mimeType.js +11 -3
  241. package/lib/utils/isomorphic/multimap.js +73 -0
  242. package/lib/utils/isomorphic/rtti.js +41 -0
  243. package/lib/utils/isomorphic/semaphore.js +51 -0
  244. package/lib/utils/isomorphic/stackTrace.js +169 -0
  245. package/lib/utils/isomorphic/stringUtils.js +31 -1
  246. package/lib/utils/isomorphic/time.js +25 -0
  247. package/lib/utils/isomorphic/timeoutRunner.js +66 -0
  248. package/lib/utils/isomorphic/traceUtils.js +23 -0
  249. package/lib/utils/isomorphic/types.js +5 -0
  250. package/lib/utils/isomorphic/urlMatch.js +7 -5
  251. package/lib/utils/mimeType.js +30 -0
  252. package/lib/utils/stackTrace.js +1 -1
  253. package/lib/utils.js +447 -0
  254. package/lib/utilsBundle.js +4 -29
  255. package/lib/utilsBundleImpl/index.js +188 -33
  256. package/lib/vite/htmlReport/index.html +20 -17
  257. package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
  258. package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
  259. package/lib/vite/recorder/assets/{index-BW-aOBcL.css → index-eHBmevrY.css} +1 -1
  260. package/lib/vite/recorder/index.html +2 -2
  261. package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +24 -0
  262. package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +1 -0
  263. package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +235 -0
  264. package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +25 -0
  265. package/lib/vite/traceViewer/assets/{xtermModule-BeNbaIVa.js → xtermModule-BoAIEibi.js} +7 -7
  266. package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +1 -0
  267. package/lib/vite/traceViewer/{embedded.BkvOrz5Z.js → embedded.DpNPH6mk.js} +2 -2
  268. package/lib/vite/traceViewer/embedded.html +6 -6
  269. package/lib/vite/traceViewer/index.CuE3SYGw.js +2 -0
  270. package/lib/vite/traceViewer/index.html +27 -9
  271. package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +1 -0
  272. package/lib/vite/traceViewer/{recorder.DNMfnSiu.js → recorder.BD-uZJs7.js} +2 -2
  273. package/lib/vite/traceViewer/recorder.html +4 -4
  274. package/lib/vite/traceViewer/sw.bundle.js +7888 -3
  275. package/lib/vite/traceViewer/{uiMode.CAYqod-m.css → uiMode.BatfzHMG.css} +1 -1
  276. package/lib/vite/traceViewer/uiMode.DHrNgddz.js +5 -0
  277. package/lib/vite/traceViewer/uiMode.html +8 -7
  278. package/lib/vite/traceViewer/workbench.B9vIAzH9.css +1 -0
  279. package/lib/zipBundleImpl.js +4 -4
  280. package/package.json +7 -7
  281. package/types/protocol.d.ts +820 -153
  282. package/types/types.d.ts +285 -82
  283. package/bin/PrintDeps.exe +0 -0
  284. package/bin/README.md +0 -2
  285. package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +0 -24
  286. package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
  287. package/lib/vite/traceViewer/assets/codeMirrorModule-pBPtArIT.js +0 -24
  288. package/lib/vite/traceViewer/assets/codeMirrorModule-tzBrK1V4.js +0 -24
  289. package/lib/vite/traceViewer/assets/inspectorTab-BuJ3wAX_.js +0 -64
  290. package/lib/vite/traceViewer/assets/inspectorTab-Soeeuvzv.js +0 -64
  291. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
  292. package/lib/vite/traceViewer/assets/workbench-DdmJ9AJV.js +0 -9
  293. package/lib/vite/traceViewer/assets/workbench-lypYlf00.js +0 -9
  294. package/lib/vite/traceViewer/embedded.DInvAijy.js +0 -2
  295. package/lib/vite/traceViewer/index.Dha3cgqs.js +0 -2
  296. package/lib/vite/traceViewer/index._Iolt-uE.js +0 -2
  297. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +0 -1
  298. package/lib/vite/traceViewer/recorder.DTSaNaly.js +0 -2
  299. package/lib/vite/traceViewer/uiMode.BM7yhjzl.js +0 -5
  300. package/lib/vite/traceViewer/uiMode.Cr1tvTWS.js +0 -5
  301. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +0 -1
  302. /package/lib/vite/recorder/assets/{codeMirrorModule-ez37Vkbh.css → codeMirrorModule-C3UTv-Ge.css} +0 -0
  303. /package/lib/vite/traceViewer/{codeMirrorModule.ez37Vkbh.css → codeMirrorModule.C3UTv-Ge.css} +0 -0
  304. /package/lib/vite/traceViewer/{embedded.w7WN2u1R.css → embedded.mLhjB5IF.css} +0 -0
  305. /package/lib/vite/traceViewer/{index.CrbWWHbf.css → index.CFOW-Ezb.css} +0 -0
  306. /package/lib/vite/traceViewer/{recorder.B_SY1GJM.css → recorder.tn0RQdqM.css} +0 -0
  307. /package/lib/vite/traceViewer/{xtermModule.DSXBckUd.css → xtermModule.Beg8tuEN.css} +0 -0
@@ -4,9 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.JavaScriptLanguageGenerator = exports.JavaScriptFormatter = void 0;
7
+ exports.quoteMultiline = quoteMultiline;
7
8
  var _language = require("./language");
8
- var _deviceDescriptors = require("../deviceDescriptors");
9
9
  var _utils = require("../../utils");
10
+ var _deviceDescriptors = require("../deviceDescriptors");
10
11
  /**
11
12
  * Copyright (c) Microsoft Corporation.
12
13
  *
@@ -92,7 +93,7 @@ class JavaScriptLanguageGenerator {
92
93
  case 'navigate':
93
94
  return `await ${subject}.goto(${quote(action.url)});`;
94
95
  case 'select':
95
- return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${formatObject(action.options.length > 1 ? action.options : action.options[0])});`;
96
+ return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${formatObject(action.options.length === 1 ? action.options[0] : action.options)});`;
96
97
  case 'assertText':
97
98
  return `${this._isTest ? '' : '// '}await expect(${subject}.${this._asLocator(action.selector)}).${action.substring ? 'toContainText' : 'toHaveText'}(${quote(action.text)});`;
98
99
  case 'assertChecked':
@@ -104,6 +105,11 @@ class JavaScriptLanguageGenerator {
104
105
  const assertion = action.value ? `toHaveValue(${quote(action.value)})` : `toBeEmpty()`;
105
106
  return `${this._isTest ? '' : '// '}await expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
106
107
  }
108
+ case 'assertSnapshot':
109
+ {
110
+ const commentIfNeeded = this._isTest ? '' : '// ';
111
+ return `${commentIfNeeded}await expect(${subject}.${this._asLocator(action.selector)}).toMatchAriaSnapshot(${quoteMultiline(action.snapshot, `${commentIfNeeded} `)});`;
112
+ }
107
113
  }
108
114
  }
109
115
  _asLocator(selector) {
@@ -119,11 +125,17 @@ class JavaScriptLanguageGenerator {
119
125
  }
120
126
  generateTestHeader(options) {
121
127
  const formatter = new JavaScriptFormatter();
122
- const useText = formatContextOptions(options.contextOptions, options.deviceName);
128
+ const useText = formatContextOptions(options.contextOptions, options.deviceName, this._isTest);
123
129
  formatter.add(`
124
130
  import { test, expect${options.deviceName ? ', devices' : ''} } from '@playwright/test';
125
131
  ${useText ? '\ntest.use(' + useText + ');\n' : ''}
126
132
  test('test', async ({ page }) => {`);
133
+ if (options.contextOptions.recordHar) {
134
+ const url = options.contextOptions.recordHar.urlFilter;
135
+ formatter.add(` await page.routeFromHAR(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatOptions({
136
+ url
137
+ }, false)}` : ''});`);
138
+ }
127
139
  return formatter.format();
128
140
  }
129
141
  generateTestFooter(saveStorage) {
@@ -136,7 +148,8 @@ ${useText ? '\ntest.use(' + useText + ');\n' : ''}
136
148
 
137
149
  (async () => {
138
150
  const browser = await ${options.browserName}.launch(${formatObjectOrVoid(options.launchOptions)});
139
- const context = await browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName)});`);
151
+ const context = await browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName, false)});`);
152
+ if (options.contextOptions.recordHar) formatter.add(` await context.routeFromHAR(${quote(options.contextOptions.recordHar.path)});`);
140
153
  return formatter.format();
141
154
  }
142
155
  generateStandaloneFooter(saveStorage) {
@@ -169,8 +182,13 @@ function formatObjectOrVoid(value, indent = ' ') {
169
182
  const result = formatObject(value, indent);
170
183
  return result === '{}' ? '' : result;
171
184
  }
172
- function formatContextOptions(options, deviceName) {
185
+ function formatContextOptions(options, deviceName, isTest) {
173
186
  const device = deviceName && _deviceDescriptors.deviceDescriptors[deviceName];
187
+ // recordHAR is replaced with routeFromHAR in the generated code.
188
+ options = {
189
+ ...options,
190
+ recordHar: undefined
191
+ };
174
192
  if (!device) return formatObjectOrVoid(options);
175
193
  // Filter out all the properties from the device descriptor.
176
194
  let serializedObject = formatObjectOrVoid((0, _language.sanitizeDeviceOptions)(device, options));
@@ -189,10 +207,12 @@ class JavaScriptFormatter {
189
207
  this._baseOffset = ' '.repeat(offset);
190
208
  }
191
209
  prepend(text) {
192
- this._lines = text.trim().split('\n').map(line => line.trim()).concat(this._lines);
210
+ const trim = isMultilineString(text) ? line => line : line => line.trim();
211
+ this._lines = text.trim().split('\n').map(trim).concat(this._lines);
193
212
  }
194
213
  add(text) {
195
- this._lines.push(...text.trim().split('\n').map(line => line.trim()));
214
+ const trim = isMultilineString(text) ? line => line : line => line.trim();
215
+ this._lines.push(...text.trim().split('\n').map(trim));
196
216
  }
197
217
  newLine() {
198
218
  this._lines.push('');
@@ -220,4 +240,14 @@ function wrapWithStep(description, body) {
220
240
  return description ? `await test.step(\`${description}\`, async () => {
221
241
  ${body}
222
242
  });` : body;
243
+ }
244
+ function quoteMultiline(text, indent = ' ') {
245
+ const escape = text => text.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
246
+ const lines = text.split('\n');
247
+ if (lines.length === 1) return '`' + escape(text) + '`';
248
+ return '`\n' + lines.map(line => indent + escape(line).replace(/\${/g, '\\${')).join('\n') + `\n${indent}\``;
249
+ }
250
+ function isMultilineString(text) {
251
+ var _text$match;
252
+ return (_text$match = text.match(/`[\S\s]*`/)) === null || _text$match === void 0 ? void 0 : _text$match[0].includes('\n');
223
253
  }
@@ -32,7 +32,7 @@ class JsonlLanguageGenerator {
32
32
  const locator = actionInContext.action.selector ? JSON.parse((0, _utils.asLocator)('jsonl', actionInContext.action.selector)) : undefined;
33
33
  const entry = {
34
34
  ...actionInContext.action,
35
- pageAlias: actionInContext.frame.pageAlias,
35
+ ...actionInContext.frame,
36
36
  locator
37
37
  };
38
38
  return JSON.stringify(entry);
@@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.languageSet = languageSet;
7
+ var _csharp = require("./csharp");
7
8
  var _java = require("./java");
8
9
  var _javascript = require("./javascript");
9
10
  var _jsonl = require("./jsonl");
10
- var _csharp = require("./csharp");
11
11
  var _python = require("./python");
12
12
  /**
13
13
  * Copyright (c) Microsoft Corporation.
@@ -26,5 +26,5 @@ var _python = require("./python");
26
26
  */
27
27
 
28
28
  function languageSet() {
29
- return 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()]);
29
+ return 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()]);
30
30
  }
@@ -114,6 +114,8 @@ class PythonLanguageGenerator {
114
114
  const assertion = action.value ? `to_have_value(${quote(action.value)})` : `to_be_empty()`;
115
115
  return `expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
116
116
  }
117
+ case 'assertSnapshot':
118
+ return `expect(${subject}.${this._asLocator(action.selector)}).to_match_aria_snapshot(${quote(action.snapshot)})`;
117
119
  }
118
120
  }
119
121
  _asLocator(selector) {
@@ -121,6 +123,7 @@ class PythonLanguageGenerator {
121
123
  }
122
124
  generateHeader(options) {
123
125
  const formatter = new PythonFormatter();
126
+ const recordHar = options.contextOptions.recordHar;
124
127
  if (this._isPyTest) {
125
128
  const contextOptions = formatContextOptions(options.contextOptions, options.deviceName, true /* asDict */);
126
129
  const fixture = contextOptions ? `
@@ -130,11 +133,12 @@ def browser_context_args(browser_context_args, playwright) {
130
133
  return {${contextOptions}}
131
134
  }
132
135
  ` : '';
133
- formatter.add(`${options.deviceName ? 'import pytest\n' : ''}import re
136
+ formatter.add(`${options.deviceName || contextOptions ? 'import pytest\n' : ''}import re
134
137
  from playwright.sync_api import Page, expect
135
138
  ${fixture}
136
139
 
137
140
  def test_example(page: Page) -> None {`);
141
+ if (recordHar) formatter.add(` page.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
138
142
  } else if (this._isAsync) {
139
143
  formatter.add(`
140
144
  import asyncio
@@ -145,6 +149,7 @@ from playwright.async_api import Playwright, async_playwright, expect
145
149
  async def run(playwright: Playwright) -> None {
146
150
  browser = await playwright.${options.browserName}.launch(${formatOptions(options.launchOptions, false)})
147
151
  context = await browser.new_context(${formatContextOptions(options.contextOptions, options.deviceName)})`);
152
+ if (recordHar) formatter.add(` await context.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
148
153
  } else {
149
154
  formatter.add(`
150
155
  import re
@@ -154,6 +159,7 @@ from playwright.sync_api import Playwright, sync_playwright, expect
154
159
  def run(playwright: Playwright) -> None {
155
160
  browser = playwright.${options.browserName}.launch(${formatOptions(options.launchOptions, false)})
156
161
  context = browser.new_context(${formatContextOptions(options.contextOptions, options.deviceName)})`);
162
+ if (recordHar) formatter.add(` context.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
157
163
  }
158
164
  return formatter.format();
159
165
  }
@@ -205,24 +211,15 @@ function formatOptions(value, hasArguments, asDict) {
205
211
  return `${(0, _utils.toSnakeCase)(key)}=${formatValue(value[key])}`;
206
212
  }).join(', ');
207
213
  }
208
- function convertContextOptions(options) {
209
- const result = {
210
- ...options
211
- };
212
- if (options.recordHar) {
213
- result['record_har_path'] = options.recordHar.path;
214
- result['record_har_content'] = options.recordHar.content;
215
- result['record_har_mode'] = options.recordHar.mode;
216
- result['record_har_omit_content'] = options.recordHar.omitContent;
217
- result['record_har_url_filter'] = options.recordHar.urlFilter;
218
- delete result.recordHar;
219
- }
220
- return result;
221
- }
222
214
  function formatContextOptions(options, deviceName, asDict) {
215
+ // recordHAR is replaced with routeFromHAR in the generated code.
216
+ options = {
217
+ ...options,
218
+ recordHar: undefined
219
+ };
223
220
  const device = deviceName && _deviceDescriptors.deviceDescriptors[deviceName];
224
- if (!device) return formatOptions(convertContextOptions(options), false, asDict);
225
- return `**playwright.devices[${quote(deviceName)}]` + formatOptions(convertContextOptions((0, _language.sanitizeDeviceOptions)(device, options)), true, asDict);
221
+ if (!device) return formatOptions(options, false, asDict);
222
+ return `**playwright.devices[${quote(deviceName)}]` + formatOptions((0, _language.sanitizeDeviceOptions)(device, options), true, asDict);
226
223
  }
227
224
  class PythonFormatter {
228
225
  constructor(offset = 0) {
@@ -4,11 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.DebugController = void 0;
7
- var _processLauncher = require("../utils/processLauncher");
8
7
  var _instrumentation = require("./instrumentation");
8
+ var _processLauncher = require("./utils/processLauncher");
9
9
  var _recorder = require("./recorder");
10
- var _recorderApp = require("./recorder/recorderApp");
11
10
  var _utils = require("../utils");
11
+ var _ariaSnapshot = require("../utils/isomorphic/ariaSnapshot");
12
+ var _utilsBundle = require("../utilsBundle");
13
+ var _recorderApp = require("./recorder/recorderApp");
14
+ var _locatorParser = require("../utils/isomorphic/locatorParser");
12
15
  /**
13
16
  * Copyright (c) Microsoft Corporation.
14
17
  *
@@ -34,9 +37,6 @@ class DebugController extends _instrumentation.SdkObject {
34
37
  },
35
38
  instrumentation: (0, _instrumentation.createInstrumentation)()
36
39
  }, undefined, 'DebugController');
37
- this._autoCloseTimer = void 0;
38
- // TODO: remove in 1.27
39
- this._autoCloseAllowed = false;
40
40
  this._trackHierarchyListener = void 0;
41
41
  this._playwright = void 0;
42
42
  this._sdkLanguage = 'javascript';
@@ -47,20 +47,17 @@ class DebugController extends _instrumentation.SdkObject {
47
47
  this._codegenId = codegenId;
48
48
  this._sdkLanguage = sdkLanguage;
49
49
  }
50
- setAutoCloseAllowed(allowed) {
51
- this._autoCloseAllowed = allowed;
52
- }
53
50
  dispose() {
54
51
  this.setReportStateChanged(false);
55
- this.setAutoCloseAllowed(false);
56
52
  }
57
53
  setReportStateChanged(enabled) {
58
54
  if (enabled && !this._trackHierarchyListener) {
59
55
  this._trackHierarchyListener = {
60
- onPageOpen: () => this._emitSnapshot(),
61
- onPageClose: () => this._emitSnapshot()
56
+ onPageOpen: () => this._emitSnapshot(false),
57
+ onPageClose: () => this._emitSnapshot(false)
62
58
  };
63
59
  this._playwright.instrumentation.addListener(this._trackHierarchyListener, null);
60
+ this._emitSnapshot(true);
64
61
  } else if (!enabled && this._trackHierarchyListener) {
65
62
  this._playwright.instrumentation.removeListener(this._trackHierarchyListener);
66
63
  this._trackHierarchyListener = undefined;
@@ -82,7 +79,6 @@ class DebugController extends _instrumentation.SdkObject {
82
79
  recorder.hideHighlightedSelector();
83
80
  recorder.setMode('none');
84
81
  }
85
- this.setAutoCloseEnabled(true);
86
82
  return;
87
83
  }
88
84
  if (!this._playwright.allBrowsers().length) await this._playwright.chromium.launch(internalMetadata, {
@@ -107,19 +103,14 @@ class DebugController extends _instrumentation.SdkObject {
107
103
  if (params.mode !== 'inspecting') recorder.setOutput(this._codegenId, params.file);
108
104
  recorder.setMode(params.mode);
109
105
  }
110
- this.setAutoCloseEnabled(true);
111
- }
112
- async setAutoCloseEnabled(enabled) {
113
- if (!this._autoCloseAllowed) return;
114
- if (this._autoCloseTimer) clearTimeout(this._autoCloseTimer);
115
- if (!enabled) return;
116
- const heartBeat = () => {
117
- if (!this._playwright.allPages().length) (0, _processLauncher.gracefullyProcessExitDoNotHang)(0);else this._autoCloseTimer = setTimeout(heartBeat, 5000);
118
- };
119
- this._autoCloseTimer = setTimeout(heartBeat, 30000);
120
106
  }
121
- async highlight(selector) {
122
- for (const recorder of await this._allRecorders()) recorder.setHighlightedSelector(this._sdkLanguage, selector);
107
+ async highlight(params) {
108
+ // Assert parameters validity.
109
+ if (params.selector) (0, _locatorParser.unsafeLocatorOrSelectorAsSelector)(this._sdkLanguage, params.selector, 'data-testid');
110
+ const ariaTemplate = params.ariaTemplate ? (0, _ariaSnapshot.parseAriaSnapshotUnsafe)(_utilsBundle.yaml, params.ariaTemplate) : undefined;
111
+ for (const recorder of await this._allRecorders()) {
112
+ if (ariaTemplate) recorder.setHighlightedAriaTemplate(ariaTemplate);else if (params.selector) recorder.setHighlightedSelector(this._sdkLanguage, params.selector);
113
+ }
123
114
  }
124
115
  async hideHighlight() {
125
116
  // Hide all active recorder highlights.
@@ -141,23 +132,9 @@ class DebugController extends _instrumentation.SdkObject {
141
132
  reason: 'Close all browsers requested'
142
133
  })));
143
134
  }
144
- _emitSnapshot() {
145
- const browsers = [];
146
- let pageCount = 0;
147
- for (const browser of this._playwright.allBrowsers()) {
148
- const b = {
149
- contexts: []
150
- };
151
- browsers.push(b);
152
- for (const context of browser.contexts()) {
153
- const c = {
154
- pages: []
155
- };
156
- b.contexts.push(c);
157
- for (const page of context.pages()) c.pages.push(page.mainFrame().url());
158
- pageCount += context.pages().length;
159
- }
160
- }
135
+ _emitSnapshot(initial) {
136
+ const pageCount = this._playwright.allPages().length;
137
+ if (initial && !pageCount) return;
161
138
  this.emit(DebugController.Events.StateChanged, {
162
139
  pageCount
163
140
  });
@@ -197,11 +174,12 @@ class InspectingRecorderApp extends _recorderApp.EmptyRecorderApp {
197
174
  this._debugController = void 0;
198
175
  this._debugController = debugController;
199
176
  }
200
- async setSelector(selector) {
201
- const locator = (0, _utils.asLocator)(this._debugController._sdkLanguage, selector);
177
+ async elementPicked(elementInfo) {
178
+ const locator = (0, _utils.asLocator)(this._debugController._sdkLanguage, elementInfo.selector);
202
179
  this._debugController.emit(DebugController.Events.InspectRequested, {
203
- selector,
204
- locator
180
+ selector: elementInfo.selector,
181
+ locator,
182
+ ariaSnapshot: elementInfo.ariaSnapshot
205
183
  });
206
184
  }
207
185
  async setSources(sources) {
@@ -121,7 +121,7 @@ function shouldPauseBeforeStep(metadata) {
121
121
  if (!metadata.apiName) return false;
122
122
  // Always stop on 'close'
123
123
  if (metadata.method === 'close') return true;
124
- if (metadata.method === 'waitForSelector' || metadata.method === 'waitForEventInfo') return false; // Never stop on those, primarily for the test harness.
124
+ if (metadata.method === 'waitForSelector' || metadata.method === 'waitForEventInfo' || metadata.method === 'querySelector' || metadata.method === 'querySelectorAll') return false; // Never stop on those, primarily for the test harness.
125
125
  const step = metadata.type + '.' + metadata.method;
126
126
  // Stop before everything that generates snapshot. But don't stop before those marked as pausesBeforeInputActions
127
127
  // since we stop in them on a separate instrumentation signal.
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.deviceDescriptors = void 0;
7
7
  var _deviceDescriptorsSource = _interopRequireDefault(require("./deviceDescriptorsSource.json"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
9
  /**
10
10
  * Copyright 2017 Google Inc. All rights reserved.
11
11
  * Modifications copyright (c) Microsoft Corporation.