codeceptjs 4.0.2-beta.8 → 4.0.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 (326) hide show
  1. package/README.md +39 -28
  2. package/bin/codecept.js +15 -2
  3. package/bin/codeceptq.js +49 -0
  4. package/bin/mcp-server.js +1189 -0
  5. package/docs/advanced.md +201 -0
  6. package/docs/agents.md +181 -0
  7. package/docs/ai.md +489 -0
  8. package/docs/aitrace.md +266 -0
  9. package/docs/api.md +332 -0
  10. package/docs/architecture.md +235 -0
  11. package/docs/assertions.md +415 -0
  12. package/docs/auth.md +318 -0
  13. package/docs/basics.md +424 -0
  14. package/docs/bdd.md +539 -0
  15. package/docs/best.md +240 -0
  16. package/docs/bootstrap.md +132 -0
  17. package/docs/commands.md +352 -0
  18. package/docs/community-helpers.md +63 -0
  19. package/docs/configuration.md +185 -0
  20. package/docs/continuous-integration.md +431 -0
  21. package/docs/custom-helpers.md +297 -0
  22. package/docs/data.md +448 -0
  23. package/docs/debugging.md +332 -0
  24. package/docs/detox.md +235 -0
  25. package/docs/docker.md +107 -0
  26. package/docs/effects.md +179 -0
  27. package/docs/element-based-testing.md +295 -0
  28. package/docs/element-selection.md +125 -0
  29. package/docs/els.md +328 -0
  30. package/docs/environment-variables.md +131 -0
  31. package/docs/examples.md +160 -0
  32. package/docs/heal.md +213 -0
  33. package/docs/helpers/ApiDataFactory.md +267 -0
  34. package/docs/helpers/Appium.md +1419 -0
  35. package/docs/helpers/Detox.md +665 -0
  36. package/docs/helpers/ExpectHelper.md +275 -0
  37. package/docs/helpers/FileSystem.md +152 -0
  38. package/docs/helpers/GraphQL.md +152 -0
  39. package/docs/helpers/GraphQLDataFactory.md +226 -0
  40. package/docs/helpers/JSONResponse.md +255 -0
  41. package/docs/helpers/MockRequest.md +377 -0
  42. package/docs/helpers/Playwright.md +2970 -0
  43. package/docs/helpers/Puppeteer-firefox.md +86 -0
  44. package/docs/helpers/Puppeteer.md +2583 -0
  45. package/docs/helpers/REST.md +289 -0
  46. package/docs/helpers/WebDriver.md +2639 -0
  47. package/docs/hooks.md +148 -0
  48. package/docs/index.md +111 -0
  49. package/docs/installation.md +121 -0
  50. package/docs/internal-test-server.md +89 -0
  51. package/docs/locators.md +355 -0
  52. package/docs/mcp.md +485 -0
  53. package/docs/migrate-from-cypress.md +98 -0
  54. package/docs/migrate-from-java.md +108 -0
  55. package/docs/migrate-from-protractor.md +101 -0
  56. package/docs/migrate-from-testcafe.md +99 -0
  57. package/docs/migration-4.md +745 -0
  58. package/docs/mobile.md +338 -0
  59. package/docs/pageobjects.md +399 -0
  60. package/docs/parallel.md +187 -0
  61. package/docs/playwright.md +714 -0
  62. package/docs/plugins/aiTrace.md +49 -0
  63. package/docs/plugins/analyze.md +66 -0
  64. package/docs/plugins/auth.md +241 -0
  65. package/docs/plugins/autoDelay.md +48 -0
  66. package/docs/plugins/browser.md +41 -0
  67. package/docs/plugins/coverage.md +39 -0
  68. package/docs/plugins/customLocator.md +119 -0
  69. package/docs/plugins/customReporter.md +16 -0
  70. package/docs/plugins/expose.md +75 -0
  71. package/docs/plugins/heal.md +44 -0
  72. package/docs/plugins/junitReporter.md +51 -0
  73. package/docs/plugins/pageInfo.md +34 -0
  74. package/docs/plugins/pause.md +43 -0
  75. package/docs/plugins/pauseOnFail.md +18 -0
  76. package/docs/plugins/retryFailedStep.md +75 -0
  77. package/docs/plugins/screencast.md +55 -0
  78. package/docs/plugins/screenshot.md +58 -0
  79. package/docs/plugins/screenshotOnFail.md +18 -0
  80. package/docs/plugins/stepTimeout.md +65 -0
  81. package/docs/plugins.md +87 -0
  82. package/docs/puppeteer.md +314 -0
  83. package/docs/quickstart.md +120 -0
  84. package/docs/reports.md +195 -0
  85. package/docs/retry.md +311 -0
  86. package/docs/secrets.md +150 -0
  87. package/docs/sessions.md +80 -0
  88. package/docs/shadow.md +68 -0
  89. package/docs/store.md +94 -0
  90. package/docs/test-structure.md +275 -0
  91. package/docs/timeouts.md +183 -0
  92. package/docs/translation.md +247 -0
  93. package/docs/tutorial.md +323 -0
  94. package/docs/typescript.md +159 -0
  95. package/docs/web-element.md +251 -0
  96. package/docs/webdriver.md +641 -0
  97. package/docs/within.md +55 -0
  98. package/lib/actor.js +1 -36
  99. package/lib/ai.js +3 -2
  100. package/lib/aria.js +260 -0
  101. package/lib/assertions.js +18 -0
  102. package/lib/codecept.js +34 -25
  103. package/lib/command/check.js +2 -1
  104. package/lib/command/definitions.js +6 -7
  105. package/lib/command/dryRun.js +24 -5
  106. package/lib/command/generate.js +3 -1
  107. package/lib/command/gherkin/snippets.js +5 -4
  108. package/lib/command/init.js +249 -270
  109. package/lib/command/list.js +150 -10
  110. package/lib/command/query.js +218 -0
  111. package/lib/command/run-multiple.js +3 -1
  112. package/lib/command/run-workers.js +2 -14
  113. package/lib/command/run.js +3 -17
  114. package/lib/command/utils.js +14 -0
  115. package/lib/command/workers/runTests.js +91 -37
  116. package/lib/config.js +96 -18
  117. package/lib/container.js +115 -17
  118. package/lib/effects.js +17 -0
  119. package/lib/element/WebElement.js +246 -2
  120. package/lib/els.js +12 -6
  121. package/lib/globals.js +32 -19
  122. package/lib/heal.js +7 -4
  123. package/lib/helper/ApiDataFactory.js +2 -1
  124. package/lib/helper/Appium.js +8 -8
  125. package/lib/helper/FileSystem.js +3 -2
  126. package/lib/helper/GraphQLDataFactory.js +2 -1
  127. package/lib/helper/Playwright.js +358 -467
  128. package/lib/helper/Puppeteer.js +335 -192
  129. package/lib/helper/WebDriver.js +324 -111
  130. package/lib/helper/errors/ElementNotFound.js +5 -2
  131. package/lib/helper/errors/MultipleElementsFound.js +52 -0
  132. package/lib/helper/errors/NonFocusedType.js +8 -0
  133. package/lib/helper/extras/Download.js +45 -0
  134. package/lib/helper/extras/PlaywrightLocator.js +7 -107
  135. package/lib/helper/extras/elementSelection.js +58 -0
  136. package/lib/helper/extras/focusCheck.js +43 -0
  137. package/lib/helper/extras/richTextEditor.js +178 -0
  138. package/lib/helper/scripts/dropFile.js +11 -0
  139. package/lib/history.js +3 -2
  140. package/lib/html.js +103 -16
  141. package/lib/index.js +9 -1
  142. package/lib/listener/config.js +6 -4
  143. package/lib/listener/emptyRun.js +2 -1
  144. package/lib/listener/globalRetry.js +32 -6
  145. package/lib/listener/helpers.js +4 -1
  146. package/lib/listener/mocha.js +2 -1
  147. package/lib/listener/pageobjects.js +43 -0
  148. package/lib/listener/result.js +3 -2
  149. package/lib/locator.js +158 -16
  150. package/lib/mocha/cli.js +19 -1
  151. package/lib/mocha/factory.js +11 -1
  152. package/lib/mocha/inject.js +1 -1
  153. package/lib/mocha/scenarioConfig.js +2 -1
  154. package/lib/mocha/ui.js +5 -6
  155. package/lib/parser.js +2 -2
  156. package/lib/pause.js +38 -4
  157. package/lib/plugin/aiTrace.js +457 -0
  158. package/lib/plugin/analyze.js +9 -9
  159. package/lib/plugin/auth.js +5 -4
  160. package/lib/plugin/browser.js +77 -0
  161. package/lib/plugin/expose.js +159 -0
  162. package/lib/plugin/heal.js +47 -3
  163. package/lib/plugin/junitReporter.js +303 -0
  164. package/lib/plugin/pageInfo.js +54 -52
  165. package/lib/plugin/pause.js +131 -0
  166. package/lib/plugin/pauseOnFail.js +11 -33
  167. package/lib/plugin/retryFailedStep.js +43 -32
  168. package/lib/plugin/screencast.js +289 -0
  169. package/lib/plugin/screenshot.js +558 -0
  170. package/lib/plugin/screenshotOnFail.js +9 -170
  171. package/lib/plugin/stepTimeout.js +3 -2
  172. package/lib/recorder.js +1 -1
  173. package/lib/rerun.js +2 -1
  174. package/lib/result.js +2 -1
  175. package/lib/step/base.js +10 -9
  176. package/lib/step/comment.js +2 -2
  177. package/lib/step/config.js +15 -2
  178. package/lib/step/helper.js +4 -4
  179. package/lib/step/meta.js +3 -3
  180. package/lib/step/record.js +5 -5
  181. package/lib/store.js +72 -3
  182. package/lib/translation.js +2 -1
  183. package/lib/utils/loaderCheck.js +28 -0
  184. package/lib/utils/mask_data.js +2 -1
  185. package/lib/utils/pluginParser.js +151 -0
  186. package/lib/utils/trace.js +297 -0
  187. package/lib/utils/typescript.js +188 -23
  188. package/lib/utils.js +77 -3
  189. package/lib/workers.js +65 -40
  190. package/package.json +35 -30
  191. package/typings/index.d.ts +119 -8
  192. package/typings/promiseBasedTypes.d.ts +3158 -6065
  193. package/typings/types.d.ts +3453 -6494
  194. package/docs/webapi/amOnPage.mustache +0 -11
  195. package/docs/webapi/appendField.mustache +0 -11
  196. package/docs/webapi/attachFile.mustache +0 -12
  197. package/docs/webapi/blur.mustache +0 -18
  198. package/docs/webapi/checkOption.mustache +0 -13
  199. package/docs/webapi/clearCookie.mustache +0 -9
  200. package/docs/webapi/clearField.mustache +0 -9
  201. package/docs/webapi/click.mustache +0 -29
  202. package/docs/webapi/clickLink.mustache +0 -8
  203. package/docs/webapi/closeCurrentTab.mustache +0 -7
  204. package/docs/webapi/closeOtherTabs.mustache +0 -8
  205. package/docs/webapi/dontSee.mustache +0 -11
  206. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  207. package/docs/webapi/dontSeeCookie.mustache +0 -8
  208. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  209. package/docs/webapi/dontSeeElement.mustache +0 -8
  210. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  211. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  212. package/docs/webapi/dontSeeInField.mustache +0 -11
  213. package/docs/webapi/dontSeeInSource.mustache +0 -8
  214. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  215. package/docs/webapi/dontSeeTraffic.mustache +0 -13
  216. package/docs/webapi/doubleClick.mustache +0 -13
  217. package/docs/webapi/downloadFile.mustache +0 -12
  218. package/docs/webapi/dragAndDrop.mustache +0 -9
  219. package/docs/webapi/dragSlider.mustache +0 -11
  220. package/docs/webapi/executeAsyncScript.mustache +0 -24
  221. package/docs/webapi/executeScript.mustache +0 -26
  222. package/docs/webapi/fillField.mustache +0 -16
  223. package/docs/webapi/flushNetworkTraffics.mustache +0 -5
  224. package/docs/webapi/focus.mustache +0 -13
  225. package/docs/webapi/forceClick.mustache +0 -28
  226. package/docs/webapi/forceRightClick.mustache +0 -18
  227. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  228. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  229. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  230. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  231. package/docs/webapi/grabCookie.mustache +0 -11
  232. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  233. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  234. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  235. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  236. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  237. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  238. package/docs/webapi/grabGeoLocation.mustache +0 -8
  239. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  240. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  241. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  242. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  243. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  244. package/docs/webapi/grabPopupText.mustache +0 -5
  245. package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
  246. package/docs/webapi/grabSource.mustache +0 -8
  247. package/docs/webapi/grabTextFrom.mustache +0 -10
  248. package/docs/webapi/grabTextFromAll.mustache +0 -9
  249. package/docs/webapi/grabTitle.mustache +0 -8
  250. package/docs/webapi/grabValueFrom.mustache +0 -9
  251. package/docs/webapi/grabValueFromAll.mustache +0 -8
  252. package/docs/webapi/grabWebElement.mustache +0 -9
  253. package/docs/webapi/grabWebElements.mustache +0 -9
  254. package/docs/webapi/moveCursorTo.mustache +0 -12
  255. package/docs/webapi/openNewTab.mustache +0 -7
  256. package/docs/webapi/pressKey.mustache +0 -12
  257. package/docs/webapi/pressKeyDown.mustache +0 -12
  258. package/docs/webapi/pressKeyUp.mustache +0 -12
  259. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  260. package/docs/webapi/refreshPage.mustache +0 -6
  261. package/docs/webapi/resizeWindow.mustache +0 -6
  262. package/docs/webapi/rightClick.mustache +0 -14
  263. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  264. package/docs/webapi/saveScreenshot.mustache +0 -12
  265. package/docs/webapi/say.mustache +0 -10
  266. package/docs/webapi/scrollIntoView.mustache +0 -11
  267. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  268. package/docs/webapi/scrollPageToTop.mustache +0 -6
  269. package/docs/webapi/scrollTo.mustache +0 -12
  270. package/docs/webapi/see.mustache +0 -11
  271. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  272. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  273. package/docs/webapi/seeCookie.mustache +0 -8
  274. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  275. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  276. package/docs/webapi/seeElement.mustache +0 -8
  277. package/docs/webapi/seeElementInDOM.mustache +0 -8
  278. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  279. package/docs/webapi/seeInField.mustache +0 -12
  280. package/docs/webapi/seeInPopup.mustache +0 -8
  281. package/docs/webapi/seeInSource.mustache +0 -7
  282. package/docs/webapi/seeInTitle.mustache +0 -8
  283. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  284. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  285. package/docs/webapi/seeTextEquals.mustache +0 -9
  286. package/docs/webapi/seeTitleEquals.mustache +0 -8
  287. package/docs/webapi/seeTraffic.mustache +0 -36
  288. package/docs/webapi/selectOption.mustache +0 -21
  289. package/docs/webapi/setCookie.mustache +0 -16
  290. package/docs/webapi/setGeoLocation.mustache +0 -12
  291. package/docs/webapi/startRecordingTraffic.mustache +0 -8
  292. package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
  293. package/docs/webapi/stopRecordingTraffic.mustache +0 -5
  294. package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
  295. package/docs/webapi/switchTo.mustache +0 -9
  296. package/docs/webapi/switchToNextTab.mustache +0 -10
  297. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  298. package/docs/webapi/type.mustache +0 -21
  299. package/docs/webapi/uncheckOption.mustache +0 -13
  300. package/docs/webapi/wait.mustache +0 -8
  301. package/docs/webapi/waitForClickable.mustache +0 -11
  302. package/docs/webapi/waitForCookie.mustache +0 -9
  303. package/docs/webapi/waitForDetached.mustache +0 -10
  304. package/docs/webapi/waitForDisabled.mustache +0 -6
  305. package/docs/webapi/waitForElement.mustache +0 -11
  306. package/docs/webapi/waitForEnabled.mustache +0 -6
  307. package/docs/webapi/waitForFunction.mustache +0 -17
  308. package/docs/webapi/waitForInvisible.mustache +0 -10
  309. package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
  310. package/docs/webapi/waitForText.mustache +0 -13
  311. package/docs/webapi/waitForValue.mustache +0 -10
  312. package/docs/webapi/waitForVisible.mustache +0 -10
  313. package/docs/webapi/waitInUrl.mustache +0 -9
  314. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  315. package/docs/webapi/waitToHide.mustache +0 -10
  316. package/docs/webapi/waitUrlEquals.mustache +0 -10
  317. package/lib/helper/AI.js +0 -214
  318. package/lib/helper/Mochawesome.js +0 -96
  319. package/lib/helper/extras/PlaywrightReactVueLocator.js +0 -52
  320. package/lib/helper/extras/React.js +0 -65
  321. package/lib/listener/enhancedGlobalRetry.js +0 -110
  322. package/lib/plugin/enhancedRetryFailedStep.js +0 -99
  323. package/lib/plugin/htmlReporter.js +0 -3648
  324. package/lib/plugin/stepByStepReport.js +0 -427
  325. package/lib/plugin/subtitles.js +0 -89
  326. package/lib/retryCoordinator.js +0 -207
@@ -0,0 +1,314 @@
1
+ ---
2
+ permalink: /puppeteer
3
+ title: Testing with Puppeteer
4
+ ---
5
+
6
+ # Testing with Puppeteer
7
+
8
+ Among all Selenium alternatives the most interesting emerging ones are tools developed around Google Chrome [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). And the most prominent one is [Puppeteer](https://github.com/puppeteer/puppeteer). It operates over Google Chrome directly without requiring additional tools like ChromeDriver. So tests setup with Puppeteer can be started with npm install only. If you want get faster and simpler to setup tests, Puppeteer would be your choice.
9
+
10
+ CodeceptJS uses Puppeteer to improve end to end testing experience. No need to learn the syntax of a new tool, all drivers in CodeceptJS share the same API.
11
+
12
+ Take a look at a sample test:
13
+
14
+ ```js
15
+ I.amOnPage('https://github.com')
16
+ I.click('Sign in', '//html/body/div[1]/header')
17
+ I.see('Sign in to GitHub', 'h1')
18
+ I.fillField('Username or email address', 'something@totest.com')
19
+ I.fillField('Password', '123456')
20
+ I.click('Sign in')
21
+ I.see('Incorrect username or password.', '.flash-error')
22
+ ```
23
+
24
+ It's readable and simple and works using Puppeteer API!
25
+
26
+ ## Setup
27
+
28
+ To start you need CodeceptJS with Puppeteer packages installed
29
+
30
+ ```bash
31
+ npm install codeceptjs puppeteer --save
32
+ ```
33
+
34
+ Or see [alternative installation options](https://codecept.io/installation/)
35
+
36
+ > If you already have CodeceptJS project, just install `puppeteer` package and enable a helper it in config.
37
+
38
+ And a basic project initialized
39
+
40
+ ```sh
41
+ npx codeceptjs init
42
+ ```
43
+
44
+ You will be asked for a Helper to use, you should select Puppeteer and provide url of a website you are testing.
45
+
46
+ > Puppeteer can also work with Firefox. [Learn how to set it up](/helpers/Puppeteer-firefox)
47
+
48
+ ## Configuring
49
+
50
+ Make sure `Puppeteer` helper is enabled in `codecept.conf.js` config:
51
+
52
+ ```js
53
+ { // ..
54
+ helpers: {
55
+ Puppeteer: {
56
+ url: "http://localhost",
57
+ show: true
58
+ }
59
+ }
60
+ // ..
61
+ }
62
+ ```
63
+
64
+ > Turn off the `show` option if you want to run test in headless mode.
65
+
66
+ Puppeteer uses different strategies to detect if a page is loaded. In configuration use `waitForNavigation` option for that:
67
+
68
+ By default it is set to `domcontentloaded` which waits for `DOMContentLoaded` event being fired. However, for Single Page Applications it's more useful to set this value to `networkidle0` which waits for all network connections to be finished.
69
+
70
+ ```js
71
+ helpers: {
72
+ Puppeteer: {
73
+ url: "http://localhost",
74
+ show: true,
75
+ waitForNavigation: "networkidle0"
76
+ }
77
+ }
78
+ ```
79
+
80
+ When a test runs faster than application it is recommended to increase `waitForAction` config value.
81
+ It will wait for a small amount of time (100ms) by default after each user action is taken.
82
+
83
+ > ▶ More options are listed in [helper reference](https://codecept.io/helpers/Puppeteer/).
84
+
85
+ ## Writing Tests
86
+
87
+ CodeceptJS test should be created with `gt` command:
88
+
89
+ ```sh
90
+ npx codeceptjs gt
91
+ ```
92
+
93
+ As an example we will use `ToDoMvc` app for testing.
94
+
95
+ ### Actions
96
+
97
+ Tests consist with a scenario of user's action taken on a page. The most widely used ones are:
98
+
99
+ - `amOnPage` - to open a webpage (accepts relative or absolute url)
100
+ - `click` - to locate a button or link and click on it
101
+ - `fillField` - to enter a text inside a field
102
+ - `selectOption`, `checkOption` - to interact with a form
103
+ - `wait*` to wait for some parts of page to be fully rendered (important for testing SPA)
104
+ - `grab*` to get values from page sources
105
+ - `see`, `dontSee` - to check for a text on a page
106
+ - `seeElement`, `dontSeeElement` - to check for elements on a page
107
+
108
+ > ℹ All actions are listed in [Puppeteer helper reference](https://codecept.io/helpers/Puppeteer/).\*
109
+
110
+ All actions which interact with elements **support CSS and XPath locators**. Actions like `click` or `fillField` by locate elements by their name or value on a page:
111
+
112
+ ```js
113
+ // search for link or button
114
+ I.click('Login')
115
+ // locate field by its label
116
+ I.fillField('Name', 'Miles')
117
+ // we can use input name
118
+ I.fillField('user[email]', 'miles@davis.com')
119
+ ```
120
+
121
+ You can also specify the exact locator type with strict locators:
122
+
123
+ ```js
124
+ I.click({ css: 'button.red' })
125
+ I.fillField({ name: 'user[email]' }, 'miles@davis.com')
126
+ I.seeElement({ xpath: '//body/header' })
127
+ ```
128
+
129
+ ### Interactive Pause
130
+
131
+ It's easy to start writing a test if you use [interactive pause](/basics#debug). Just open a web page and pause execution.
132
+
133
+ ```js
134
+ Feature('Sample Test')
135
+
136
+ Scenario('open my website', ({ I }) => {
137
+ I.amOnPage('http://todomvc.com/examples/react/')
138
+ pause()
139
+ })
140
+ ```
141
+
142
+ This is just enough to run a test, open a browser, and think what to do next to write a test case.
143
+
144
+ When you execute such test with `codeceptjs run` command you may see the browser is started
145
+
146
+ ```
147
+ npx codeceptjs run --steps
148
+ ```
149
+
150
+ After a page is opened a full control of a browser is given to a terminal. Type in different commands such as `click`, `see`, `fillField` to write the test. A successful commands will be saved to `./output/cli-history` file and can be copied into a test.
151
+
152
+ A complete ToDo-MVC test may look like:
153
+
154
+ ```js
155
+ Feature('ToDo')
156
+
157
+ Scenario('create todo item', ({ I }) => {
158
+ I.amOnPage('http://todomvc.com/examples/react/')
159
+ I.dontSeeElement('.todo-count')
160
+ I.fillField('What needs to be done?', 'Write a guide')
161
+ I.pressKey('Enter')
162
+ I.see('Write a guide', '.todo-list')
163
+ I.see('1 item left', '.todo-count')
164
+ })
165
+ ```
166
+
167
+ ### Grabbers
168
+
169
+ If you need to get element's value inside a test you can use `grab*` methods. They should be used with `await` operator inside `async` function:
170
+
171
+ ```js
172
+ import assert from 'assert'
173
+ Scenario('get value of current tasks', async ({ I }) => {
174
+ I.fillField('.todo', 'my first item')
175
+ I.pressKey('Enter')
176
+ I.fillField('.todo', 'my second item')
177
+ I.pressKey('Enter')
178
+ let numTodos = await I.grabTextFrom('.todo-count strong')
179
+ assert.equal(2, numTodos)
180
+ })
181
+ ```
182
+
183
+ ### Within
184
+
185
+ In case some actions should be taken inside one element (a container or modal window or iframe) you can use `within` block to narrow the scope.
186
+ Please take a note that you can't use within inside another within in Puppeteer helper:
187
+
188
+ ```js
189
+ await within('.todoapp', () => {
190
+ I.fillField('.todo', 'my new item')
191
+ I.pressKey('Enter')
192
+ I.see('1 item left', '.todo-count')
193
+ I.click('.todo-list input.toggle')
194
+ })
195
+ I.see('0 items left', '.todo-count')
196
+ ```
197
+
198
+ ### Each Element <Badge text="Since 3.3" type="warning"/>
199
+
200
+ Usually, CodeceptJS performs an action on the first matched element.
201
+ In case you want to do an action on each element found, use the special function `eachElement` which comes from [eachElement](https://codecept.io/plugins/#eachelement) plugin.
202
+
203
+ `eachElement` function matches all elements by locator and performs a callback on each of those element. A callback function receives [ElementHandle instance](https://pptr.dev/#?product=Puppeteer&show=api-class-elementhandle) from Puppeteer API. `eachElement` may perform arbitrary actions on a page, so the first argument should by a description of the actions performed. This description will be used for logging purposes.
204
+
205
+ Usage example
206
+
207
+ ```js
208
+ await eachElement(
209
+ 'click all checkboxes',
210
+ 'input.custom-checkbox',
211
+ async (el, index) => {
212
+ await el.click();
213
+ });
214
+ );
215
+ ```
216
+
217
+ > ℹ Learn more about [eachElement plugin](/plugins/#eachelement)
218
+
219
+ ## Mocking Network Requests <Badge text="Since 3.5.16" type="warning"/>
220
+
221
+ Network requests & responses can be mocked and modified. Use `mockRoute` which strictly follows [Puppeteer's `setRequestInterception` API](https://pptr.dev/next/api/puppeteer.page.setrequestinterception).
222
+
223
+ ```js
224
+ I.mockRoute('https://reqres.in/api/comments/1', request => {
225
+ request.respond({
226
+ status: 200,
227
+ headers: { 'Access-Control-Allow-Origin': '*' },
228
+ contentType: 'application/json',
229
+ body: '{"name": "this was mocked" }',
230
+ });
231
+ })
232
+
233
+ I.mockRoute('**/*.{png,jpg,jpeg}', route => route.abort());
234
+
235
+ // To disable mocking for a route call `stopMockingRoute`
236
+ // for previously mocked URL
237
+ I.stopMockingRoute('**/*.{png,jpg,jpeg}'
238
+ ```
239
+
240
+ To master request intercepting [use `HTTPRequest` object](https://pptr.dev/next/api/puppeteer.httprequest) object passed into mock request handler.
241
+
242
+ ## Accessing Puppeteer API
243
+
244
+ To get Puppeteer API inside a test use [`I.usePupepteerTo`](/helpers/Puppeteer/#usepuppeteerto) method with a callback.
245
+ To keep test readable provide a description of a callback inside the first parameter.
246
+
247
+ ```js
248
+ I.usePuppeteerTo('emulate offline mode', async ({ page, browser }) => {
249
+ await page.setOfflineMode(true)
250
+ })
251
+ ```
252
+
253
+ > Puppeteer commands are asynchronous so a callback function must be async.
254
+
255
+ A Puppeteer helper is passed as argument for callback, so you can combine Puppeteer API with CodeceptJS API:
256
+
257
+ ```js
258
+ I.usePuppeteerTo('emulate offline mode', async Puppeteer => {
259
+ // access internal objects browser, page, context of helper
260
+ await Puppeteer.page.setOfflineMode(true)
261
+ // call a method of helper, await is required here
262
+ await Puppeteer.click('Reload')
263
+ })
264
+ ```
265
+
266
+ ## Capturing Code Coverage
267
+
268
+ Code coverage can be captured, by enabling the `coverage` plugin in `codecept.config.js`.
269
+
270
+ ```js
271
+ {
272
+ plugins: {
273
+ coverage: {
274
+ enabled: true
275
+ }
276
+ }
277
+ }
278
+ ```
279
+
280
+ Once all the tests are completed, `codecept` will create and store coverage in `output/coverage` folder, as shown below.
281
+
282
+ ![](<(https://github.com/codeceptjs/CodeceptJS/assets/7845001/3b8b81a3-7c85-470c-992d-ecdc7d5b4a1e)>)
283
+
284
+ Open `index.html` in your browser to view the full interactive coverage report.
285
+
286
+ ![](https://github.com/codeceptjs/CodeceptJS/assets/7845001/f45607ed-dbe8-4ed4-9b21-01ce25288d22)
287
+
288
+ ![](https://github.com/codeceptjs/CodeceptJS/assets/7845001/c821ce45-6590-4ace-b7ae-2cafb3a4e532)
289
+
290
+ ## Extending Helper
291
+
292
+ To create custom `I.*` commands using Puppeteer API you need to create a custom helper.
293
+
294
+ Start with creating an `MyPuppeteer` helper using `generate:helper` or `gh` command:
295
+
296
+ ```sh
297
+ npx codeceptjs gh
298
+ ```
299
+
300
+ Then inside a Helper you can access `Puppeteer` helper of CodeceptJS.
301
+ Let's say you want to create `I.renderPageToPdf` action. In this case you need to call `pdf` method of `page` object
302
+
303
+ ```js
304
+ // inside a MyPuppeteer helper
305
+ async renderPageToPdf() {
306
+ const page = this.helpers['Puppeteer'].page;
307
+ await page.emulateMedia('screen');
308
+ return page.pdf({path: 'page.pdf'});
309
+ }
310
+ ```
311
+
312
+ The same way you can also access `browser` object to implement more actions or handle events.
313
+
314
+ > [▶ Learn more about Helpers](https://codecept.io/helpers/)
@@ -0,0 +1,120 @@
1
+ ---
2
+ permalink: quickstart
3
+ title: Quickstart
4
+ layout: Section
5
+ sidebar: true
6
+ ---
7
+
8
+ # Quickstart
9
+
10
+ Install CodeceptJS into your project:
11
+
12
+ ```
13
+ npm install codeceptjs playwright --save-dev
14
+ ```
15
+
16
+ Then install the browser binaries:
17
+
18
+ ```
19
+ npx playwright install --with-deps
20
+ ```
21
+
22
+ The `--with-deps` flag also installs required system dependencies for the browsers.
23
+
24
+ > Prefer WebDriver or Appium? See [installation options](/installation/) for all supported helpers.
25
+
26
+ ---
27
+
28
+ ### Init
29
+
30
+ Initialize CodeceptJS to set up the config file and test directory:
31
+
32
+ ```
33
+ npx codeceptjs init
34
+ ```
35
+
36
+ This command walks you through a short setup wizard and creates `codecept.conf.js`, a sample test file, and any required browser binaries.
37
+
38
+ Answer the questions, accepting defaults to get started quickly:
39
+
40
+ | Question | Default Answer | Alternative
41
+ |---|---|---|
42
+ | Do you plan to write tests in TypeScript? | **n** (No) | or [learn how to use TypeScript](/typescript)
43
+ | Where are your tests located? | `**./*_test.js` | or any glob pattern like `**.spec.js`
44
+ | What helpers do you want to use? | **Playwright** | See options for [web testing](https://codecept.io/basics/#architecture), [mobile testing](https://codecept.io/mobile/), [API testing](https://codecept.io/api/)
45
+ | Where should logs, screenshots, and reports be stored? | `./output` | path to store artifacts and temporary files
46
+
47
+ For Playwright, you'll also be asked about the site and browser:
48
+
49
+ | Question | Default Answer | Alternative
50
+ |---|---|---|
51
+ | Base url of site to be tested | http://localhost | URL of the site you plan to test
52
+ | Show browser window | **y** Yes | or run in **headless mode**
53
+ | Browser | **chromium** | or `firefox`, `webkit` (open-source Safari), or `electron`
54
+
55
+ Sample output:
56
+
57
+ ```
58
+ ? Do you plan to write tests in TypeScript? No
59
+ ? Where are your tests located? **./*_test.js
60
+ ? What helpers do you want to use? Playwright
61
+ ? Where should logs, screenshots, and reports be stored? ./output
62
+ ? [Playwright] Base url of site to be tested http://localhost
63
+ ? [Playwright] Show browser window Yes
64
+ ? [Playwright] Browser in which testing will be performed chromium
65
+ ```
66
+
67
+ When asked, create your first feature and test file.
68
+
69
+ ---
70
+
71
+ ### Write Your First Test
72
+
73
+ Open the generated test file. It will look like this:
74
+
75
+ ```js
76
+ Feature('My First Test');
77
+
78
+ Scenario('test something', ({ I }) => {
79
+
80
+ });
81
+ ```
82
+
83
+ Add a simple scenario:
84
+
85
+ ```js
86
+ Feature('My First Test');
87
+
88
+ Scenario('test something', ({ I }) => {
89
+ I.amOnPage('https://github.com');
90
+ I.see('GitHub');
91
+ });
92
+ ```
93
+
94
+ ---
95
+
96
+ ### Run Tests
97
+
98
+ ```
99
+ npx codeceptjs run
100
+ ```
101
+
102
+ Expected output:
103
+
104
+ ```bash
105
+ My First Test --
106
+ test something
107
+ I am on page "https://github.com"
108
+ I see "GitHub"
109
+ ✓ OK
110
+ ```
111
+
112
+ Run in headless mode:
113
+
114
+ ```
115
+ npx codeceptjs run --p browser:hide
116
+ ```
117
+
118
+ See all available commands in the [CLI reference](https://codecept.io/commands/).
119
+
120
+ > [▶ Next: CodeceptJS Basics](/basics/)
@@ -0,0 +1,195 @@
1
+ ---
2
+ permalink: /reports
3
+ title: Reporters
4
+ ---
5
+
6
+ # Reporters
7
+
8
+ CodeceptJS prints test results to the console by default (see [CLI output](#cli-output)). For an HTML report, a pull-request comment, JUnit XML, or a hosted dashboard, use **[Testomat.io Reporter](https://github.com/testomatio/reporter)**.
9
+
10
+ Testomat.io Reporter is open source. It can send create reports of various types:
11
+
12
+ - **Local files** — HTML, CSV, and Markdown reports written to disk.
13
+ - **CI/CD pipeline reports** — reports added as comments to GitHub, GitLab, or Bitbucket pull requests.
14
+ - **Cloud Services** — a hosted dashboard on [app.testomat.io](https://testomat.io) to keep track of results history and get analytics.
15
+
16
+ You choose the destinations. The reporter collects steps, screenshots, videos, traces, and logs once and sends them everywhere you enabled.
17
+
18
+ ### Install
19
+
20
+ ```sh
21
+ npm install @testomatio/reporter --save-dev
22
+ ```
23
+
24
+ Enable the reporter plugin and turn on the local reports you want:
25
+
26
+ ```js
27
+ // codecept.conf.js
28
+ plugins: {
29
+ testomatio: {
30
+ enabled: true,
31
+ require: '@testomatio/reporter/codecept',
32
+ html: true,
33
+ // markdown: true,
34
+ // csv: true,
35
+ // reportDir: 'output/report',
36
+ },
37
+ }
38
+ ```
39
+
40
+ > `html`, `markdown`, and `csv` are config switches for local reports. Local reports are stored in filesystem in `output/report` dir by default.
41
+
42
+ ### Local reports and remote destinations
43
+
44
+ Local reports are turned on with config switches and saved to disk:
45
+
46
+ | Config switch | File in `reportDir` |
47
+ | --- | --- |
48
+ | `html: true` | `testomatio-report.html` |
49
+ | `markdown: true` | `testomatio-report.md` |
50
+ | `csv: true` | `report.csv` |
51
+
52
+ Remote destinations need an access token. A token is a secret, so pass it through an environment variable or CI secret instead of committing it to the config file:
53
+
54
+ | Destination | Token variable |
55
+ | --- | --- |
56
+ | Run result on [app.testomat.io](https://testomat.io) | `TESTOMATIO` |
57
+ | Comment on a GitHub Pull Request | `GH_PAT` (`${{ github.token }}` in Actions) |
58
+ | Comment on a GitLab Merge Request | `GITLAB_PAT` (token with `api` scope) |
59
+ | Comment on a Bitbucket Pull Request | `BITBUCKET_ACCESS_TOKEN` (repo access token) |
60
+
61
+ One run feeds every destination you enabled. On CI, keep the report switches in the config and pass only the tokens as environment variables:
62
+
63
+ ```yaml
64
+ - run: npx codeceptjs run
65
+ env:
66
+ GH_PAT: ${{ github.token }} # → Print report as PR comment
67
+ # TESTOMATIO: ${{ secrets.TESTOMATIO }} # → Send report to testomat.io
68
+ - uses: actions/upload-artifact@v4
69
+ if: always()
70
+ with:
71
+ name: codeceptjs-output
72
+ path: output/
73
+ ```
74
+
75
+ The GitHub destination also needs the job to grant `permissions: pull-requests: write`.
76
+
77
+ For the full list of options and environment variables, see the [reporter configuration reference](https://github.com/testomatio/reporter/blob/master/docs/configuration.md).
78
+
79
+ ### HTML Report
80
+
81
+ A local, self-contained HTML file saved to `output/report/testomatio-report.html`. It holds the run summary and, per test, its steps, screenshots, logs, and error. It needs no API key and no service, so it works anywhere — open it locally or attach it to a CI build.
82
+
83
+ ![HTML report](./images/testomatio-html-report.png)
84
+
85
+ Enable it with `html: true` in `plugins.testomatio` and run `npx codeceptjs run`. To change the file name or folder, see the [HTML pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/html.md).
86
+
87
+ ### CSV Report
88
+
89
+ A local CSV file saved to `output/report/report.csv`, with one row per test — suite, title, and status. Use it in spreadsheets or data pipelines.
90
+
91
+ Enable it with `csv: true` in `plugins.testomatio`. See the [CSV pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/csv.md).
92
+
93
+ ### Testomat.io Cloud Report
94
+
95
+ A remote destination: the run is sent to [app.testomat.io](https://testomat.io), a hosted dashboard with run history, flaky-test detection, parallel-run merging, re-running failed tests, and notifications. Free for small teams.
96
+
97
+ ![Testomat.io report](https://user-images.githubusercontent.com/220264/151728836-b52d2b2b-56e1-4640-8d3a-b39de817b1fd.png)
98
+
99
+ Set the `TESTOMATIO` environment variable to your project API key and run the tests. Run titles, run groups, shared runs, and publishing options: [Testomat.io pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/testomatio.md).
100
+
101
+ To view artifacts on the cloud, upload them to S3 storage. Images come from the [`screenshot`](/plugins#screenshot) plugin, videos from the [`screencast`](/plugins#screencast) plugin (or the Playwright helper's `video` and `trace`). Any S3 provider works: AWS S3, Cloudflare R2, Google Cloud Storage (interoperability mode), DigitalOcean Spaces, MinIO.
102
+
103
+ ### GitHub Report
104
+
105
+ A remote destination: a comment on the Pull Request with run status, pass/fail/skip counts, stack traces of the failures, screenshots, and the slowest tests. Re-running the workflow replaces the previous comment.
106
+
107
+ ![GitHub report](https://raw.githubusercontent.com/testomatio/reporter/master/docs/pipes/images/github.png)
108
+
109
+ Set `GH_PAT` to a GitHub token (`${{ github.token }}` works in Actions) and grant the job `permissions: pull-requests: write`. More options: [GitHub pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/github.md).
110
+
111
+ ### GitLab Report
112
+
113
+ A remote destination: a comment on the Merge Request with the same summary. Run it in merge-request pipelines (`$CI_PIPELINE_SOURCE == "merge_request_event"`).
114
+
115
+ ![GitLab report](https://raw.githubusercontent.com/testomatio/reporter/master/docs/pipes/images/gitlab.png)
116
+
117
+ Set `GITLAB_PAT` to a Personal or Project Access Token with `api` scope. More options: [GitLab pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/gitlab.md).
118
+
119
+ ### Bitbucket Report
120
+
121
+ A remote destination: a comment on the Pull Request with the same summary. Comments are created only in `pull-requests` pipelines.
122
+
123
+ ![Bitbucket report](https://raw.githubusercontent.com/testomatio/reporter/master/docs/pipes/images/bitbucket.png)
124
+
125
+ Set `BITBUCKET_ACCESS_TOKEN` to a repository access token with `Pull requests: Write` and `Repository: Read`. More options: [Bitbucket pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/bitbucket.md).
126
+
127
+ ### Markdown Report
128
+
129
+ A local, self-contained Markdown file saved to `output/report/testomatio-report.md`. It renders in PR comments, CI job summaries, and Slack, and is convenient for AI agents reading test results. It needs no API key.
130
+
131
+ ![Markdown report](./images/testomatio-markdown-report.png)
132
+
133
+ Enable it with `markdown: true` in `plugins.testomatio`. To change the file name, folder, or title, see the [Markdown pipe docs](https://github.com/testomatio/reporter/blob/master/docs/pipes/markdown.md).
134
+
135
+ On GitHub Actions, append it to the job summary: `cat output/report/testomatio-report.md >> "$GITHUB_STEP_SUMMARY"`.
136
+
137
+ ## JUnit XML
138
+
139
+ For CI servers that read JUnit XML (Jenkins, GitLab CI, CircleCI, the GitHub Actions test tab), enable the [`junitReporter`](/plugins#junitreporter) plugin. It writes `output/report.xml` with CodeceptJS steps included — unlike `mocha-junit-reporter`.
140
+
141
+ ```js
142
+ plugins: {
143
+ junitReporter: { enabled: true },
144
+ }
145
+ ```
146
+
147
+ Options (`outputName`, `output`, `testGroupName`, `attachMeta`, `attachSteps`, `stepsInFailure`): [plugin docs](/plugins#junitreporter).
148
+
149
+ ## ReportPortal
150
+
151
+ [ReportPortal](https://reportportal.io) is an open-source self-hosted dashboard for test reports. Publish with the [CodeceptJS Agent for ReportPortal](https://github.com/reportportal/agent-js-codecept/).
152
+
153
+ ## Custom reporter
154
+
155
+ The [`customReporter`](/plugins#customreporter) plugin hooks into test events:
156
+
157
+ ```js
158
+ plugins: {
159
+ customReporter: {
160
+ enabled: true,
161
+ onTestFailed: (test, err) => console.log('FAIL', test.title, err.message),
162
+ onResult: result => {
163
+ // result.stats, result.tests
164
+ },
165
+ },
166
+ }
167
+ ```
168
+
169
+ Hooks: `onHookFinished`, `onTestBefore`, `onTestPassed`, `onTestFailed`, `onTestSkipped`, `onTestFinished`, `onResult`.
170
+
171
+ For built-in Mocha reporters, use `--reporter`:
172
+
173
+ ```sh
174
+ npx codeceptjs run --reporter dot
175
+ ```
176
+
177
+ > The bundled `Mochawesome` helper was removed in 4.x. For an HTML report use the [Testomat.io Reporter](https://github.com/testomatio/reporter) HTML pipe (see above); for JUnit XML use the [`junitReporter`](#junit-xml) plugin. Wiring multiple Mocha reporters through `mocha-multi`/`cmr` is not recommended — prefer these instead.
178
+
179
+ Plugins exist for [TestRail](https://www.npmjs.com/package/codeceptjs-testrail) and [Tesults](https://www.npmjs.com/package/codeceptjs-tesults).
180
+
181
+ ## CLI output
182
+
183
+ By default CodeceptJS prints test names and failures. Add `--steps` to see each step, `--debug` for runner notices, or `--verbose` for full stack traces and events (use this when reporting bugs).
184
+
185
+ ```sh
186
+ npx codeceptjs run --steps
187
+ npx codeceptjs run --debug
188
+ npx codeceptjs run --verbose
189
+ ```
190
+
191
+ `dry-run` lists tests and steps without running them:
192
+
193
+ ```sh
194
+ npx codeceptjs dry-run --steps
195
+ ```