codeceptjs 3.6.0-beta.1.ai-healers → 3.6.1

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 (130) hide show
  1. package/README.md +2 -2
  2. package/bin/codecept.js +2 -1
  3. package/docs/webapi/dontSeeTraffic.mustache +13 -0
  4. package/docs/webapi/flushNetworkTraffics.mustache +5 -0
  5. package/docs/webapi/grabRecordedNetworkTraffics.mustache +10 -0
  6. package/docs/webapi/seeTraffic.mustache +36 -0
  7. package/docs/webapi/startRecordingTraffic.mustache +8 -0
  8. package/docs/webapi/startRecordingWebSocketMessages.mustache +8 -0
  9. package/docs/webapi/stopRecordingTraffic.mustache +5 -0
  10. package/docs/webapi/stopRecordingWebSocketMessages.mustache +7 -0
  11. package/docs/webapi/waitForCookie.mustache +9 -0
  12. package/lib/actor.js +6 -3
  13. package/lib/command/dryRun.js +44 -13
  14. package/lib/helper/Appium.js +36 -12
  15. package/lib/helper/Expect.js +11 -8
  16. package/lib/helper/JSONResponse.js +8 -8
  17. package/lib/helper/MockServer.js +221 -0
  18. package/lib/helper/Playwright.js +107 -371
  19. package/lib/helper/Puppeteer.js +404 -71
  20. package/lib/helper/REST.js +4 -1
  21. package/lib/helper/WebDriver.js +189 -13
  22. package/lib/helper/errors/ElementAssertion.js +38 -0
  23. package/lib/helper/extras/PlaywrightReactVueLocator.js +6 -1
  24. package/lib/helper/network/actions.js +123 -0
  25. package/lib/helper/network/utils.js +187 -0
  26. package/lib/locator.js +36 -5
  27. package/lib/pause.js +4 -9
  28. package/lib/plugin/coverage.js +112 -99
  29. package/lib/step.js +3 -1
  30. package/package.json +49 -38
  31. package/typings/index.d.ts +19 -2
  32. package/typings/promiseBasedTypes.d.ts +505 -41
  33. package/typings/types.d.ts +531 -43
  34. package/docs/advanced.md +0 -351
  35. package/docs/ai.md +0 -365
  36. package/docs/api.md +0 -323
  37. package/docs/basics.md +0 -979
  38. package/docs/bdd.md +0 -539
  39. package/docs/best.md +0 -237
  40. package/docs/books.md +0 -37
  41. package/docs/bootstrap.md +0 -135
  42. package/docs/build/AI.js +0 -124
  43. package/docs/build/ApiDataFactory.js +0 -410
  44. package/docs/build/Appium.js +0 -2027
  45. package/docs/build/Expect.js +0 -422
  46. package/docs/build/FileSystem.js +0 -228
  47. package/docs/build/GraphQL.js +0 -229
  48. package/docs/build/GraphQLDataFactory.js +0 -309
  49. package/docs/build/JSONResponse.js +0 -338
  50. package/docs/build/Mochawesome.js +0 -71
  51. package/docs/build/Nightmare.js +0 -2152
  52. package/docs/build/OpenAI.js +0 -126
  53. package/docs/build/Playwright.js +0 -5110
  54. package/docs/build/Protractor.js +0 -2706
  55. package/docs/build/Puppeteer.js +0 -3905
  56. package/docs/build/REST.js +0 -344
  57. package/docs/build/TestCafe.js +0 -2125
  58. package/docs/build/WebDriver.js +0 -4240
  59. package/docs/changelog.md +0 -2572
  60. package/docs/commands.md +0 -266
  61. package/docs/community-helpers.md +0 -58
  62. package/docs/configuration.md +0 -157
  63. package/docs/continuous-integration.md +0 -22
  64. package/docs/custom-helpers.md +0 -306
  65. package/docs/data.md +0 -379
  66. package/docs/detox.md +0 -235
  67. package/docs/docker.md +0 -136
  68. package/docs/email.md +0 -183
  69. package/docs/examples.md +0 -149
  70. package/docs/heal.md +0 -186
  71. package/docs/helpers/ApiDataFactory.md +0 -266
  72. package/docs/helpers/Appium.md +0 -1374
  73. package/docs/helpers/Detox.md +0 -586
  74. package/docs/helpers/Expect.md +0 -275
  75. package/docs/helpers/FileSystem.md +0 -152
  76. package/docs/helpers/GraphQL.md +0 -151
  77. package/docs/helpers/GraphQLDataFactory.md +0 -226
  78. package/docs/helpers/JSONResponse.md +0 -254
  79. package/docs/helpers/Mochawesome.md +0 -8
  80. package/docs/helpers/MockRequest.md +0 -377
  81. package/docs/helpers/Nightmare.md +0 -1305
  82. package/docs/helpers/OpenAI.md +0 -70
  83. package/docs/helpers/Playwright.md +0 -2759
  84. package/docs/helpers/Polly.md +0 -44
  85. package/docs/helpers/Protractor.md +0 -1769
  86. package/docs/helpers/Puppeteer-firefox.md +0 -86
  87. package/docs/helpers/Puppeteer.md +0 -2317
  88. package/docs/helpers/REST.md +0 -218
  89. package/docs/helpers/TestCafe.md +0 -1321
  90. package/docs/helpers/WebDriver.md +0 -2547
  91. package/docs/hooks.md +0 -340
  92. package/docs/index.md +0 -111
  93. package/docs/installation.md +0 -75
  94. package/docs/internal-api.md +0 -266
  95. package/docs/locators.md +0 -339
  96. package/docs/mobile-react-native-locators.md +0 -67
  97. package/docs/mobile.md +0 -338
  98. package/docs/pageobjects.md +0 -291
  99. package/docs/parallel.md +0 -400
  100. package/docs/playwright.md +0 -632
  101. package/docs/plugins.md +0 -1247
  102. package/docs/puppeteer.md +0 -316
  103. package/docs/quickstart.md +0 -162
  104. package/docs/react.md +0 -70
  105. package/docs/reports.md +0 -392
  106. package/docs/secrets.md +0 -36
  107. package/docs/shadow.md +0 -68
  108. package/docs/shared/keys.mustache +0 -31
  109. package/docs/shared/react.mustache +0 -1
  110. package/docs/testcafe.md +0 -174
  111. package/docs/translation.md +0 -247
  112. package/docs/tutorial.md +0 -271
  113. package/docs/typescript.md +0 -180
  114. package/docs/ui.md +0 -59
  115. package/docs/videos.md +0 -28
  116. package/docs/visual.md +0 -202
  117. package/docs/vue.md +0 -143
  118. package/docs/webdriver.md +0 -701
  119. package/docs/wiki/Books-&-Posts.md +0 -27
  120. package/docs/wiki/Community-Helpers-&-Plugins.md +0 -53
  121. package/docs/wiki/Converting-Playwright-to-Istanbul-Coverage.md +0 -61
  122. package/docs/wiki/Examples.md +0 -145
  123. package/docs/wiki/Google-Summer-of-Code-(GSoC)-2020.md +0 -68
  124. package/docs/wiki/Home.md +0 -16
  125. package/docs/wiki/Migration-to-Appium-v2---CodeceptJS.md +0 -83
  126. package/docs/wiki/Release-Process.md +0 -24
  127. package/docs/wiki/Roadmap.md +0 -23
  128. package/docs/wiki/Tests.md +0 -1393
  129. package/docs/wiki/Upgrading-to-CodeceptJS-3.md +0 -153
  130. package/docs/wiki/Videos.md +0 -19
package/docs/puppeteer.md DELETED
@@ -1,316 +0,0 @@
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/GoogleChrome/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
- const assert = require('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 Requests
220
-
221
- Web application sends various requests to local services (Rest API, GraphQL) or to 3rd party services (CDNS, Google Analytics, etc).
222
- When you run tests with Puppeteer you can control those requests by mocking them. For instance, you can speed up your tests by blocking trackers, Google Analytics, and other services you don't control.
223
-
224
- Also you can replace real request with a one explicitly defined. This is useful when you want to isolate application testing from a backend. For instance, if you don't want to save data to database, and you know the request which performs save, you can mock the request, so application will treat this as valid response, but no data will be actually saved.
225
-
226
- To mock requests enable additional helper [MockRequest](/helpers/MockRequest) (which is based on Polly.js).
227
-
228
- ```js
229
- helpers: {
230
- Puppeteer: {
231
- // regular Puppeteer config here
232
- },
233
- MockRequest: {}
234
- }
235
- ```
236
-
237
- And install additional packages:
238
-
239
- ```
240
- npm i @pollyjs/core @pollyjs/adapter-puppeteer --save-dev
241
- ```
242
-
243
- After an installation function `mockRequest` will be added to `I` object. You can use it to explicitly define which requests to block and which response they should return instead:
244
-
245
- ```js
246
- // block all Google Analytics calls
247
- I.mockRequest('/google-analytics/*path', 200);
248
- // return an empty successful response
249
- I.mockRequest('GET', '/api/users', 200);
250
- // block post requests to /api/users and return predefined object
251
- I.mockRequest('POST', '/api/users', { user: 'davert' });
252
- // return error request with body
253
- I.mockRequest('GET', '/api/users/1', 404, { error: 'User not found' });
254
- ```
255
-
256
- > See [`mockRequest` API](/helpers/MockRequest#mockrequest)
257
-
258
- To see `mockRequest` method in intellisense auto completion don't forget to run `codeceptjs def` command:
259
-
260
- ```
261
- npx codeceptjs def
262
- ```
263
-
264
- Mocking rules will be kept while a test is running. To stop mocking use `I.stopMocking()` command
265
-
266
-
267
- ## Accessing Puppeteer API
268
-
269
- To get Puppeteer API inside a test use [`I.usePupepteerTo`](/helpers/Puppeteer/#usepuppeteerto) method with a callback.
270
- To keep test readable provide a description of a callback inside the first parameter.
271
-
272
- ```js
273
- I.usePuppeteerTo('emulate offline mode', async ({ page, browser }) => {
274
- await page.setOfflineMode(true);
275
- });
276
- ```
277
-
278
- > Puppeteer commands are asynchronous so a callback function must be async.
279
-
280
- A Puppeteer helper is passed as argument for callback, so you can combine Puppeteer API with CodeceptJS API:
281
-
282
- ```js
283
- I.usePuppeteerTo('emulate offline mode', async (Puppeteer) => {
284
- // access internal objects browser, page, context of helper
285
- await Puppeteer.page.setOfflineMode(true);
286
- // call a method of helper, await is required here
287
- await Puppeteer.click('Reload');
288
- });
289
- ```
290
-
291
-
292
- ## Extending Helper
293
-
294
- To create custom `I.*` commands using Puppeteer API you need to create a custom helper.
295
-
296
- Start with creating an `MyPuppeteer` helper using `generate:helper` or `gh` command:
297
-
298
- ```sh
299
- npx codeceptjs gh
300
- ```
301
-
302
- Then inside a Helper you can access `Puppeteer` helper of CodeceptJS.
303
- Let's say you want to create `I.renderPageToPdf` action. In this case you need to call `pdf` method of `page` object
304
-
305
- ```js
306
- // inside a MyPuppeteer helper
307
- async renderPageToPdf() {
308
- const page = this.helpers['Puppeteer'].page;
309
- await page.emulateMedia('screen');
310
- return page.pdf({path: 'page.pdf'});
311
- }
312
- ```
313
-
314
- The same way you can also access `browser` object to implement more actions or handle events.
315
-
316
- > [▶ Learn more about Helpers](https://codecept.io/helpers/)
@@ -1,162 +0,0 @@
1
- ---
2
- permalink: quickstart
3
- title: Quickstart
4
- layout: Section
5
- sidebar: true
6
- ---
7
-
8
- ::: slot sidebar
9
-
10
- #### Use WebDriver for classical Selenium setup
11
-
12
- <small>
13
- This gives you access to rich Selenium ecosystem and cross-browser support for majority of browsers and devices.
14
- </small>
15
-
16
-
17
- <a href="/webdriver" class="button extended" >Start with WebDriver &raquo;</a>
18
-
19
- <small> WebDriver support is implemented via [webdriverio](https://webdriver.io) library </small>
20
-
21
- ---
22
-
23
- #### Use TestCafe for cross-browser testing without Selenium
24
-
25
- <small>
26
- TestCafe provides cross-browser support without Selenium. TestCafe tests are faster, require no extra tooling and faster than regular Selenium. However, can be less stable.
27
- </small>
28
-
29
- <a href="/testcafe" class="button green extended" >Start with TestCafe &raquo;</a>
30
-
31
- ---
32
-
33
- * [Mobile Testing with Appium »](/mobile)
34
-
35
- :::
36
-
37
- # Quickstart
38
-
39
-
40
- Use [CodeceptJS all-in-one installer](https://github.com/codeceptjs/create-codeceptjs) to get CodeceptJS, a demo project, and Playwright.
41
-
42
- ```
43
- npx create-codeceptjs .
44
- ```
45
-
46
- If you prefer not to use Playwright see other [installation options](/installation/).
47
-
48
- ![Installation](/img/codeceptinstall.gif)
49
-
50
- > To install codeceptjs into a different folder, like `tests` use `npx create-codeceptjs tests`
51
-
52
- After CodeceptJS is installed, try running **demo tests** using this commands:
53
-
54
- * `npm run codeceptjs:demo` - executes demo tests in window mode
55
- * `npm run codeceptjs:demo:headless` - executes demo tests in headless mode
56
- * `npm run codeceptjs:demo:ui` - open CodeceptJS UI to list and run demo tests.
57
-
58
- [CodeceptJS UI](/ui) application:
59
-
60
- ![](https://user-images.githubusercontent.com/220264/93860826-4d5fbc80-fcc8-11ea-99dc-af816f3db466.png)
61
-
62
- ---
63
-
64
- ### Init
65
-
66
- To start a new project initialize CodeceptJS to create main config file: `codecept.conf.js`.
67
-
68
- ```
69
- npx codeceptjs init
70
- ```
71
-
72
- Answer questions, agree on defaults:
73
-
74
-
75
- | Question | Default Answer | Alternative
76
- |---|---|---|
77
- | Do you plan to write tests in TypeScript? | **n** (No) | or [learn how to use TypeScript](/typescript)
78
- | Where are your tests located? | `**./*_test.js` | or any glob pattern like `**.spec.js`
79
- | What helpers do you want to use? | **Playwright** | Which helper to use for: [web testing](https://codecept.io/basics/#architecture), [mobile testing](https://codecept.io/mobile/), [API testing](https://codecept.io/api/)
80
- | Where should logs, screenshots, and reports to be stored? | `./output` | path to store artifacts and temporary files
81
- | Do you want to enable localization for tests? | **n** English (no localization) | or write [localized tests](https://codecept.io/translation/) in your language
82
-
83
-
84
- Sample output:
85
-
86
- ```js
87
- ? Do you plan to write tests in TypeScript? 'No'
88
- ? Where are your tests located? '**./*_test.js'
89
- ? What helpers do you want to use? 'Playwright'
90
- ? Where should logs, screenshots, and reports to be stored? '**./output**'
91
- ? Do you want to enable localization for tests? 'English (no localization)'
92
- ```
93
-
94
- For Playwright helper provide a website to be tested and browser to be used:
95
-
96
- | Question | Default Answer | Alternative
97
- |---|---|---|
98
- | Base url of site to be tested | http://localhost | Base URL of website you plan to test. Use http://github.com or [sample checkout page](https://getbootstrap.com/docs/5.2/examples/checkout/) if you just want to play around
99
- | Show browser window | **y** Yes | or run browser in **headless mode**
100
- | Browser in which testing will be performed | **chromium** | or run tests in firefox, webkit (which is opensource version of Safari) or launch electron app
101
-
102
- ```js
103
- ? [Playwright] Base url of site to be tested 'http://mysite.com'
104
- ? [Playwright] Show browser window 'Yes'
105
- ? [Playwright] Browser in which testing will be performed. Possible options: chromium, firefox, webkit or electron 'chromium'
106
-
107
- ```
108
-
109
- Create first feature and test when asked
110
-
111
- Open a newly created file in your favorite JavaScript editor.
112
- The file should look like this:
113
-
114
- ```js
115
- Feature('My First Test');
116
-
117
- Scenario('test something', ({ I }) => {
118
-
119
- });
120
- ```
121
- Write a simple test scenario:
122
-
123
- ```js
124
- Feature('My First Test');
125
-
126
- Scenario('test something', ({ I }) => {
127
- I.amOnPage('https://github.com');
128
- I.see('GitHub');
129
- });
130
- ```
131
-
132
- Run a test:
133
-
134
- ```
135
- npx codeceptjs run
136
- ```
137
-
138
- The output should be similar to this:
139
-
140
- ```bash
141
- My First Test --
142
- test something
143
- I am on page "https://github.com"
144
- I see "GitHub"
145
- ✓ OK
146
- ```
147
-
148
- To quickly execute tests use following npm scripts:
149
-
150
- After CodeceptJS is installed, try running **demo tests** using this commands:
151
-
152
- * `npm run codeceptjs` - executes tests in window mode
153
- * `npm run codeceptjs:headless` - executes tests in headless mode
154
- * `npm run codeceptjs:ui` - open CodeceptJS UI to list and run tests.
155
-
156
- More commands available in [CodeceptJS CLI runner](https://codecept.io/commands/).
157
-
158
-
159
- > [▶ Next: CodeceptJS Basics](/basics/)
160
-
161
- > [▶ Next: CodeceptJS with Playwright](/playwright/)
162
-
package/docs/react.md DELETED
@@ -1,70 +0,0 @@
1
- ---
2
- permalink: /react
3
- title: Testing React Applications
4
- ---
5
-
6
- # Testing React Applications
7
-
8
- React applications require some additional love for end to end testing.
9
- At first, it is very hard to test an application which was never designed to be tested!
10
- This happens to many React application. While building components developers often forget to keep the element's semantic.
11
-
12
- Generated HTML code may often look like this:
13
-
14
- ```js
15
- <div class="jss607 jss869 jss618 jss871 jss874 jss876" tabindex="0" role="tab" aria-selected="true" style="pointer-events: auto;">
16
- <span class="jss877">
17
- <span class="jss878">
18
- <span class="jss879">Click Me!</span>
19
- </span>
20
- </span>
21
- <span class="jss610"></span></div>
22
- ```
23
-
24
- It's quite common that clickable elements are not actual `a` or `button` elements. This way `I.click('Click Me!');` won't work, as well as `fillField('name', 'value)`. Finding a correct locator for such cases turns to be almost impossible.
25
-
26
- In this case test engineers have two options:
27
-
28
- 1. Update JSX files to change output HTML and rebuild the application
29
- 1. Test the application how it is.
30
-
31
- We recommend for long-running projects to go with the first option. The better you write your initial HTML the cleaner and less fragile will be your tests. Replace divs with correct HTML elements, add `data-` attributes, add labels, and names to input fields to make all CodeceptJS magic like clicking link by a text to work.
32
-
33
- However, if you can't update the code you can go to the second option. In this case, you should bind your locators to visible text on page and available semantic attribues. For instance, instead of using generated locator as this one:
34
-
35
- ```
36
- //*[@id="document"]/div[2]/div/div[2]/div
37
- ```
38
-
39
- use [Locator Builder](/locators#locator-builder) to make clean semantic locator:
40
-
41
- ```js
42
- locate('[role=tab]').withText('Click Me!');
43
- ```
44
-
45
- This way you can build very flexible and stable locators even on application never designed for testing.
46
-
47
- ## Locators
48
-
49
- For React apps a special `react` locator is available. It allows to select an element by its component name, props and state.
50
-
51
- ```js
52
- { react: 'MyComponent' }
53
- { react: 'Button', props: { title: 'Click Me' }}
54
- { react: 'Button', state: { some: 'state' }}
55
- { react: 'Input', state: 'valid'}
56
- ```
57
-
58
- In WebDriver, Puppeteer, and Playwright you can use React locators in any method where locator is required:
59
-
60
- ```js
61
- I.click({ react: 'Tab', props: { title: 'Click Me!' }});
62
- I.seeElement({ react: 't', props: { title: 'Clicked' }});
63
- ```
64
-
65
- To find React element names and props in a tree use [React DevTools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) extension.
66
-
67
- > Turn off minification for application builds otherwise component names will be uglified as well
68
-
69
- - With WebDriver and Puppeteer, React locators work via [resq](https://github.com/baruchvlz/resq) library, which handles React 16 and above.
70
- - With Playwright, React locators work via [Playwright React Locator](https://playwright.dev/docs/other-locators#react-locator).