codeceptjs 3.0.6 → 3.1.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.
- package/CHANGELOG.md +92 -8
- package/README.md +9 -1
- package/bin/codecept.js +28 -17
- package/docs/build/Appium.js +69 -0
- package/docs/build/GraphQL.js +9 -10
- package/docs/build/Playwright.js +271 -63
- package/docs/build/Protractor.js +2 -0
- package/docs/build/Puppeteer.js +56 -18
- package/docs/build/REST.js +16 -3
- package/docs/build/WebDriver.js +82 -16
- package/docs/changelog.md +93 -9
- package/docs/configuration.md +15 -2
- package/docs/email.md +8 -8
- package/docs/examples.md +3 -3
- package/docs/helpers/Appium.md +66 -68
- package/docs/helpers/MockRequest.md +3 -3
- package/docs/helpers/Playwright.md +269 -203
- package/docs/helpers/Puppeteer.md +17 -1
- package/docs/helpers/REST.md +23 -9
- package/docs/helpers/WebDriver.md +3 -2
- package/docs/locators.md +27 -0
- package/docs/mobile.md +2 -1
- package/docs/nightmare.md +0 -5
- package/docs/parallel.md +14 -7
- package/docs/playwright.md +178 -11
- package/docs/plugins.md +61 -69
- package/docs/react.md +1 -1
- package/docs/reports.md +5 -4
- package/lib/actor.js +1 -2
- package/lib/codecept.js +13 -2
- package/lib/command/definitions.js +8 -1
- package/lib/command/interactive.js +4 -2
- package/lib/command/run-multiple/collection.js +4 -0
- package/lib/container.js +3 -3
- package/lib/helper/Appium.js +41 -0
- package/lib/helper/GraphQL.js +9 -10
- package/lib/helper/Playwright.js +218 -70
- package/lib/helper/Protractor.js +2 -0
- package/lib/helper/Puppeteer.js +56 -18
- package/lib/helper/REST.js +12 -0
- package/lib/helper/WebDriver.js +82 -16
- package/lib/helper/errors/ConnectionRefused.js +1 -1
- package/lib/helper/extras/Popup.js +1 -1
- package/lib/helper/extras/React.js +44 -32
- package/lib/interfaces/gherkin.js +1 -0
- package/lib/listener/exit.js +2 -4
- package/lib/listener/helpers.js +3 -4
- package/lib/locator.js +7 -0
- package/lib/mochaFactory.js +11 -6
- package/lib/output.js +5 -2
- package/lib/plugin/allure.js +7 -18
- package/lib/plugin/commentStep.js +1 -1
- package/lib/plugin/{puppeteerCoverage.js → coverage.js} +10 -22
- package/lib/plugin/customLocator.js +2 -2
- package/lib/plugin/screenshotOnFail.js +5 -0
- package/lib/plugin/subtitles.js +88 -0
- package/lib/plugin/tryTo.js +1 -1
- package/lib/step.js +4 -2
- package/lib/ui.js +6 -2
- package/package.json +5 -4
- package/typings/index.d.ts +44 -21
- package/typings/types.d.ts +137 -16
|
@@ -28,17 +28,19 @@ Requires `playwright` package version ^1 to be installed:
|
|
|
28
28
|
This helper should be configured in codecept.json or codecept.conf.js
|
|
29
29
|
|
|
30
30
|
- `url`: base url of website to be tested
|
|
31
|
-
- `browser`: a browser to test on, either: `chromium`, `firefox`, `webkit`. Default: chromium.
|
|
31
|
+
- `browser`: a browser to test on, either: `chromium`, `firefox`, `webkit`, `electron`. Default: chromium.
|
|
32
32
|
- `show`: - show browser window.
|
|
33
33
|
- `restart`: - restart browser between tests.
|
|
34
34
|
- `disableScreenshots`: - don't save screenshot on failure.
|
|
35
35
|
- `emulate`: launch browser in device emulation mode.
|
|
36
|
+
- `video`: enables video recording for failed tests; videos are saved into `output/videos` folder
|
|
37
|
+
- `trace`: record [tracing information][2] with screenshots and snapshots.
|
|
36
38
|
- `fullPageScreenshots` - make full page screenshots on failure.
|
|
37
39
|
- `uniqueScreenshotNames`: - option to prevent screenshot override if you have scenarios with the same name in different suites.
|
|
38
40
|
- `keepBrowserState`: - keep browser state between tests when `restart` is set to false.
|
|
39
41
|
- `keepCookies`: - keep cookies between tests when `restart` is set to false.
|
|
40
42
|
- `waitForAction`: (optional) how long to wait after click, doubleClick or PressKey actions in ms. Default: 100.
|
|
41
|
-
- `waitForNavigation`: . When to consider navigation succeeded. Possible options: `load`, `domcontentloaded`, `networkidle`. Choose one of those options is possible. See [Playwright API][
|
|
43
|
+
- `waitForNavigation`: . When to consider navigation succeeded. Possible options: `load`, `domcontentloaded`, `networkidle`. Choose one of those options is possible. See [Playwright API][3].
|
|
42
44
|
- `pressKeyDelay`: . Delay between key presses in ms. Used when calling Playwrights page.type(...) in fillField/appendField
|
|
43
45
|
- `getPageTimeout` config option to set maximum navigation time in milliseconds.
|
|
44
46
|
- `waitForTimeout`: (optional) default wait* timeout in ms. Default: 1000.
|
|
@@ -47,6 +49,23 @@ This helper should be configured in codecept.json or codecept.conf.js
|
|
|
47
49
|
- `userAgent`: (optional) user-agent string.
|
|
48
50
|
- `manualStart`: - do not start browser before a test, start it manually inside a helper with `this.helpers["Playwright"]._startBrowser()`.
|
|
49
51
|
- `chromium`: (optional) pass additional chromium options
|
|
52
|
+
- `electron`: (optional) pass additional electron options
|
|
53
|
+
|
|
54
|
+
#### Video Recording Customization
|
|
55
|
+
|
|
56
|
+
By default, video is saved to `output/video` dir. You can customize this path by passing `dir` option to `recordVideo` option.
|
|
57
|
+
|
|
58
|
+
- `video`: enables video recording for failed tests; videos are saved into `output/videos` folder
|
|
59
|
+
- `keepVideoForPassedTests`: - save videos for passed tests
|
|
60
|
+
- `recordVideo`: [additional options for videos customization][4]
|
|
61
|
+
|
|
62
|
+
#### Trace Recording Customization
|
|
63
|
+
|
|
64
|
+
Trace recording provides a complete information on test execution and includes DOM snapshots, screenshots, and network requests logged during run.
|
|
65
|
+
Traces will be saved to `output/trace`
|
|
66
|
+
|
|
67
|
+
- `trace`: enables trace recording for failed tests; trace are saved into `output/trace` folder
|
|
68
|
+
- `keepTraceForPassedTests`: - save trace for passed tests
|
|
50
69
|
|
|
51
70
|
#### Example #1: Wait for 0 network connections.
|
|
52
71
|
|
|
@@ -91,7 +110,7 @@ This helper should be configured in codecept.json or codecept.conf.js
|
|
|
91
110
|
}
|
|
92
111
|
```
|
|
93
112
|
|
|
94
|
-
#### Example #4: Connect to remote browser by specifying [websocket endpoint][
|
|
113
|
+
#### Example #4: Connect to remote browser by specifying [websocket endpoint][5]
|
|
95
114
|
|
|
96
115
|
```js
|
|
97
116
|
{
|
|
@@ -99,7 +118,7 @@ This helper should be configured in codecept.json or codecept.conf.js
|
|
|
99
118
|
Playwright: {
|
|
100
119
|
url: "http://localhost",
|
|
101
120
|
chromium: {
|
|
102
|
-
browserWSEndpoint:
|
|
121
|
+
browserWSEndpoint: 'ws://localhost:9222/devtools/browser/c5aa6160-b5bc-4d53-bb49-6ecb36cd2e0a'
|
|
103
122
|
}
|
|
104
123
|
}
|
|
105
124
|
}
|
|
@@ -108,7 +127,7 @@ This helper should be configured in codecept.json or codecept.conf.js
|
|
|
108
127
|
|
|
109
128
|
#### Example #5: Testing with Chromium extensions
|
|
110
129
|
|
|
111
|
-
[official docs][
|
|
130
|
+
[official docs][6]
|
|
112
131
|
|
|
113
132
|
```js
|
|
114
133
|
{
|
|
@@ -175,6 +194,14 @@ Add the 'dialog' event listener to a page
|
|
|
175
194
|
|
|
176
195
|
- `page`
|
|
177
196
|
|
|
197
|
+
### _contextLocator
|
|
198
|
+
|
|
199
|
+
Grab Locator if called within Context
|
|
200
|
+
|
|
201
|
+
#### Parameters
|
|
202
|
+
|
|
203
|
+
- `locator` **any**
|
|
204
|
+
|
|
178
205
|
### _getPageUrl
|
|
179
206
|
|
|
180
207
|
Gets page URL including hash.
|
|
@@ -236,13 +263,13 @@ Set current page
|
|
|
236
263
|
|
|
237
264
|
#### Parameters
|
|
238
265
|
|
|
239
|
-
- `page` **[object][
|
|
266
|
+
- `page` **[object][7]** page to set
|
|
240
267
|
|
|
241
268
|
### acceptPopup
|
|
242
269
|
|
|
243
270
|
Accepts the active JavaScript native popup window, as created by window.alert|window.confirm|window.prompt.
|
|
244
271
|
Don't confuse popups with modal windows, as created by [various
|
|
245
|
-
libraries][
|
|
272
|
+
libraries][8].
|
|
246
273
|
|
|
247
274
|
### amAcceptingPopups
|
|
248
275
|
|
|
@@ -279,7 +306,7 @@ I.amOnPage('/login'); // opens a login page
|
|
|
279
306
|
|
|
280
307
|
#### Parameters
|
|
281
308
|
|
|
282
|
-
- `url` **[string][
|
|
309
|
+
- `url` **[string][9]** url path or global url.
|
|
283
310
|
|
|
284
311
|
### appendField
|
|
285
312
|
|
|
@@ -292,8 +319,8 @@ I.appendField('#myTextField', 'appended');
|
|
|
292
319
|
|
|
293
320
|
#### Parameters
|
|
294
321
|
|
|
295
|
-
- `field` **([string][
|
|
296
|
-
- `value` **[string][
|
|
322
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator
|
|
323
|
+
- `value` **[string][9]** text value to append.
|
|
297
324
|
|
|
298
325
|
### attachFile
|
|
299
326
|
|
|
@@ -308,8 +335,8 @@ I.attachFile('form input[name=avatar]', 'data/avatar.jpg');
|
|
|
308
335
|
|
|
309
336
|
#### Parameters
|
|
310
337
|
|
|
311
|
-
- `locator` **([string][
|
|
312
|
-
- `pathToFile` **[string][
|
|
338
|
+
- `locator` **([string][9] | [object][7])** field located by label|name|CSS|XPath|strict locator.
|
|
339
|
+
- `pathToFile` **[string][9]** local file path relative to codecept.json config file.
|
|
313
340
|
|
|
314
341
|
### cancelPopup
|
|
315
342
|
|
|
@@ -330,8 +357,8 @@ I.checkOption('agree', '//form');
|
|
|
330
357
|
|
|
331
358
|
#### Parameters
|
|
332
359
|
|
|
333
|
-
- `field` **([string][
|
|
334
|
-
- `context` **([string][
|
|
360
|
+
- `field` **([string][9] | [object][7])** checkbox located by label | name | CSS | XPath | strict locator.
|
|
361
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element located by CSS | XPath | strict locator.
|
|
335
362
|
|
|
336
363
|
### clearCookie
|
|
337
364
|
|
|
@@ -345,7 +372,7 @@ I.clearCookie('test');
|
|
|
345
372
|
|
|
346
373
|
#### Parameters
|
|
347
374
|
|
|
348
|
-
- `cookie` **[string][
|
|
375
|
+
- `cookie` **[string][9]?** (optional, `null` by default) cookie name
|
|
349
376
|
|
|
350
377
|
### clearField
|
|
351
378
|
|
|
@@ -360,7 +387,7 @@ I.clearField('#email');
|
|
|
360
387
|
#### Parameters
|
|
361
388
|
|
|
362
389
|
- `field`
|
|
363
|
-
- `editable` **([string][
|
|
390
|
+
- `editable` **([string][9] | [object][7])** field located by label|name|CSS|XPath|strict locator.
|
|
364
391
|
|
|
365
392
|
### click
|
|
366
393
|
|
|
@@ -388,8 +415,8 @@ I.click({css: 'nav a.login'});
|
|
|
388
415
|
|
|
389
416
|
#### Parameters
|
|
390
417
|
|
|
391
|
-
- `locator` **([string][
|
|
392
|
-
- `context` **([string][
|
|
418
|
+
- `locator` **([string][9] | [object][7])** clickable link or button located by text, or any element located by CSS|XPath|strict locator.
|
|
419
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element to search in CSS|XPath|Strict locator.
|
|
393
420
|
|
|
394
421
|
### clickLink
|
|
395
422
|
|
|
@@ -428,8 +455,8 @@ I.dontSee('Login', '.nav'); // no login inside .nav element
|
|
|
428
455
|
|
|
429
456
|
#### Parameters
|
|
430
457
|
|
|
431
|
-
- `text` **[string][
|
|
432
|
-
- `context` **([string][
|
|
458
|
+
- `text` **[string][9]** which is not present.
|
|
459
|
+
- `context` **([string][9] | [object][7])?** (optional) element located by CSS|XPath|strict locator in which to perfrom search.
|
|
433
460
|
|
|
434
461
|
### dontSeeCheckboxIsChecked
|
|
435
462
|
|
|
@@ -443,7 +470,7 @@ I.dontSeeCheckboxIsChecked('agree'); // located by name
|
|
|
443
470
|
|
|
444
471
|
#### Parameters
|
|
445
472
|
|
|
446
|
-
- `field` **([string][
|
|
473
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
447
474
|
|
|
448
475
|
### dontSeeCookie
|
|
449
476
|
|
|
@@ -455,7 +482,7 @@ I.dontSeeCookie('auth'); // no auth cookie
|
|
|
455
482
|
|
|
456
483
|
#### Parameters
|
|
457
484
|
|
|
458
|
-
- `name` **[string][
|
|
485
|
+
- `name` **[string][9]** cookie name.
|
|
459
486
|
|
|
460
487
|
### dontSeeCurrentUrlEquals
|
|
461
488
|
|
|
@@ -469,7 +496,7 @@ I.dontSeeCurrentUrlEquals('http://mysite.com/login'); // absolute urls are also
|
|
|
469
496
|
|
|
470
497
|
#### Parameters
|
|
471
498
|
|
|
472
|
-
- `url` **[string][
|
|
499
|
+
- `url` **[string][9]** value to check.
|
|
473
500
|
|
|
474
501
|
### dontSeeElement
|
|
475
502
|
|
|
@@ -481,7 +508,7 @@ I.dontSeeElement('.modal'); // modal is not shown
|
|
|
481
508
|
|
|
482
509
|
#### Parameters
|
|
483
510
|
|
|
484
|
-
- `locator` **([string][
|
|
511
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|Strict locator.
|
|
485
512
|
|
|
486
513
|
### dontSeeElementInDOM
|
|
487
514
|
|
|
@@ -493,7 +520,7 @@ I.dontSeeElementInDOM('.nav'); // checks that element is not on page visible or
|
|
|
493
520
|
|
|
494
521
|
#### Parameters
|
|
495
522
|
|
|
496
|
-
- `locator` **([string][
|
|
523
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|Strict locator.
|
|
497
524
|
|
|
498
525
|
### dontSeeInCurrentUrl
|
|
499
526
|
|
|
@@ -501,7 +528,7 @@ Checks that current url does not contain a provided fragment.
|
|
|
501
528
|
|
|
502
529
|
#### Parameters
|
|
503
530
|
|
|
504
|
-
- `url` **[string][
|
|
531
|
+
- `url` **[string][9]** value to check.
|
|
505
532
|
|
|
506
533
|
### dontSeeInField
|
|
507
534
|
|
|
@@ -515,8 +542,8 @@ I.dontSeeInField({ css: 'form input.email' }, 'user@user.com'); // field by CSS
|
|
|
515
542
|
|
|
516
543
|
#### Parameters
|
|
517
544
|
|
|
518
|
-
- `field` **([string][
|
|
519
|
-
- `value` **[string][
|
|
545
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
546
|
+
- `value` **[string][9]** value to check.
|
|
520
547
|
|
|
521
548
|
### dontSeeInSource
|
|
522
549
|
|
|
@@ -529,7 +556,7 @@ I.dontSeeInSource('<!--'); // no comments in source
|
|
|
529
556
|
#### Parameters
|
|
530
557
|
|
|
531
558
|
- `text`
|
|
532
|
-
- `value` **[string][
|
|
559
|
+
- `value` **[string][9]** to check.
|
|
533
560
|
|
|
534
561
|
### dontSeeInTitle
|
|
535
562
|
|
|
@@ -541,7 +568,7 @@ I.dontSeeInTitle('Error');
|
|
|
541
568
|
|
|
542
569
|
#### Parameters
|
|
543
570
|
|
|
544
|
-
- `text` **[string][
|
|
571
|
+
- `text` **[string][9]** value to check.
|
|
545
572
|
|
|
546
573
|
### doubleClick
|
|
547
574
|
|
|
@@ -557,8 +584,8 @@ I.doubleClick('.btn.edit');
|
|
|
557
584
|
|
|
558
585
|
#### Parameters
|
|
559
586
|
|
|
560
|
-
- `locator` **([string][
|
|
561
|
-
- `context` **([string][
|
|
587
|
+
- `locator` **([string][9] | [object][7])** clickable link or button located by text, or any element located by CSS|XPath|strict locator.
|
|
588
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element to search in CSS|XPath|Strict locator.
|
|
562
589
|
|
|
563
590
|
### dragAndDrop
|
|
564
591
|
|
|
@@ -570,8 +597,8 @@ I.dragAndDrop('#dragHandle', '#container');
|
|
|
570
597
|
|
|
571
598
|
#### Parameters
|
|
572
599
|
|
|
573
|
-
- `srcElement` **([string][
|
|
574
|
-
- `destElement` **([string][
|
|
600
|
+
- `srcElement` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
601
|
+
- `destElement` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
575
602
|
|
|
576
603
|
### dragSlider
|
|
577
604
|
|
|
@@ -585,8 +612,8 @@ I.dragSlider('#slider', -70);
|
|
|
585
612
|
|
|
586
613
|
#### Parameters
|
|
587
614
|
|
|
588
|
-
- `locator` **([string][
|
|
589
|
-
- `offsetX` **[number][
|
|
615
|
+
- `locator` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
616
|
+
- `offsetX` **[number][10]** position to drag.
|
|
590
617
|
|
|
591
618
|
### executeScript
|
|
592
619
|
|
|
@@ -613,10 +640,10 @@ If a function returns a Promise it will wait for its resolution.
|
|
|
613
640
|
|
|
614
641
|
#### Parameters
|
|
615
642
|
|
|
616
|
-
- `fn` **([string][
|
|
643
|
+
- `fn` **([string][9] | [function][11])** function to be executed in browser context.
|
|
617
644
|
- `arg` **any?** optional argument to pass to the function
|
|
618
645
|
|
|
619
|
-
Returns **[Promise][
|
|
646
|
+
Returns **[Promise][12]<any>**
|
|
620
647
|
|
|
621
648
|
### fillField
|
|
622
649
|
|
|
@@ -636,8 +663,8 @@ I.fillField({css: 'form#login input[name=username]'}, 'John');
|
|
|
636
663
|
|
|
637
664
|
#### Parameters
|
|
638
665
|
|
|
639
|
-
- `field` **([string][
|
|
640
|
-
- `value` **([string][
|
|
666
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
667
|
+
- `value` **([string][9] | [object][7])** text value to fill.
|
|
641
668
|
|
|
642
669
|
### forceClick
|
|
643
670
|
|
|
@@ -668,8 +695,8 @@ I.forceClick({css: 'nav a.login'});
|
|
|
668
695
|
|
|
669
696
|
#### Parameters
|
|
670
697
|
|
|
671
|
-
- `locator` **([string][
|
|
672
|
-
- `context` **([string][
|
|
698
|
+
- `locator` **([string][9] | [object][7])** clickable link or button located by text, or any element located by CSS|XPath|strict locator.
|
|
699
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element to search in CSS|XPath|Strict locator.
|
|
673
700
|
|
|
674
701
|
### grabAttributeFrom
|
|
675
702
|
|
|
@@ -683,10 +710,10 @@ let hint = await I.grabAttributeFrom('#tooltip', 'title');
|
|
|
683
710
|
|
|
684
711
|
#### Parameters
|
|
685
712
|
|
|
686
|
-
- `locator` **([string][
|
|
687
|
-
- `attr` **[string][
|
|
713
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
714
|
+
- `attr` **[string][9]** attribute name.
|
|
688
715
|
|
|
689
|
-
Returns **[Promise][
|
|
716
|
+
Returns **[Promise][12]<[string][9]>** attribute value
|
|
690
717
|
|
|
691
718
|
### grabAttributeFromAll
|
|
692
719
|
|
|
@@ -699,10 +726,10 @@ let hints = await I.grabAttributeFromAll('.tooltip', 'title');
|
|
|
699
726
|
|
|
700
727
|
#### Parameters
|
|
701
728
|
|
|
702
|
-
- `locator` **([string][
|
|
703
|
-
- `attr` **[string][
|
|
729
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
730
|
+
- `attr` **[string][9]** attribute name.
|
|
704
731
|
|
|
705
|
-
Returns **[Promise][
|
|
732
|
+
Returns **[Promise][12]<[Array][13]<[string][9]>>** attribute value
|
|
706
733
|
|
|
707
734
|
### grabBrowserLogs
|
|
708
735
|
|
|
@@ -713,7 +740,7 @@ let logs = await I.grabBrowserLogs();
|
|
|
713
740
|
console.log(JSON.stringify(logs))
|
|
714
741
|
```
|
|
715
742
|
|
|
716
|
-
Returns **[Promise][
|
|
743
|
+
Returns **[Promise][12]<[Array][13]<any>>**
|
|
717
744
|
|
|
718
745
|
### grabCookie
|
|
719
746
|
|
|
@@ -728,9 +755,9 @@ assert(cookie.value, '123456');
|
|
|
728
755
|
|
|
729
756
|
#### Parameters
|
|
730
757
|
|
|
731
|
-
- `name` **[string][
|
|
758
|
+
- `name` **[string][9]?** cookie name.
|
|
732
759
|
|
|
733
|
-
Returns **([Promise][
|
|
760
|
+
Returns **([Promise][12]<[string][9]> | [Promise][12]<[Array][13]<[string][9]>>)** attribute valueReturns cookie in JSON format. If name not passed returns all cookies for this domain.
|
|
734
761
|
|
|
735
762
|
### grabCssPropertyFrom
|
|
736
763
|
|
|
@@ -744,10 +771,10 @@ const value = await I.grabCssPropertyFrom('h3', 'font-weight');
|
|
|
744
771
|
|
|
745
772
|
#### Parameters
|
|
746
773
|
|
|
747
|
-
- `locator` **([string][
|
|
748
|
-
- `cssProperty` **[string][
|
|
774
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
775
|
+
- `cssProperty` **[string][9]** CSS property name.
|
|
749
776
|
|
|
750
|
-
Returns **[Promise][
|
|
777
|
+
Returns **[Promise][12]<[string][9]>** CSS value
|
|
751
778
|
|
|
752
779
|
### grabCssPropertyFromAll
|
|
753
780
|
|
|
@@ -760,10 +787,10 @@ const values = await I.grabCssPropertyFromAll('h3', 'font-weight');
|
|
|
760
787
|
|
|
761
788
|
#### Parameters
|
|
762
789
|
|
|
763
|
-
- `locator` **([string][
|
|
764
|
-
- `cssProperty` **[string][
|
|
790
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
791
|
+
- `cssProperty` **[string][9]** CSS property name.
|
|
765
792
|
|
|
766
|
-
Returns **[Promise][
|
|
793
|
+
Returns **[Promise][12]<[Array][13]<[string][9]>>** CSS value
|
|
767
794
|
|
|
768
795
|
### grabCurrentUrl
|
|
769
796
|
|
|
@@ -775,7 +802,7 @@ let url = await I.grabCurrentUrl();
|
|
|
775
802
|
console.log(`Current URL is [${url}]`);
|
|
776
803
|
```
|
|
777
804
|
|
|
778
|
-
Returns **[Promise][
|
|
805
|
+
Returns **[Promise][12]<[string][9]>** current URL
|
|
779
806
|
|
|
780
807
|
### grabDataFromPerformanceTiming
|
|
781
808
|
|
|
@@ -822,11 +849,11 @@ const width = await I.grabElementBoundingRect('h3', 'width');
|
|
|
822
849
|
|
|
823
850
|
#### Parameters
|
|
824
851
|
|
|
825
|
-
- `locator` **([string][
|
|
852
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
826
853
|
- `prop`
|
|
827
|
-
- `elementSize` **[string][
|
|
854
|
+
- `elementSize` **[string][9]?** x, y, width or height of the given element.
|
|
828
855
|
|
|
829
|
-
Returns **([Promise][
|
|
856
|
+
Returns **([Promise][12]<DOMRect> | [Promise][12]<[number][10]>)** Element bounding rectangle
|
|
830
857
|
|
|
831
858
|
### grabHTMLFrom
|
|
832
859
|
|
|
@@ -841,9 +868,9 @@ let postHTML = await I.grabHTMLFrom('#post');
|
|
|
841
868
|
#### Parameters
|
|
842
869
|
|
|
843
870
|
- `locator`
|
|
844
|
-
- `element` **([string][
|
|
871
|
+
- `element` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
845
872
|
|
|
846
|
-
Returns **[Promise][
|
|
873
|
+
Returns **[Promise][12]<[string][9]>** HTML code for an element
|
|
847
874
|
|
|
848
875
|
### grabHTMLFromAll
|
|
849
876
|
|
|
@@ -857,9 +884,9 @@ let postHTMLs = await I.grabHTMLFromAll('.post');
|
|
|
857
884
|
#### Parameters
|
|
858
885
|
|
|
859
886
|
- `locator`
|
|
860
|
-
- `element` **([string][
|
|
887
|
+
- `element` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
861
888
|
|
|
862
|
-
Returns **[Promise][
|
|
889
|
+
Returns **[Promise][12]<[Array][13]<[string][9]>>** HTML code for an element
|
|
863
890
|
|
|
864
891
|
### grabNumberOfOpenTabs
|
|
865
892
|
|
|
@@ -870,7 +897,7 @@ Resumes test execution, so **should be used inside async function with `await`**
|
|
|
870
897
|
let tabs = await I.grabNumberOfOpenTabs();
|
|
871
898
|
```
|
|
872
899
|
|
|
873
|
-
Returns **[Promise][
|
|
900
|
+
Returns **[Promise][12]<[number][10]>** number of open tabs
|
|
874
901
|
|
|
875
902
|
### grabNumberOfVisibleElements
|
|
876
903
|
|
|
@@ -883,9 +910,9 @@ let numOfElements = await I.grabNumberOfVisibleElements('p');
|
|
|
883
910
|
|
|
884
911
|
#### Parameters
|
|
885
912
|
|
|
886
|
-
- `locator` **([string][
|
|
913
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
887
914
|
|
|
888
|
-
Returns **[Promise][
|
|
915
|
+
Returns **[Promise][12]<[number][10]>** number of visible elements
|
|
889
916
|
|
|
890
917
|
### grabPageScrollPosition
|
|
891
918
|
|
|
@@ -896,7 +923,7 @@ Resumes test execution, so **should be used inside an async function with `await
|
|
|
896
923
|
let { x, y } = await I.grabPageScrollPosition();
|
|
897
924
|
```
|
|
898
925
|
|
|
899
|
-
Returns **[Promise][
|
|
926
|
+
Returns **[Promise][12]<PageScrollPosition>** scroll position
|
|
900
927
|
|
|
901
928
|
### grabPopupText
|
|
902
929
|
|
|
@@ -906,7 +933,7 @@ Grab the text within the popup. If no popup is visible then it will return null
|
|
|
906
933
|
await I.grabPopupText();
|
|
907
934
|
```
|
|
908
935
|
|
|
909
|
-
Returns **[Promise][
|
|
936
|
+
Returns **[Promise][12]<([string][9] | null)>**
|
|
910
937
|
|
|
911
938
|
### grabSource
|
|
912
939
|
|
|
@@ -917,7 +944,7 @@ Resumes test execution, so **should be used inside async function with `await`**
|
|
|
917
944
|
let pageSource = await I.grabSource();
|
|
918
945
|
```
|
|
919
946
|
|
|
920
|
-
Returns **[Promise][
|
|
947
|
+
Returns **[Promise][12]<[string][9]>** source code
|
|
921
948
|
|
|
922
949
|
### grabTextFrom
|
|
923
950
|
|
|
@@ -932,9 +959,9 @@ If multiple elements found returns first element.
|
|
|
932
959
|
|
|
933
960
|
#### Parameters
|
|
934
961
|
|
|
935
|
-
- `locator` **([string][
|
|
962
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
936
963
|
|
|
937
|
-
Returns **[Promise][
|
|
964
|
+
Returns **[Promise][12]<[string][9]>** attribute value
|
|
938
965
|
|
|
939
966
|
### grabTextFromAll
|
|
940
967
|
|
|
@@ -947,9 +974,9 @@ let pins = await I.grabTextFromAll('#pin li');
|
|
|
947
974
|
|
|
948
975
|
#### Parameters
|
|
949
976
|
|
|
950
|
-
- `locator` **([string][
|
|
977
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
951
978
|
|
|
952
|
-
Returns **[Promise][
|
|
979
|
+
Returns **[Promise][12]<[Array][13]<[string][9]>>** attribute value
|
|
953
980
|
|
|
954
981
|
### grabTitle
|
|
955
982
|
|
|
@@ -960,7 +987,7 @@ Resumes test execution, so **should be used inside async with `await`** operator
|
|
|
960
987
|
let title = await I.grabTitle();
|
|
961
988
|
```
|
|
962
989
|
|
|
963
|
-
Returns **[Promise][
|
|
990
|
+
Returns **[Promise][12]<[string][9]>** title
|
|
964
991
|
|
|
965
992
|
### grabValueFrom
|
|
966
993
|
|
|
@@ -974,9 +1001,9 @@ let email = await I.grabValueFrom('input[name=email]');
|
|
|
974
1001
|
|
|
975
1002
|
#### Parameters
|
|
976
1003
|
|
|
977
|
-
- `locator` **([string][
|
|
1004
|
+
- `locator` **([string][9] | [object][7])** field located by label|name|CSS|XPath|strict locator.
|
|
978
1005
|
|
|
979
|
-
Returns **[Promise][
|
|
1006
|
+
Returns **[Promise][12]<[string][9]>** attribute value
|
|
980
1007
|
|
|
981
1008
|
### grabValueFromAll
|
|
982
1009
|
|
|
@@ -989,16 +1016,16 @@ let inputs = await I.grabValueFromAll('//form/input');
|
|
|
989
1016
|
|
|
990
1017
|
#### Parameters
|
|
991
1018
|
|
|
992
|
-
- `locator` **([string][
|
|
1019
|
+
- `locator` **([string][9] | [object][7])** field located by label|name|CSS|XPath|strict locator.
|
|
993
1020
|
|
|
994
|
-
Returns **[Promise][
|
|
1021
|
+
Returns **[Promise][12]<[Array][13]<[string][9]>>** attribute value
|
|
995
1022
|
|
|
996
1023
|
### handleDownloads
|
|
997
1024
|
|
|
998
1025
|
Handles a file download.Aa file name is required to save the file on disk.
|
|
999
1026
|
Files are saved to "output" directory.
|
|
1000
1027
|
|
|
1001
|
-
Should be used with [FileSystem helper][
|
|
1028
|
+
Should be used with [FileSystem helper][14] to check that file were downloaded correctly.
|
|
1002
1029
|
|
|
1003
1030
|
```js
|
|
1004
1031
|
I.handleDownloads('downloads/avatar.jpg');
|
|
@@ -1009,7 +1036,7 @@ I.waitForFile('downloads/avatar.jpg', 5);
|
|
|
1009
1036
|
|
|
1010
1037
|
#### Parameters
|
|
1011
1038
|
|
|
1012
|
-
- `fileName` **[string][
|
|
1039
|
+
- `fileName` **[string][9]?** set filename for downloaded file
|
|
1013
1040
|
|
|
1014
1041
|
### haveRequestHeaders
|
|
1015
1042
|
|
|
@@ -1023,7 +1050,22 @@ I.haveRequestHeaders({
|
|
|
1023
1050
|
|
|
1024
1051
|
#### Parameters
|
|
1025
1052
|
|
|
1026
|
-
- `customHeaders` **[object][
|
|
1053
|
+
- `customHeaders` **[object][7]** headers to set
|
|
1054
|
+
|
|
1055
|
+
### mockRoute
|
|
1056
|
+
|
|
1057
|
+
Mocks network request using [`browserContext.route`][15] of Playwright
|
|
1058
|
+
|
|
1059
|
+
```js
|
|
1060
|
+
I.mockRoute(/(.png$)|(.jpg$)/, route => route.abort());
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
This method allows intercepting and mocking requests & responses. [Learn more about it][16]
|
|
1064
|
+
|
|
1065
|
+
#### Parameters
|
|
1066
|
+
|
|
1067
|
+
- `url` **[string][9]?** URL, regex or pattern for to match URL
|
|
1068
|
+
- `handler` **[function][11]?** a function to process request
|
|
1027
1069
|
|
|
1028
1070
|
### moveCursorTo
|
|
1029
1071
|
|
|
@@ -1037,9 +1079,9 @@ I.moveCursorTo('#submit', 5,5);
|
|
|
1037
1079
|
|
|
1038
1080
|
#### Parameters
|
|
1039
1081
|
|
|
1040
|
-
- `locator` **([string][
|
|
1041
|
-
- `offsetX` **[number][
|
|
1042
|
-
- `offsetY` **[number][
|
|
1082
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
1083
|
+
- `offsetX` **[number][10]** (optional, `0` by default) X-axis offset.
|
|
1084
|
+
- `offsetY` **[number][10]** (optional, `0` by default) Y-axis offset.
|
|
1043
1085
|
|
|
1044
1086
|
### openNewTab
|
|
1045
1087
|
|
|
@@ -1049,7 +1091,7 @@ Open new tab and automatically switched to new tab
|
|
|
1049
1091
|
I.openNewTab();
|
|
1050
1092
|
```
|
|
1051
1093
|
|
|
1052
|
-
You can pass in [page options][
|
|
1094
|
+
You can pass in [page options][17] to emulate device on this page
|
|
1053
1095
|
|
|
1054
1096
|
```js
|
|
1055
1097
|
// enable mobile
|
|
@@ -1064,7 +1106,7 @@ I.openNewTab({ isMobile: true });
|
|
|
1064
1106
|
|
|
1065
1107
|
Presses a key in the browser (on a focused element).
|
|
1066
1108
|
|
|
1067
|
-
_Hint:_ For populating text field or textarea, it is recommended to use [`fillField`][
|
|
1109
|
+
_Hint:_ For populating text field or textarea, it is recommended to use [`fillField`][18].
|
|
1068
1110
|
|
|
1069
1111
|
```js
|
|
1070
1112
|
I.pressKey('Backspace');
|
|
@@ -1123,13 +1165,13 @@ Some of the supported key names are:
|
|
|
1123
1165
|
|
|
1124
1166
|
#### Parameters
|
|
1125
1167
|
|
|
1126
|
-
- `key` **([string][
|
|
1168
|
+
- `key` **([string][9] | [Array][13]<[string][9]>)** key or array of keys to press._Note:_ Shortcuts like `'Meta'` + `'A'` do not work on macOS ([GoogleChrome/Puppeteer#1313][19]).
|
|
1127
1169
|
|
|
1128
1170
|
### pressKeyDown
|
|
1129
1171
|
|
|
1130
1172
|
Presses a key in the browser and leaves it in a down state.
|
|
1131
1173
|
|
|
1132
|
-
To make combinations with modifier key and user operation (e.g. `'Control'` + [`click`][
|
|
1174
|
+
To make combinations with modifier key and user operation (e.g. `'Control'` + [`click`][20]).
|
|
1133
1175
|
|
|
1134
1176
|
```js
|
|
1135
1177
|
I.pressKeyDown('Control');
|
|
@@ -1139,13 +1181,13 @@ I.pressKeyUp('Control');
|
|
|
1139
1181
|
|
|
1140
1182
|
#### Parameters
|
|
1141
1183
|
|
|
1142
|
-
- `key` **[string][
|
|
1184
|
+
- `key` **[string][9]** name of key to press down.
|
|
1143
1185
|
|
|
1144
1186
|
### pressKeyUp
|
|
1145
1187
|
|
|
1146
1188
|
Releases a key in the browser which was previously set to a down state.
|
|
1147
1189
|
|
|
1148
|
-
To make combinations with modifier key and user operation (e.g. `'Control'` + [`click`][
|
|
1190
|
+
To make combinations with modifier key and user operation (e.g. `'Control'` + [`click`][20]).
|
|
1149
1191
|
|
|
1150
1192
|
```js
|
|
1151
1193
|
I.pressKeyDown('Control');
|
|
@@ -1155,7 +1197,7 @@ I.pressKeyUp('Control');
|
|
|
1155
1197
|
|
|
1156
1198
|
#### Parameters
|
|
1157
1199
|
|
|
1158
|
-
- `key` **[string][
|
|
1200
|
+
- `key` **[string][9]** name of key to release.
|
|
1159
1201
|
|
|
1160
1202
|
### refreshPage
|
|
1161
1203
|
|
|
@@ -1172,8 +1214,8 @@ First parameter can be set to `maximize`.
|
|
|
1172
1214
|
|
|
1173
1215
|
#### Parameters
|
|
1174
1216
|
|
|
1175
|
-
- `width` **[number][
|
|
1176
|
-
- `height` **[number][
|
|
1217
|
+
- `width` **[number][10]** width in pixels or `maximize`.
|
|
1218
|
+
- `height` **[number][10]** height in pixels.Unlike other drivers Playwright changes the size of a viewport, not the window!
|
|
1177
1219
|
Playwright does not control the window of a browser so it can't adjust its real size.
|
|
1178
1220
|
It also can't maximize a window.Update configuration to change real window size on start:```js
|
|
1179
1221
|
// inside codecept.conf.js
|
|
@@ -1196,8 +1238,8 @@ I.rightClick('Click me', '.context');
|
|
|
1196
1238
|
|
|
1197
1239
|
#### Parameters
|
|
1198
1240
|
|
|
1199
|
-
- `locator` **([string][
|
|
1200
|
-
- `context` **([string][
|
|
1241
|
+
- `locator` **([string][9] | [object][7])** clickable element located by CSS|XPath|strict locator.
|
|
1242
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element located by CSS|XPath|strict locator.
|
|
1201
1243
|
|
|
1202
1244
|
### saveElementScreenshot
|
|
1203
1245
|
|
|
@@ -1210,8 +1252,8 @@ I.saveElementScreenshot(`#submit`,'debug.png');
|
|
|
1210
1252
|
|
|
1211
1253
|
#### Parameters
|
|
1212
1254
|
|
|
1213
|
-
- `locator` **([string][
|
|
1214
|
-
- `fileName` **[string][
|
|
1255
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1256
|
+
- `fileName` **[string][9]** file name to save.
|
|
1215
1257
|
|
|
1216
1258
|
### saveScreenshot
|
|
1217
1259
|
|
|
@@ -1226,8 +1268,8 @@ I.saveScreenshot('debug.png', true) //resizes to available scrollHeight and scro
|
|
|
1226
1268
|
|
|
1227
1269
|
#### Parameters
|
|
1228
1270
|
|
|
1229
|
-
- `fileName` **[string][
|
|
1230
|
-
- `fullPage` **[boolean][
|
|
1271
|
+
- `fileName` **[string][9]** file name to save.
|
|
1272
|
+
- `fullPage` **[boolean][21]** (optional, `false` by default) flag to enable fullscreen screenshot mode.
|
|
1231
1273
|
|
|
1232
1274
|
### scrollPageToBottom
|
|
1233
1275
|
|
|
@@ -1257,9 +1299,9 @@ I.scrollTo('#submit', 5, 5);
|
|
|
1257
1299
|
|
|
1258
1300
|
#### Parameters
|
|
1259
1301
|
|
|
1260
|
-
- `locator` **([string][
|
|
1261
|
-
- `offsetX` **[number][
|
|
1262
|
-
- `offsetY` **[number][
|
|
1302
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
1303
|
+
- `offsetX` **[number][10]** (optional, `0` by default) X-axis offset.
|
|
1304
|
+
- `offsetY` **[number][10]** (optional, `0` by default) Y-axis offset.
|
|
1263
1305
|
|
|
1264
1306
|
### see
|
|
1265
1307
|
|
|
@@ -1274,8 +1316,8 @@ I.see('Register', {css: 'form.register'}); // use strict locator
|
|
|
1274
1316
|
|
|
1275
1317
|
#### Parameters
|
|
1276
1318
|
|
|
1277
|
-
- `text` **[string][
|
|
1278
|
-
- `context` **([string][
|
|
1319
|
+
- `text` **[string][9]** expected on page.
|
|
1320
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element located by CSS|Xpath|strict locator in which to search for text.
|
|
1279
1321
|
|
|
1280
1322
|
### seeAttributesOnElements
|
|
1281
1323
|
|
|
@@ -1287,8 +1329,8 @@ I.seeAttributesOnElements('//form', { method: "post"});
|
|
|
1287
1329
|
|
|
1288
1330
|
#### Parameters
|
|
1289
1331
|
|
|
1290
|
-
- `locator` **([string][
|
|
1291
|
-
- `attributes` **[object][
|
|
1332
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
1333
|
+
- `attributes` **[object][7]** attributes and their values to check.
|
|
1292
1334
|
|
|
1293
1335
|
### seeCheckboxIsChecked
|
|
1294
1336
|
|
|
@@ -1302,7 +1344,7 @@ I.seeCheckboxIsChecked({css: '#signup_form input[type=checkbox]'});
|
|
|
1302
1344
|
|
|
1303
1345
|
#### Parameters
|
|
1304
1346
|
|
|
1305
|
-
- `field` **([string][
|
|
1347
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
1306
1348
|
|
|
1307
1349
|
### seeCookie
|
|
1308
1350
|
|
|
@@ -1314,7 +1356,7 @@ I.seeCookie('Auth');
|
|
|
1314
1356
|
|
|
1315
1357
|
#### Parameters
|
|
1316
1358
|
|
|
1317
|
-
- `name` **[string][
|
|
1359
|
+
- `name` **[string][9]** cookie name.
|
|
1318
1360
|
|
|
1319
1361
|
### seeCssPropertiesOnElements
|
|
1320
1362
|
|
|
@@ -1326,8 +1368,8 @@ I.seeCssPropertiesOnElements('h3', { 'font-weight': "bold"});
|
|
|
1326
1368
|
|
|
1327
1369
|
#### Parameters
|
|
1328
1370
|
|
|
1329
|
-
- `locator` **([string][
|
|
1330
|
-
- `cssProperties` **[object][
|
|
1371
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
1372
|
+
- `cssProperties` **[object][7]** object with CSS properties and their values to check.
|
|
1331
1373
|
|
|
1332
1374
|
### seeCurrentUrlEquals
|
|
1333
1375
|
|
|
@@ -1342,7 +1384,7 @@ I.seeCurrentUrlEquals('http://my.site.com/register');
|
|
|
1342
1384
|
|
|
1343
1385
|
#### Parameters
|
|
1344
1386
|
|
|
1345
|
-
- `url` **[string][
|
|
1387
|
+
- `url` **[string][9]** value to check.
|
|
1346
1388
|
|
|
1347
1389
|
### seeElement
|
|
1348
1390
|
|
|
@@ -1355,7 +1397,7 @@ I.seeElement('#modal');
|
|
|
1355
1397
|
|
|
1356
1398
|
#### Parameters
|
|
1357
1399
|
|
|
1358
|
-
- `locator` **([string][
|
|
1400
|
+
- `locator` **([string][9] | [object][7])** located by CSS|XPath|strict locator.
|
|
1359
1401
|
|
|
1360
1402
|
### seeElementInDOM
|
|
1361
1403
|
|
|
@@ -1368,7 +1410,7 @@ I.seeElementInDOM('#modal');
|
|
|
1368
1410
|
|
|
1369
1411
|
#### Parameters
|
|
1370
1412
|
|
|
1371
|
-
- `locator` **([string][
|
|
1413
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1372
1414
|
|
|
1373
1415
|
### seeInCurrentUrl
|
|
1374
1416
|
|
|
@@ -1380,7 +1422,7 @@ I.seeInCurrentUrl('/register'); // we are on registration page
|
|
|
1380
1422
|
|
|
1381
1423
|
#### Parameters
|
|
1382
1424
|
|
|
1383
|
-
- `url` **[string][
|
|
1425
|
+
- `url` **[string][9]** a fragment to check
|
|
1384
1426
|
|
|
1385
1427
|
### seeInField
|
|
1386
1428
|
|
|
@@ -1396,8 +1438,8 @@ I.seeInField('#searchform input','Search');
|
|
|
1396
1438
|
|
|
1397
1439
|
#### Parameters
|
|
1398
1440
|
|
|
1399
|
-
- `field` **([string][
|
|
1400
|
-
- `value` **[string][
|
|
1441
|
+
- `field` **([string][9] | [object][7])** located by label|name|CSS|XPath|strict locator.
|
|
1442
|
+
- `value` **[string][9]** value to check.
|
|
1401
1443
|
|
|
1402
1444
|
### seeInPopup
|
|
1403
1445
|
|
|
@@ -1410,7 +1452,7 @@ I.seeInPopup('Popup text');
|
|
|
1410
1452
|
|
|
1411
1453
|
#### Parameters
|
|
1412
1454
|
|
|
1413
|
-
- `text` **[string][
|
|
1455
|
+
- `text` **[string][9]** value to check.
|
|
1414
1456
|
|
|
1415
1457
|
### seeInSource
|
|
1416
1458
|
|
|
@@ -1422,7 +1464,7 @@ I.seeInSource('<h1>Green eggs & ham</h1>');
|
|
|
1422
1464
|
|
|
1423
1465
|
#### Parameters
|
|
1424
1466
|
|
|
1425
|
-
- `text` **[string][
|
|
1467
|
+
- `text` **[string][9]** value to check.
|
|
1426
1468
|
|
|
1427
1469
|
### seeInTitle
|
|
1428
1470
|
|
|
@@ -1434,7 +1476,7 @@ I.seeInTitle('Home Page');
|
|
|
1434
1476
|
|
|
1435
1477
|
#### Parameters
|
|
1436
1478
|
|
|
1437
|
-
- `text` **[string][
|
|
1479
|
+
- `text` **[string][9]** text value to check.
|
|
1438
1480
|
|
|
1439
1481
|
### seeNumberOfElements
|
|
1440
1482
|
|
|
@@ -1447,8 +1489,8 @@ I.seeNumberOfElements('#submitBtn', 1);
|
|
|
1447
1489
|
|
|
1448
1490
|
#### Parameters
|
|
1449
1491
|
|
|
1450
|
-
- `locator` **([string][
|
|
1451
|
-
- `num` **[number][
|
|
1492
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1493
|
+
- `num` **[number][10]** number of elements.
|
|
1452
1494
|
|
|
1453
1495
|
### seeNumberOfVisibleElements
|
|
1454
1496
|
|
|
@@ -1461,8 +1503,8 @@ I.seeNumberOfVisibleElements('.buttons', 3);
|
|
|
1461
1503
|
|
|
1462
1504
|
#### Parameters
|
|
1463
1505
|
|
|
1464
|
-
- `locator` **([string][
|
|
1465
|
-
- `num` **[number][
|
|
1506
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1507
|
+
- `num` **[number][10]** number of elements.
|
|
1466
1508
|
|
|
1467
1509
|
### seeTextEquals
|
|
1468
1510
|
|
|
@@ -1474,8 +1516,8 @@ I.seeTextEquals('text', 'h1');
|
|
|
1474
1516
|
|
|
1475
1517
|
#### Parameters
|
|
1476
1518
|
|
|
1477
|
-
- `text` **[string][
|
|
1478
|
-
- `context` **([string][
|
|
1519
|
+
- `text` **[string][9]** element value to check.
|
|
1520
|
+
- `context` **([string][9] | [object][7])?** element located by CSS|XPath|strict locator.
|
|
1479
1521
|
|
|
1480
1522
|
### seeTitleEquals
|
|
1481
1523
|
|
|
@@ -1487,7 +1529,7 @@ I.seeTitleEquals('Test title.');
|
|
|
1487
1529
|
|
|
1488
1530
|
#### Parameters
|
|
1489
1531
|
|
|
1490
|
-
- `text` **[string][
|
|
1532
|
+
- `text` **[string][9]** value to check.
|
|
1491
1533
|
|
|
1492
1534
|
### selectOption
|
|
1493
1535
|
|
|
@@ -1512,8 +1554,8 @@ I.selectOption('Which OS do you use?', ['Android', 'iOS']);
|
|
|
1512
1554
|
|
|
1513
1555
|
#### Parameters
|
|
1514
1556
|
|
|
1515
|
-
- `select` **([string][
|
|
1516
|
-
- `option` **([string][
|
|
1557
|
+
- `select` **([string][9] | [object][7])** field located by label|name|CSS|XPath|strict locator.
|
|
1558
|
+
- `option` **([string][9] | [Array][13]<any>)** visible text or value of option.
|
|
1517
1559
|
|
|
1518
1560
|
### setCookie
|
|
1519
1561
|
|
|
@@ -1533,7 +1575,23 @@ I.setCookie([
|
|
|
1533
1575
|
|
|
1534
1576
|
#### Parameters
|
|
1535
1577
|
|
|
1536
|
-
- `cookie` **(Cookie | [Array][
|
|
1578
|
+
- `cookie` **(Cookie | [Array][13]<Cookie>)** a cookie object or array of cookie objects.
|
|
1579
|
+
|
|
1580
|
+
### stopMockingRoute
|
|
1581
|
+
|
|
1582
|
+
Stops network mocking created by `mockRoute`.
|
|
1583
|
+
|
|
1584
|
+
```js
|
|
1585
|
+
I.stopMockingRoute(/(.png$)|(.jpg$)/);
|
|
1586
|
+
I.stopMockingRoute(/(.png$)|(.jpg$)/, previouslySetHandler);
|
|
1587
|
+
```
|
|
1588
|
+
|
|
1589
|
+
If no handler is passed, all mock requests for the rote are disabled.
|
|
1590
|
+
|
|
1591
|
+
#### Parameters
|
|
1592
|
+
|
|
1593
|
+
- `url` **[string][9]?** URL, regex or pattern for to match URL
|
|
1594
|
+
- `handler` **[function][11]?** a function to process request
|
|
1537
1595
|
|
|
1538
1596
|
### switchTo
|
|
1539
1597
|
|
|
@@ -1546,7 +1604,7 @@ I.switchTo(); // switch back to main page
|
|
|
1546
1604
|
|
|
1547
1605
|
#### Parameters
|
|
1548
1606
|
|
|
1549
|
-
- `locator` **([string][
|
|
1607
|
+
- `locator` **([string][9]? | [object][7])** (optional, `null` by default) element located by CSS|XPath|strict locator.
|
|
1550
1608
|
|
|
1551
1609
|
### switchToNextTab
|
|
1552
1610
|
|
|
@@ -1559,7 +1617,7 @@ I.switchToNextTab(2);
|
|
|
1559
1617
|
|
|
1560
1618
|
#### Parameters
|
|
1561
1619
|
|
|
1562
|
-
- `num` **[number][
|
|
1620
|
+
- `num` **[number][10]**
|
|
1563
1621
|
|
|
1564
1622
|
### switchToPreviousTab
|
|
1565
1623
|
|
|
@@ -1572,13 +1630,13 @@ I.switchToPreviousTab(2);
|
|
|
1572
1630
|
|
|
1573
1631
|
#### Parameters
|
|
1574
1632
|
|
|
1575
|
-
- `num` **[number][
|
|
1633
|
+
- `num` **[number][10]**
|
|
1576
1634
|
|
|
1577
1635
|
### type
|
|
1578
1636
|
|
|
1579
1637
|
Types out the given text into an active field.
|
|
1580
1638
|
To slow down typing use a second parameter, to set interval between key presses.
|
|
1581
|
-
_Note:_ Should be used when [`fillField`][
|
|
1639
|
+
_Note:_ Should be used when [`fillField`][18] is not an option.
|
|
1582
1640
|
|
|
1583
1641
|
```js
|
|
1584
1642
|
// passing in a string
|
|
@@ -1594,8 +1652,8 @@ I.type(['T', 'E', 'X', 'T']);
|
|
|
1594
1652
|
#### Parameters
|
|
1595
1653
|
|
|
1596
1654
|
- `keys`
|
|
1597
|
-
- `delay` **[number][
|
|
1598
|
-
- `key` **([string][
|
|
1655
|
+
- `delay` **[number][10]?** (optional) delay in ms between key presses
|
|
1656
|
+
- `key` **([string][9] | [Array][13]<[string][9]>)** or array of keys to type.
|
|
1599
1657
|
|
|
1600
1658
|
### uncheckOption
|
|
1601
1659
|
|
|
@@ -1612,8 +1670,8 @@ I.uncheckOption('agree', '//form');
|
|
|
1612
1670
|
|
|
1613
1671
|
#### Parameters
|
|
1614
1672
|
|
|
1615
|
-
- `field` **([string][
|
|
1616
|
-
- `context` **([string][
|
|
1673
|
+
- `field` **([string][9] | [object][7])** checkbox located by label | name | CSS | XPath | strict locator.
|
|
1674
|
+
- `context` **([string][9]? | [object][7])** (optional, `null` by default) element located by CSS | XPath | strict locator.
|
|
1617
1675
|
|
|
1618
1676
|
### usePlaywrightTo
|
|
1619
1677
|
|
|
@@ -1622,7 +1680,7 @@ Use Playwright API inside a test.
|
|
|
1622
1680
|
First argument is a description of an action.
|
|
1623
1681
|
Second argument is async function that gets this helper as parameter.
|
|
1624
1682
|
|
|
1625
|
-
{ [`page`][
|
|
1683
|
+
{ [`page`][22], [`context`][23] [`browser`][24] } objects from Playwright API are available.
|
|
1626
1684
|
|
|
1627
1685
|
```js
|
|
1628
1686
|
I.usePlaywrightTo('emulate offline mode', async ({ context }) {
|
|
@@ -1632,8 +1690,8 @@ I.usePlaywrightTo('emulate offline mode', async ({ context }) {
|
|
|
1632
1690
|
|
|
1633
1691
|
#### Parameters
|
|
1634
1692
|
|
|
1635
|
-
- `description` **[string][
|
|
1636
|
-
- `fn` **[function][
|
|
1693
|
+
- `description` **[string][9]** used to show in logs.
|
|
1694
|
+
- `fn` **[function][11]** async functuion that executed with Playwright helper as argument
|
|
1637
1695
|
|
|
1638
1696
|
### wait
|
|
1639
1697
|
|
|
@@ -1645,7 +1703,7 @@ I.wait(2); // wait 2 secs
|
|
|
1645
1703
|
|
|
1646
1704
|
#### Parameters
|
|
1647
1705
|
|
|
1648
|
-
- `sec` **[number][
|
|
1706
|
+
- `sec` **[number][10]** number of second to wait.
|
|
1649
1707
|
|
|
1650
1708
|
### waitForClickable
|
|
1651
1709
|
|
|
@@ -1659,9 +1717,9 @@ I.waitForClickable('.btn.continue', 5); // wait for 5 secs
|
|
|
1659
1717
|
|
|
1660
1718
|
#### Parameters
|
|
1661
1719
|
|
|
1662
|
-
- `locator` **([string][
|
|
1720
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1663
1721
|
- `waitTimeout`
|
|
1664
|
-
- `sec` **[number][
|
|
1722
|
+
- `sec` **[number][10]?** (optional, `1` by default) time in seconds to wait
|
|
1665
1723
|
|
|
1666
1724
|
### waitForDetached
|
|
1667
1725
|
|
|
@@ -1674,8 +1732,8 @@ I.waitForDetached('#popup');
|
|
|
1674
1732
|
|
|
1675
1733
|
#### Parameters
|
|
1676
1734
|
|
|
1677
|
-
- `locator` **([string][
|
|
1678
|
-
- `sec` **[number][
|
|
1735
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1736
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1679
1737
|
|
|
1680
1738
|
### waitForElement
|
|
1681
1739
|
|
|
@@ -1689,8 +1747,8 @@ I.waitForElement('.btn.continue', 5); // wait for 5 secs
|
|
|
1689
1747
|
|
|
1690
1748
|
#### Parameters
|
|
1691
1749
|
|
|
1692
|
-
- `locator` **([string][
|
|
1693
|
-
- `sec` **[number][
|
|
1750
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1751
|
+
- `sec` **[number][10]?** (optional, `1` by default) time in seconds to wait
|
|
1694
1752
|
|
|
1695
1753
|
### waitForEnabled
|
|
1696
1754
|
|
|
@@ -1699,8 +1757,8 @@ Element can be located by CSS or XPath.
|
|
|
1699
1757
|
|
|
1700
1758
|
#### Parameters
|
|
1701
1759
|
|
|
1702
|
-
- `locator` **([string][
|
|
1703
|
-
- `sec` **[number][
|
|
1760
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1761
|
+
- `sec` **[number][10]** (optional) time in seconds to wait, 1 by default.
|
|
1704
1762
|
|
|
1705
1763
|
### waitForFunction
|
|
1706
1764
|
|
|
@@ -1719,9 +1777,9 @@ I.waitForFunction((count) => window.requests == count, [3], 5) // pass args and
|
|
|
1719
1777
|
|
|
1720
1778
|
#### Parameters
|
|
1721
1779
|
|
|
1722
|
-
- `fn` **([string][
|
|
1723
|
-
- `argsOrSec` **([Array][
|
|
1724
|
-
- `sec` **[number][
|
|
1780
|
+
- `fn` **([string][9] | [function][11])** to be executed in browser context.
|
|
1781
|
+
- `argsOrSec` **([Array][13]<any> | [number][10])?** (optional, `1` by default) arguments for function or seconds.
|
|
1782
|
+
- `sec` **[number][10]?** (optional, `1` by default) time in seconds to wait
|
|
1725
1783
|
|
|
1726
1784
|
### waitForInvisible
|
|
1727
1785
|
|
|
@@ -1734,14 +1792,14 @@ I.waitForInvisible('#popup');
|
|
|
1734
1792
|
|
|
1735
1793
|
#### Parameters
|
|
1736
1794
|
|
|
1737
|
-
- `locator` **([string][
|
|
1738
|
-
- `sec` **[number][
|
|
1795
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1796
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1739
1797
|
|
|
1740
1798
|
### waitForNavigation
|
|
1741
1799
|
|
|
1742
1800
|
Waits for navigation to finish. By default takes configured `waitForNavigation` option.
|
|
1743
1801
|
|
|
1744
|
-
See [Playwright's reference][
|
|
1802
|
+
See [Playwright's reference][25]
|
|
1745
1803
|
|
|
1746
1804
|
#### Parameters
|
|
1747
1805
|
|
|
@@ -1758,8 +1816,8 @@ I.waitForRequest(request => request.url() === 'http://example.com' && request.me
|
|
|
1758
1816
|
|
|
1759
1817
|
#### Parameters
|
|
1760
1818
|
|
|
1761
|
-
- `urlOrPredicate` **([string][
|
|
1762
|
-
- `sec` **[number][
|
|
1819
|
+
- `urlOrPredicate` **([string][9] | [function][11])**
|
|
1820
|
+
- `sec` **[number][10]?** seconds to wait
|
|
1763
1821
|
|
|
1764
1822
|
### waitForResponse
|
|
1765
1823
|
|
|
@@ -1772,8 +1830,8 @@ I.waitForResponse(request => request.url() === 'http://example.com' && request.m
|
|
|
1772
1830
|
|
|
1773
1831
|
#### Parameters
|
|
1774
1832
|
|
|
1775
|
-
- `urlOrPredicate` **([string][
|
|
1776
|
-
- `sec` **[number][
|
|
1833
|
+
- `urlOrPredicate` **([string][9] | [function][11])**
|
|
1834
|
+
- `sec` **[number][10]?** number of seconds to wait
|
|
1777
1835
|
|
|
1778
1836
|
### waitForText
|
|
1779
1837
|
|
|
@@ -1788,9 +1846,9 @@ I.waitForText('Thank you, form has been submitted', 5, '#modal');
|
|
|
1788
1846
|
|
|
1789
1847
|
#### Parameters
|
|
1790
1848
|
|
|
1791
|
-
- `text` **[string][
|
|
1792
|
-
- `sec` **[number][
|
|
1793
|
-
- `context` **([string][
|
|
1849
|
+
- `text` **[string][9]** to wait for.
|
|
1850
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1851
|
+
- `context` **([string][9] | [object][7])?** (optional) element located by CSS|XPath|strict locator.
|
|
1794
1852
|
|
|
1795
1853
|
### waitForValue
|
|
1796
1854
|
|
|
@@ -1802,9 +1860,9 @@ I.waitForValue('//input', "GoodValue");
|
|
|
1802
1860
|
|
|
1803
1861
|
#### Parameters
|
|
1804
1862
|
|
|
1805
|
-
- `field` **([string][
|
|
1806
|
-
- `value` **[string][
|
|
1807
|
-
- `sec` **[number][
|
|
1863
|
+
- `field` **([string][9] | [object][7])** input field.
|
|
1864
|
+
- `value` **[string][9]** expected value.
|
|
1865
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1808
1866
|
|
|
1809
1867
|
### waitForVisible
|
|
1810
1868
|
|
|
@@ -1817,8 +1875,8 @@ I.waitForVisible('#popup');
|
|
|
1817
1875
|
|
|
1818
1876
|
#### Parameters
|
|
1819
1877
|
|
|
1820
|
-
- `locator` **([string][
|
|
1821
|
-
- `sec` **[number][
|
|
1878
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1879
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to waitThis method accepts [React selectors][26].
|
|
1822
1880
|
|
|
1823
1881
|
### waitInUrl
|
|
1824
1882
|
|
|
@@ -1830,8 +1888,8 @@ I.waitInUrl('/info', 2);
|
|
|
1830
1888
|
|
|
1831
1889
|
#### Parameters
|
|
1832
1890
|
|
|
1833
|
-
- `urlPart` **[string][
|
|
1834
|
-
- `sec` **[number][
|
|
1891
|
+
- `urlPart` **[string][9]** value to check.
|
|
1892
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1835
1893
|
|
|
1836
1894
|
### waitNumberOfVisibleElements
|
|
1837
1895
|
|
|
@@ -1843,9 +1901,9 @@ I.waitNumberOfVisibleElements('a', 3);
|
|
|
1843
1901
|
|
|
1844
1902
|
#### Parameters
|
|
1845
1903
|
|
|
1846
|
-
- `locator` **([string][
|
|
1847
|
-
- `num` **[number][
|
|
1848
|
-
- `sec` **[number][
|
|
1904
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1905
|
+
- `num` **[number][10]** number of elements.
|
|
1906
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1849
1907
|
|
|
1850
1908
|
### waitToHide
|
|
1851
1909
|
|
|
@@ -1858,8 +1916,8 @@ I.waitToHide('#popup');
|
|
|
1858
1916
|
|
|
1859
1917
|
#### Parameters
|
|
1860
1918
|
|
|
1861
|
-
- `locator` **([string][
|
|
1862
|
-
- `sec` **[number][
|
|
1919
|
+
- `locator` **([string][9] | [object][7])** element located by CSS|XPath|strict locator.
|
|
1920
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1863
1921
|
|
|
1864
1922
|
### waitUntil
|
|
1865
1923
|
|
|
@@ -1872,10 +1930,10 @@ I.waitUntil(() => window.requests == 0, 5);
|
|
|
1872
1930
|
|
|
1873
1931
|
#### Parameters
|
|
1874
1932
|
|
|
1875
|
-
- `fn` **([function][
|
|
1876
|
-
- `sec` **[number][
|
|
1877
|
-
- `timeoutMsg` **[string][
|
|
1878
|
-
- `interval` **[number][
|
|
1933
|
+
- `fn` **([function][11] | [string][9])** function which is executed in browser context.
|
|
1934
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1935
|
+
- `timeoutMsg` **[string][9]** message to show in case of timeout fail.
|
|
1936
|
+
- `interval` **[number][10]?**
|
|
1879
1937
|
|
|
1880
1938
|
### waitUrlEquals
|
|
1881
1939
|
|
|
@@ -1888,49 +1946,57 @@ I.waitUrlEquals('http://127.0.0.1:8000/info');
|
|
|
1888
1946
|
|
|
1889
1947
|
#### Parameters
|
|
1890
1948
|
|
|
1891
|
-
- `urlPart` **[string][
|
|
1892
|
-
- `sec` **[number][
|
|
1949
|
+
- `urlPart` **[string][9]** value to check.
|
|
1950
|
+
- `sec` **[number][10]** (optional, `1` by default) time in seconds to wait
|
|
1893
1951
|
|
|
1894
1952
|
[1]: https://github.com/microsoft/playwright
|
|
1895
1953
|
|
|
1896
|
-
[2]: https://
|
|
1954
|
+
[2]: https://playwright.dev/docs/trace-viewer
|
|
1955
|
+
|
|
1956
|
+
[3]: https://github.com/microsoft/playwright/blob/master/docs/api.md#pagewaitfornavigationoptions
|
|
1957
|
+
|
|
1958
|
+
[4]: https://playwright.dev/docs/next/api/class-browser#browser-new-context
|
|
1959
|
+
|
|
1960
|
+
[5]: https://playwright.dev/docs/api/class-browsertype#browsertypeconnectparams
|
|
1961
|
+
|
|
1962
|
+
[6]: https://github.com/microsoft/playwright/blob/v0.11.0/docs/api.md#working-with-chrome-extensions
|
|
1897
1963
|
|
|
1898
|
-
[
|
|
1964
|
+
[7]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
|
|
1899
1965
|
|
|
1900
|
-
[
|
|
1966
|
+
[8]: http://jster.net/category/windows-modals-popups
|
|
1901
1967
|
|
|
1902
|
-
[
|
|
1968
|
+
[9]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
|
|
1903
1969
|
|
|
1904
|
-
[
|
|
1970
|
+
[10]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number
|
|
1905
1971
|
|
|
1906
|
-
[
|
|
1972
|
+
[11]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function
|
|
1907
1973
|
|
|
1908
|
-
[
|
|
1974
|
+
[12]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise
|
|
1909
1975
|
|
|
1910
|
-
[
|
|
1976
|
+
[13]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array
|
|
1911
1977
|
|
|
1912
|
-
[
|
|
1978
|
+
[14]: https://codecept.io/helpers/FileSystem
|
|
1913
1979
|
|
|
1914
|
-
[
|
|
1980
|
+
[15]: https://playwright.dev/docs/api/class-browsercontext#browser-context-route
|
|
1915
1981
|
|
|
1916
|
-
[
|
|
1982
|
+
[16]: https://playwright.dev/docs/network#handle-requests
|
|
1917
1983
|
|
|
1918
|
-
[
|
|
1984
|
+
[17]: https://github.com/microsoft/playwright/blob/master/docs/api.md#browsernewpageoptions
|
|
1919
1985
|
|
|
1920
|
-
[
|
|
1986
|
+
[18]: #fillfield
|
|
1921
1987
|
|
|
1922
|
-
[
|
|
1988
|
+
[19]: https://github.com/GoogleChrome/puppeteer/issues/1313
|
|
1923
1989
|
|
|
1924
|
-
[
|
|
1990
|
+
[20]: #click
|
|
1925
1991
|
|
|
1926
|
-
[
|
|
1992
|
+
[21]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean
|
|
1927
1993
|
|
|
1928
|
-
[
|
|
1994
|
+
[22]: https://github.com/microsoft/playwright/blob/master/docs/api.md#class-page
|
|
1929
1995
|
|
|
1930
|
-
[
|
|
1996
|
+
[23]: https://github.com/microsoft/playwright/blob/master/docs/api.md#class-context
|
|
1931
1997
|
|
|
1932
|
-
[
|
|
1998
|
+
[24]: https://github.com/microsoft/playwright/blob/master/docs/api.md#class-browser
|
|
1933
1999
|
|
|
1934
|
-
[
|
|
2000
|
+
[25]: https://playwright.dev/docs/api/class-page?_highlight=waitfornavi#pagewaitfornavigationoptions
|
|
1935
2001
|
|
|
1936
|
-
[
|
|
2002
|
+
[26]: https://codecept.io/react
|