codeceptjs 3.4.1 → 3.5.1-2.beta.7
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/README.md +31 -30
- package/bin/codecept.js +1 -1
- package/lib/actor.js +6 -3
- package/lib/ai.js +180 -0
- package/lib/cli.js +13 -3
- package/lib/codecept.js +8 -0
- package/lib/colorUtils.js +10 -0
- package/lib/command/definitions.js +2 -7
- package/lib/command/dryRun.js +11 -2
- package/lib/command/generate.js +46 -3
- package/lib/command/info.js +24 -0
- package/lib/command/init.js +64 -6
- package/lib/command/interactive.js +15 -1
- package/lib/command/run-multiple/collection.js +17 -5
- package/lib/command/run-multiple.js +4 -2
- package/lib/command/run-workers.js +68 -5
- package/lib/command/run.js +7 -0
- package/lib/command/workers/runTests.js +39 -0
- package/lib/container.js +13 -3
- package/lib/data/context.js +14 -6
- package/lib/event.js +4 -0
- package/lib/helper/ApiDataFactory.js +2 -1
- package/lib/helper/Appium.js +116 -29
- package/lib/helper/Expect.js +422 -0
- package/lib/helper/FileSystem.js +1 -1
- package/lib/helper/GraphQL.js +25 -0
- package/lib/helper/JSONResponse.js +4 -4
- package/lib/helper/Nightmare.js +10 -5
- package/lib/helper/OpenAI.js +126 -0
- package/lib/helper/Playwright.js +1298 -229
- package/lib/helper/Protractor.js +12 -7
- package/lib/helper/Puppeteer.js +204 -64
- package/lib/helper/REST.js +15 -5
- package/lib/helper/TestCafe.js +45 -10
- package/lib/helper/WebDriver.js +252 -83
- package/lib/helper/errors/ElementNotFound.js +2 -1
- package/lib/helper/extras/PlaywrightReactVueLocator.js +38 -0
- package/lib/helper/scripts/blurElement.js +17 -0
- package/lib/helper/scripts/focusElement.js +17 -0
- package/lib/helper/scripts/highlightElement.js +20 -0
- package/lib/html.js +258 -0
- package/lib/interfaces/bdd.js +1 -1
- package/lib/interfaces/gherkin.js +37 -3
- package/lib/interfaces/scenarioConfig.js +1 -0
- package/lib/listener/retry.js +2 -1
- package/lib/locator.js +17 -4
- package/lib/mochaFactory.js +2 -1
- package/lib/output.js +1 -1
- package/lib/pause.js +78 -19
- package/lib/plugin/autoLogin.js +45 -10
- package/lib/plugin/debugErrors.js +67 -0
- package/lib/plugin/fakerTransform.js +4 -6
- package/lib/plugin/heal.js +209 -0
- package/lib/plugin/retryFailedStep.js +10 -1
- package/lib/plugin/retryTo.js +2 -4
- package/lib/plugin/screenshotOnFail.js +11 -2
- package/lib/plugin/selenoid.js +6 -1
- package/lib/plugin/standardActingHelpers.js +0 -2
- package/lib/plugin/stepByStepReport.js +2 -2
- package/lib/plugin/tryTo.js +5 -7
- package/lib/plugin/wdio.js +0 -1
- package/lib/recorder.js +22 -11
- package/lib/secret.js +5 -4
- package/lib/session.js +1 -1
- package/lib/step.js +36 -12
- package/lib/ui.js +5 -3
- package/lib/utils.js +22 -1
- package/lib/workers.js +83 -10
- package/package.json +117 -95
- package/translations/de-DE.js +5 -0
- package/translations/fr-FR.js +14 -1
- package/translations/it-IT.js +1 -0
- package/translations/ja-JP.js +14 -9
- package/translations/pl-PL.js +5 -0
- package/translations/pt-BR.js +1 -0
- package/translations/ru-RU.js +1 -0
- package/translations/zh-CN.js +5 -0
- package/translations/zh-TW.js +5 -0
- package/typings/index.d.ts +51 -15
- package/typings/promiseBasedTypes.d.ts +864 -802
- package/typings/types.d.ts +1339 -744
- package/CHANGELOG.md +0 -2427
- package/docs/advanced.md +0 -351
- package/docs/api.md +0 -323
- package/docs/basics.md +0 -980
- package/docs/bdd.md +0 -535
- package/docs/best.md +0 -237
- package/docs/books.md +0 -37
- package/docs/bootstrap.md +0 -135
- package/docs/build/ApiDataFactory.js +0 -409
- package/docs/build/Appium.js +0 -1938
- package/docs/build/FileSystem.js +0 -228
- package/docs/build/GraphQL.js +0 -204
- package/docs/build/GraphQLDataFactory.js +0 -309
- package/docs/build/JSONResponse.js +0 -338
- package/docs/build/Mochawesome.js +0 -71
- package/docs/build/Nightmare.js +0 -2145
- package/docs/build/Playwright.js +0 -3986
- package/docs/build/Polly.js +0 -42
- package/docs/build/Protractor.js +0 -2699
- package/docs/build/Puppeteer.js +0 -3710
- package/docs/build/REST.js +0 -334
- package/docs/build/SeleniumWebdriver.js +0 -76
- package/docs/build/TestCafe.js +0 -2057
- package/docs/build/WebDriver.js +0 -4017
- package/docs/changelog.md +0 -2436
- package/docs/commands.md +0 -254
- package/docs/community-helpers.md +0 -58
- package/docs/configuration.md +0 -157
- package/docs/continuous-integration.md +0 -22
- package/docs/custom-helpers.md +0 -306
- package/docs/data.md +0 -375
- package/docs/detox.md +0 -235
- package/docs/docker.md +0 -137
- package/docs/email.md +0 -183
- package/docs/examples.md +0 -149
- package/docs/helpers/ApiDataFactory.md +0 -266
- package/docs/helpers/Appium.md +0 -1312
- package/docs/helpers/Detox.md +0 -586
- package/docs/helpers/FileSystem.md +0 -152
- package/docs/helpers/GraphQL.md +0 -130
- package/docs/helpers/GraphQLDataFactory.md +0 -226
- package/docs/helpers/JSONResponse.md +0 -254
- package/docs/helpers/Mochawesome.md +0 -8
- package/docs/helpers/MockRequest.md +0 -377
- package/docs/helpers/Nightmare.md +0 -1256
- package/docs/helpers/Playwright.md +0 -2208
- package/docs/helpers/Polly.md +0 -44
- package/docs/helpers/Puppeteer-firefox.md +0 -86
- package/docs/helpers/Puppeteer.md +0 -2141
- package/docs/helpers/REST.md +0 -217
- package/docs/helpers/TestCafe.md +0 -1222
- package/docs/helpers/WebDriver.md +0 -2319
- package/docs/hooks.md +0 -340
- package/docs/index.md +0 -111
- package/docs/installation.md +0 -75
- package/docs/internal-api.md +0 -265
- package/docs/locators.md +0 -331
- package/docs/mobile-react-native-locators.md +0 -67
- package/docs/mobile.md +0 -297
- package/docs/nightmare.md +0 -223
- package/docs/pageobjects.md +0 -291
- package/docs/parallel.md +0 -232
- package/docs/playwright.md +0 -609
- package/docs/plugins.md +0 -1171
- package/docs/puppeteer.md +0 -316
- package/docs/quickstart.md +0 -163
- package/docs/react.md +0 -69
- package/docs/reports.md +0 -392
- package/docs/secrets.md +0 -30
- package/docs/shadow.md +0 -68
- package/docs/shared/keys.mustache +0 -31
- package/docs/shared/react.mustache +0 -1
- package/docs/testcafe.md +0 -174
- package/docs/translation.md +0 -247
- package/docs/tutorial.md +0 -271
- package/docs/typescript.md +0 -180
- package/docs/ui.md +0 -59
- package/docs/videos.md +0 -28
- package/docs/visual.md +0 -202
- package/docs/vue.md +0 -121
- package/docs/webapi/amOnPage.mustache +0 -11
- package/docs/webapi/appendField.mustache +0 -9
- package/docs/webapi/attachFile.mustache +0 -12
- package/docs/webapi/checkOption.mustache +0 -13
- package/docs/webapi/clearCookie.mustache +0 -10
- package/docs/webapi/clearField.mustache +0 -9
- package/docs/webapi/click.mustache +0 -25
- package/docs/webapi/clickLink.mustache +0 -8
- package/docs/webapi/closeCurrentTab.mustache +0 -7
- package/docs/webapi/closeOtherTabs.mustache +0 -8
- package/docs/webapi/dontSee.mustache +0 -11
- package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/dontSeeCookie.mustache +0 -8
- package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
- package/docs/webapi/dontSeeElement.mustache +0 -8
- package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
- package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
- package/docs/webapi/dontSeeInField.mustache +0 -11
- package/docs/webapi/dontSeeInSource.mustache +0 -8
- package/docs/webapi/dontSeeInTitle.mustache +0 -8
- package/docs/webapi/doubleClick.mustache +0 -13
- package/docs/webapi/downloadFile.mustache +0 -12
- package/docs/webapi/dragAndDrop.mustache +0 -9
- package/docs/webapi/dragSlider.mustache +0 -11
- package/docs/webapi/executeAsyncScript.mustache +0 -24
- package/docs/webapi/executeScript.mustache +0 -26
- package/docs/webapi/fillField.mustache +0 -16
- package/docs/webapi/forceClick.mustache +0 -28
- package/docs/webapi/forceRightClick.mustache +0 -18
- package/docs/webapi/grabAllWindowHandles.mustache +0 -7
- package/docs/webapi/grabAttributeFrom.mustache +0 -10
- package/docs/webapi/grabAttributeFromAll.mustache +0 -9
- package/docs/webapi/grabBrowserLogs.mustache +0 -9
- package/docs/webapi/grabCookie.mustache +0 -11
- package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
- package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
- package/docs/webapi/grabCurrentUrl.mustache +0 -9
- package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
- package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
- package/docs/webapi/grabElementBoundingRect.mustache +0 -20
- package/docs/webapi/grabGeoLocation.mustache +0 -8
- package/docs/webapi/grabHTMLFrom.mustache +0 -10
- package/docs/webapi/grabHTMLFromAll.mustache +0 -9
- package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
- package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
- package/docs/webapi/grabPageScrollPosition.mustache +0 -8
- package/docs/webapi/grabPopupText.mustache +0 -5
- package/docs/webapi/grabSource.mustache +0 -8
- package/docs/webapi/grabTextFrom.mustache +0 -10
- package/docs/webapi/grabTextFromAll.mustache +0 -9
- package/docs/webapi/grabTitle.mustache +0 -8
- package/docs/webapi/grabValueFrom.mustache +0 -9
- package/docs/webapi/grabValueFromAll.mustache +0 -8
- package/docs/webapi/moveCursorTo.mustache +0 -12
- package/docs/webapi/openNewTab.mustache +0 -7
- package/docs/webapi/pressKey.mustache +0 -12
- package/docs/webapi/pressKeyDown.mustache +0 -12
- package/docs/webapi/pressKeyUp.mustache +0 -12
- package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
- package/docs/webapi/refreshPage.mustache +0 -6
- package/docs/webapi/resizeWindow.mustache +0 -6
- package/docs/webapi/rightClick.mustache +0 -14
- package/docs/webapi/saveElementScreenshot.mustache +0 -10
- package/docs/webapi/saveScreenshot.mustache +0 -12
- package/docs/webapi/say.mustache +0 -10
- package/docs/webapi/scrollIntoView.mustache +0 -11
- package/docs/webapi/scrollPageToBottom.mustache +0 -6
- package/docs/webapi/scrollPageToTop.mustache +0 -6
- package/docs/webapi/scrollTo.mustache +0 -12
- package/docs/webapi/see.mustache +0 -11
- package/docs/webapi/seeAttributesOnElements.mustache +0 -9
- package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/seeCookie.mustache +0 -8
- package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
- package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
- package/docs/webapi/seeElement.mustache +0 -8
- package/docs/webapi/seeElementInDOM.mustache +0 -8
- package/docs/webapi/seeInCurrentUrl.mustache +0 -8
- package/docs/webapi/seeInField.mustache +0 -12
- package/docs/webapi/seeInPopup.mustache +0 -8
- package/docs/webapi/seeInSource.mustache +0 -7
- package/docs/webapi/seeInTitle.mustache +0 -8
- package/docs/webapi/seeNumberOfElements.mustache +0 -11
- package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/seeTextEquals.mustache +0 -9
- package/docs/webapi/seeTitleEquals.mustache +0 -8
- package/docs/webapi/selectOption.mustache +0 -21
- package/docs/webapi/setCookie.mustache +0 -16
- package/docs/webapi/setGeoLocation.mustache +0 -12
- package/docs/webapi/switchTo.mustache +0 -9
- package/docs/webapi/switchToNextTab.mustache +0 -10
- package/docs/webapi/switchToPreviousTab.mustache +0 -10
- package/docs/webapi/type.mustache +0 -18
- package/docs/webapi/uncheckOption.mustache +0 -13
- package/docs/webapi/wait.mustache +0 -8
- package/docs/webapi/waitForClickable.mustache +0 -11
- package/docs/webapi/waitForDetached.mustache +0 -10
- package/docs/webapi/waitForElement.mustache +0 -11
- package/docs/webapi/waitForEnabled.mustache +0 -6
- package/docs/webapi/waitForFunction.mustache +0 -17
- package/docs/webapi/waitForInvisible.mustache +0 -10
- package/docs/webapi/waitForText.mustache +0 -13
- package/docs/webapi/waitForValue.mustache +0 -10
- package/docs/webapi/waitForVisible.mustache +0 -10
- package/docs/webapi/waitInUrl.mustache +0 -9
- package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/waitToHide.mustache +0 -10
- package/docs/webapi/waitUrlEquals.mustache +0 -10
- package/docs/webdriver.md +0 -657
- package/docs/wiki/Books-&-Posts.md +0 -27
- package/docs/wiki/Community-Helpers-&-Plugins.md +0 -49
- package/docs/wiki/Converting-Playwright-to-Istanbul-Coverage.md +0 -29
- package/docs/wiki/Examples.md +0 -139
- package/docs/wiki/Google-Summer-of-Code-(GSoC)-2020.md +0 -68
- package/docs/wiki/Home.md +0 -16
- package/docs/wiki/Release-Process.md +0 -24
- package/docs/wiki/Roadmap.md +0 -23
- package/docs/wiki/Tests.md +0 -1393
- package/docs/wiki/Upgrading-to-CodeceptJS-3.md +0 -153
- package/docs/wiki/Videos.md +0 -19
package/docs/ui.md
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: CodeceptUI
|
|
3
|
-
permalink: /ui
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<img src="/img/codeceptui.png" alt="CodeceptUI" style="width: 100%; border-radius: 5px; box-shadow: 0px 5px 10px rgba(0,0,0,0.1)" />
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
## CodeceptUI
|
|
11
|
-
|
|
12
|
-
CodeceptJS has an interactive, graphical test runner. We call it CodeceptUI. It works in your browser and helps you to manage your tests.
|
|
13
|
-
|
|
14
|
-
CodeceptUI can be used for
|
|
15
|
-
|
|
16
|
-
* running tests by groups or single
|
|
17
|
-
* get test reports
|
|
18
|
-
* review tests
|
|
19
|
-
* edit tests and page objects
|
|
20
|
-
* write new tests
|
|
21
|
-
* reuse one browser session accross multiple test runs
|
|
22
|
-
* easily switch to headless/headful mode
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-

|
|
26
|
-
|
|
27
|
-
## Installation
|
|
28
|
-
|
|
29
|
-
CodeceptUI is already installed with `create-codeceptjs` command but you can install it manually via:
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
npm i @codeceptjs/ui --save
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Usage
|
|
36
|
-
|
|
37
|
-
To start using CodeceptUI you need to have CodeceptJS project with a few tests written.
|
|
38
|
-
If CodeceptUI was installed by `create-codecept` command it can be started with:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
npm run codeceptjs:ui
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
CodeceptUI can be started in two modes:
|
|
45
|
-
|
|
46
|
-
* **Application** mode - starts Electron application in a window. Designed for desktop systems.
|
|
47
|
-
* **Server** mode - starts a webserver. Deigned for CI systems.
|
|
48
|
-
|
|
49
|
-
To start CodeceptUI in application mode:
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
npx codecept-ui --app
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
To start CodeceptUI in server mode:
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
npx codecept-ui
|
|
59
|
-
```
|
package/docs/videos.md
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
permalink: /videos
|
|
3
|
-
layout: Section
|
|
4
|
-
sidebar: false
|
|
5
|
-
title: Videos
|
|
6
|
-
editLink: false
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
> Add your own videos to our [Wiki Page](https://github.com/codeceptjs/CodeceptJS/wiki/Videos)
|
|
10
|
-
[](https://www.youtube.com/watch?v=BRMWstiOTks)
|
|
11
|
-
|
|
12
|
-
## [An Introduction, Getting started and working with CodeceptJS & Puppeteer (EAWeekend)](https://www.youtube.com/watch?v=BRMWstiOTks)
|
|
13
|
-
|
|
14
|
-
## [CodeceptJS Official YouTube Channel](https://www.youtube.com/channel/UCEs4030bmtonyDhTHEXa_2g)
|
|
15
|
-
|
|
16
|
-
## [Introductory Videos](https://www.youtube.com/watch?v=FPFG1rBNJ64&list=PLcFXthgti9Lt4SjSvL1ALDg6dOeTC0TvT)
|
|
17
|
-
|
|
18
|
-
Free educational videos provided by our community member **[@ontytoom](http://github.com/ontytoom)**.
|
|
19
|
-
|
|
20
|
-
1. [Installation](https://www.youtube.com/watch?v=FPFG1rBNJ64)
|
|
21
|
-
1. [Creating a Test](https://www.youtube.com/watch?v=mdQZjL3h9d0)
|
|
22
|
-
1. [Using Page Objects](https://www.youtube.com/watch?v=s677_6VctjQ)
|
|
23
|
-
|
|
24
|
-
## [Practical E2E Testing with CodeceptJS](https://www.udemy.com/practical-e2e-testing-with-codeceptjs/)
|
|
25
|
-
|
|
26
|
-
Udemy course by Luke Beilharz
|
|
27
|
-
|
|
28
|
-
|
package/docs/visual.md
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
permalink: /visual
|
|
3
|
-
title: Visual Testing
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Visual Testing
|
|
7
|
-
|
|
8
|
-
How does one test if the UI being rendered appears correctly to the users or how to test if each UI element appears in the right position and size? The traditional way to test the UI of the application has always been manually, which is time consuming.
|
|
9
|
-
|
|
10
|
-
Visual testing with help of CodeceptJS will help in improving such use cases for the QA folks.
|
|
11
|
-
|
|
12
|
-
By default CodeceptJS uses [WebDriver](/helpers/WebDriver/) helper and **Selenium** to automate browser. It is also capable of taking screenshots of the application and this could be used for visual testing.
|
|
13
|
-
|
|
14
|
-
Currently there are two helpers available for Visual testing with CodeceptJS
|
|
15
|
-
|
|
16
|
-
## Using Resemble helper
|
|
17
|
-
|
|
18
|
-
[Resemble.js](https://github.com/rsmbl/Resemble.js) is a great tool for image comparison and analysis, which can be used with CodeceptJS
|
|
19
|
-
|
|
20
|
-
### Setup
|
|
21
|
-
|
|
22
|
-
To install the package, just run
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
npm install codeceptjs-resemblehelper --save
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Configuring
|
|
29
|
-
|
|
30
|
-
This helper should be added to `codecept.conf.js` config file.
|
|
31
|
-
|
|
32
|
-
Example:
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
{
|
|
36
|
-
"helpers": {
|
|
37
|
-
"ResembleHelper" : {
|
|
38
|
-
"require": "codeceptjs-resemblehelper",
|
|
39
|
-
"screenshotFolder" : "./tests/output/",
|
|
40
|
-
"baseFolder": "./tests/screenshots/base/",
|
|
41
|
-
"diffFolder": "./tests/screenshots/diff/"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
To use the Helper, users must provide the three parameters:
|
|
48
|
-
|
|
49
|
-
* `screenshotFolder` : This will always have the same value as `output` in Codecept configuration, this is the folder where WebDriver saves a screenshot when using `I.saveScreenshot` method
|
|
50
|
-
* `baseFolder`: This is the folder for base images, which will be used with screenshot for comparison
|
|
51
|
-
* `diffFolder`: This will the folder where resemble would try to store the difference image, which can be viewed later.
|
|
52
|
-
|
|
53
|
-
### Usage
|
|
54
|
-
|
|
55
|
-
Details about the helper can be found on the [Github Repo](https://github.com/puneet0191/codeceptjs-resemblehelper)
|
|
56
|
-
|
|
57
|
-
Base Image is compared with the screenshot image and test results are derived based on the `mismatch tolerance` level provided by the user for the comparison
|
|
58
|
-
|
|
59
|
-
### Example
|
|
60
|
-
|
|
61
|
-
Lets consider visual testing for [CodeceptJS Home](https://codecept.io)
|
|
62
|
-
|
|
63
|
-
```js
|
|
64
|
-
Feature('To test screen comparison with resemble Js Example test');
|
|
65
|
-
|
|
66
|
-
Scenario('Compare CodeceptIO Home Page @visual-test', async ({ I }) => {
|
|
67
|
-
I.amOnPage("/");
|
|
68
|
-
I.saveScreenshot("Codecept_IO_Screenshot_Image.png");
|
|
69
|
-
I.seeVisualDiff("Codecept_IO_Screenshot_Image.png", {tolerance: 2, prepareBaseImage: false});
|
|
70
|
-
});
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
In this example, we are setting the expected mismatch tolerance level as `2`
|
|
74
|
-
|
|
75
|
-
`Base Image` (Generated by User)
|
|
76
|
-

|
|
77
|
-
|
|
78
|
-
`Screenshot Image` (Generated by Test)
|
|
79
|
-

|
|
80
|
-
|
|
81
|
-
Clearly the difference in both the images visible to human eye is the section about `Scenario Driven`
|
|
82
|
-
|
|
83
|
-

|
|
84
|
-
|
|
85
|
-
`Diff Image` generated by the helper clearly highlights the section which don't match
|
|
86
|
-
|
|
87
|
-

|
|
88
|
-
|
|
89
|
-
`Failed Test output`
|
|
90
|
-
```
|
|
91
|
-
To test screen comparison with resemble Js Example test --
|
|
92
|
-
Compare CodeceptIO Home Page @visual-test
|
|
93
|
-
I see Visual Diff "Codecept_IO_Screenshot_Image.png", {tolerance: 2, prepareBaseImage: false}
|
|
94
|
-
MisMatch Percentage Calculated is 2.85
|
|
95
|
-
✖ FAILED in 418ms
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-- FAILURES:
|
|
99
|
-
|
|
100
|
-
1) To test screen comparison with resemble Js Example test
|
|
101
|
-
Compare CodeceptIO Home Page @visual-test:
|
|
102
|
-
|
|
103
|
-
MissMatch Percentage 2.85
|
|
104
|
-
+ expected - actual
|
|
105
|
-
|
|
106
|
-
-false
|
|
107
|
-
+true
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
`Codeceptjs-resemblehelper` basically comes with two major functions
|
|
111
|
-
|
|
112
|
-
1) `seeVisualDiff` which can be used to compare two images and calculate the misMatch percentage.
|
|
113
|
-
2) `seeVisualDiffForElement` which can be used to compare elements on the two images and calculate misMatch percentage.
|
|
114
|
-
|
|
115
|
-
## Using Applitools
|
|
116
|
-
|
|
117
|
-
Applitools helps Test Automation engineers, DevOps, and FrontEnd Developers continuously test and validate visually perfect mobile, web, and native apps. Now it can be used with CodeceptJS.
|
|
118
|
-
|
|
119
|
-
### Setup
|
|
120
|
-
|
|
121
|
-
Create an account at [Applitools](https://applitools.com/users/register) and install the npm packages
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
npm i codeceptjs-applitoolshelper --save
|
|
125
|
-
npm i webdriverio@5 --save
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Configuring
|
|
129
|
-
|
|
130
|
-
```js
|
|
131
|
-
...
|
|
132
|
-
helpers: {
|
|
133
|
-
WebDriver: {
|
|
134
|
-
url: 'https://applitools.com/helloworld',
|
|
135
|
-
browser: 'chrome',
|
|
136
|
-
desiredCapabilities: {
|
|
137
|
-
chromeOptions: {
|
|
138
|
-
args: [ '--headless', '--disable-extensions', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage']
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
windowSize: '1920x600',
|
|
142
|
-
smartWait: 5000,
|
|
143
|
-
timeouts: {
|
|
144
|
-
'script': 60000,
|
|
145
|
-
'page load': 10000
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
ApplitoolsHelper: {
|
|
149
|
-
require: 'codeceptjs-applitoolshelper',
|
|
150
|
-
applitoolsKey: 'YOUR_API_KEY'
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
...
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
#### To use this helper you need to provide the following info:
|
|
157
|
-
|
|
158
|
-
- applitoolsKey (Required): You can find your API key under the user menu located at the right hand side of the test manager toolbar
|
|
159
|
-
- windowSize (Optional): the windows size as for instance 1440x700, if not provided, the default 1920x600 will be used. The windowSize will follow this precedence: ApplitoolsHelper, Webdriver.
|
|
160
|
-
- appName (Optional): you can either provide your desired application name, if not provided, the default 'Application Under Test' will be used.
|
|
161
|
-
|
|
162
|
-
### Usage
|
|
163
|
-
|
|
164
|
-
```javascript
|
|
165
|
-
/**
|
|
166
|
-
* @param pageToCheck {string} Name of page you want to check
|
|
167
|
-
*/
|
|
168
|
-
I.eyeCheck(pageToCheck);
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
The first time you run this test a new baseline will be created, and subsequent test runs will be compared to this baseline. If any screenshot mismatch its baseline image in a perceptible way, there will be a `DiffsFoundException` which includes a URL that points to a detailed report where you can see the detected differences and take appropriate actions such as reporting bugs, updating the baseline and more.
|
|
173
|
-
|
|
174
|
-
```js
|
|
175
|
-
-- FAILURES:
|
|
176
|
-
|
|
177
|
-
1) Applitools functionality
|
|
178
|
-
Check home page @test:
|
|
179
|
-
Test 'Applitools functionality' of 'Application Under Test' detected differences!. See details at: https://eyes.applitools.com/app/batches/00000251831777088983/00000251831777088717?accountId=KO-Oh9tXI0e8VF8Ha_GLVA~~
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
> You can find the latest documentation here [Applitools Docs](https://applitools.com/tutorials/webdriverio5.html#run-your-first-test)
|
|
183
|
-
|
|
184
|
-
### Example
|
|
185
|
-
|
|
186
|
-
Lets consider visual testing for [CodeceptJS Home](https://codecept.io).
|
|
187
|
-
You can also find example repo here: https://github.com/PeterNgTr/codeceptjs-applitoolshelper
|
|
188
|
-
|
|
189
|
-
```js
|
|
190
|
-
const { I } = inject();
|
|
191
|
-
|
|
192
|
-
Feature('Applitools functionality');
|
|
193
|
-
|
|
194
|
-
Before(() => {
|
|
195
|
-
I.amOnPage('https://applitools.com/helloworld');
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
Scenario('Check home page @test', async ({ }) => {
|
|
199
|
-
await I.eyeCheck('Homepage');
|
|
200
|
-
});
|
|
201
|
-
```
|
|
202
|
-
|
package/docs/vue.md
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
permalink: /vue
|
|
3
|
-
layout: Section
|
|
4
|
-
sidebar: false
|
|
5
|
-
title: Testing Vue Apps
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# vue-cli-plugin-e2e-codeceptjs
|
|
10
|
-
|
|
11
|
-
*Hey, how about some end 2 end testing for your Vue apps?* 🤔
|
|
12
|
-
|
|
13
|
-
*Let's do it together! Vue, me, [CodeceptJS](https://codecept.io) & [Puppeteer](https://pptr.dev).* 🤗
|
|
14
|
-
|
|
15
|
-
*Browser testing was never that simple. Just see it!* 😍
|
|
16
|
-
|
|
17
|
-
```js
|
|
18
|
-
I.amOnPage('/');
|
|
19
|
-
I.click('My Component Button');
|
|
20
|
-
I.see('My Component');
|
|
21
|
-
I.say('I am happy!');
|
|
22
|
-
// that's right, this is a valid test!
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## How to try it?
|
|
26
|
-
|
|
27
|
-
**Requirements:**
|
|
28
|
-
|
|
29
|
-
* NodeJS >= 8.9
|
|
30
|
-
* NPM / Yarn
|
|
31
|
-
* Vue CLI installed globally
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
npm i vue-cli-plugin-codeceptjs-puppeteer --save-dev
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
This will install CodeceptJS, CodeceptUI & Puppeteer with Chrome browser.
|
|
38
|
-
|
|
39
|
-
To add CodeceptJS to your project invoke installer:
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
vue invoke vue-cli-plugin-codeceptjs-puppeteer
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
> You will be asked about installing a demo component. If you start a fresh project **it is recommended to agree and install a demo component**, so you could see tests passing.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
## Running Tests
|
|
49
|
-
|
|
50
|
-
We added npm scripts:
|
|
51
|
-
|
|
52
|
-
* `test:e2e` - will execute tests with browser opened. If you installed test component, and started a test server, running this command will show you a brower window passed test.
|
|
53
|
-
* Use `--headless` option to run browser headlessly
|
|
54
|
-
* Use `--serve` option to start a dev server before tests
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
Examples:
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
npm run test:e2e
|
|
61
|
-
npm run test:e2e -- --headless
|
|
62
|
-
npm run test:e2e -- --serve
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
> This command is a wrapper for `codecept run --steps`. You can use the [Run arguments and options](/commands#run) here.
|
|
66
|
-
|
|
67
|
-
* `test:e2e:parallel` - will execute tests headlessly in parallel processes (workers). By default runs tests in 2 workers.
|
|
68
|
-
* Use an argument to set number of workers
|
|
69
|
-
* Use `--serve` option to start dev server before running
|
|
70
|
-
|
|
71
|
-
Examples:
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
npm run test:e2e:parallel
|
|
75
|
-
npm run test:e2e:parallel -- 3
|
|
76
|
-
npm run test:e2e:parallel -- 3 --serve
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
> This command is a wrapper for `codecept run-workers 2`. You can use the [Run arguments and options](/commands#run-workers) here.
|
|
80
|
-
|
|
81
|
-
* `test:e2e:open` - this opens interactive web test runner. So you could see, review & run your tests from a browser.
|
|
82
|
-
|
|
83
|
-

|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
npm run test:e2e:open
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Directory Structure
|
|
90
|
-
|
|
91
|
-
Generator has created these files:
|
|
92
|
-
|
|
93
|
-
```js
|
|
94
|
-
codecept.conf.js 👈 codeceptjs config
|
|
95
|
-
jsconfig.json 👈 enabling type definitons
|
|
96
|
-
tests
|
|
97
|
-
├── e2e
|
|
98
|
-
│ ├── app_test.js 👈 demo test, edit it!
|
|
99
|
-
│ ├── output 👈 temp directory for screenshots, reports, etc
|
|
100
|
-
│ └── support
|
|
101
|
-
│ └── steps_file.js 👈 common steps
|
|
102
|
-
└── steps.d.ts 👈 type definitions
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
If you agreed to create a demo component, you will also see `TestMe` component in `src/components` folder.
|
|
106
|
-
|
|
107
|
-
## How to write tests?
|
|
108
|
-
|
|
109
|
-
* Open `tests/e2e/app_js` and see the demo test
|
|
110
|
-
* Execute a test & use interactive pause to see how CodeceptJS works
|
|
111
|
-
* [Learn CodeceptJS basics](/basics)
|
|
112
|
-
* [Learn how to write CodeceptJS tests with Puppeteer](/puppeteer)
|
|
113
|
-
* [See full reference for CodeceptJS Puppeteer Helper](/helpers/Puppeteer)
|
|
114
|
-
* Ask your questions in [Slack](https://bit.ly/chat-codeceptjs) & [Forum](https://codecept.discourse.group/)
|
|
115
|
-
|
|
116
|
-
## Enjoy testing!
|
|
117
|
-
|
|
118
|
-
Testing is simple & fun, enjoy it!
|
|
119
|
-
|
|
120
|
-
With ❤ [CodeceptJS Team](https://codecept.io)
|
|
121
|
-
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
Opens a web page in a browser. Requires relative or absolute url.
|
|
2
|
-
If url starts with `/`, opens a web page of a site defined in `url` config parameter.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.amOnPage('/'); // opens main page of website
|
|
6
|
-
I.amOnPage('https://github.com'); // opens github
|
|
7
|
-
I.amOnPage('/login'); // opens a login page
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
@param {string} url url path or global url.
|
|
11
|
-
@return {void} automatically synchronized promise with recorder #!
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Appends text to a input field or textarea.
|
|
2
|
-
Field is located by name, label, CSS or XPath
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.appendField('#myTextField', 'appended');
|
|
6
|
-
```
|
|
7
|
-
@param {CodeceptJS.LocatorOrString} field located by label|name|CSS|XPath|strict locator
|
|
8
|
-
@param {string} value text value to append.
|
|
9
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
Attaches a file to element located by label, name, CSS or XPath
|
|
2
|
-
Path to file is relative current codecept directory (where codecept.conf.ts or codecept.conf.js is located).
|
|
3
|
-
File will be uploaded to remote system (if tests are running remotely).
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
I.attachFile('Avatar', 'data/avatar.jpg');
|
|
7
|
-
I.attachFile('form input[name=avatar]', 'data/avatar.jpg');
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
@param {CodeceptJS.LocatorOrString} locator field located by label|name|CSS|XPath|strict locator.
|
|
11
|
-
@param {string} pathToFile local file path relative to codecept.conf.ts or codecept.conf.js config file.
|
|
12
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Selects a checkbox or radio button.
|
|
2
|
-
Element is located by label or name or CSS or XPath.
|
|
3
|
-
|
|
4
|
-
The second parameter is a context (CSS or XPath locator) to narrow the search.
|
|
5
|
-
|
|
6
|
-
```js
|
|
7
|
-
I.checkOption('#agree');
|
|
8
|
-
I.checkOption('I Agree to Terms and Conditions');
|
|
9
|
-
I.checkOption('agree', '//form');
|
|
10
|
-
```
|
|
11
|
-
@param {CodeceptJS.LocatorOrString} field checkbox located by label | name | CSS | XPath | strict locator.
|
|
12
|
-
@param {?CodeceptJS.LocatorOrString} [context=null] (optional, `null` by default) element located by CSS | XPath | strict locator.
|
|
13
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Clears a cookie by name,
|
|
2
|
-
if none provided clears all cookies.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.clearCookie();
|
|
6
|
-
I.clearCookie('test');
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {?string} [cookie=null] (optional, `null` by default) cookie name
|
|
10
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Clears a `<textarea>` or text `<input>` element's value.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.clearField('Email');
|
|
5
|
-
I.clearField('user[email]');
|
|
6
|
-
I.clearField('#email');
|
|
7
|
-
```
|
|
8
|
-
@param {LocatorOrString} editable field located by label|name|CSS|XPath|strict locator.
|
|
9
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
Perform a click on a link or a button, given by a locator.
|
|
2
|
-
If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string.
|
|
3
|
-
For buttons, the "value" attribute, "name" attribute, and inner text are searched. For links, the link text is searched.
|
|
4
|
-
For images, the "alt" attribute and inner text of any parent links are searched.
|
|
5
|
-
|
|
6
|
-
The second parameter is a context (CSS or XPath locator) to narrow the search.
|
|
7
|
-
|
|
8
|
-
```js
|
|
9
|
-
// simple link
|
|
10
|
-
I.click('Logout');
|
|
11
|
-
// button of form
|
|
12
|
-
I.click('Submit');
|
|
13
|
-
// CSS button
|
|
14
|
-
I.click('#form input[type=submit]');
|
|
15
|
-
// XPath
|
|
16
|
-
I.click('//form/*[@type=submit]');
|
|
17
|
-
// link in context
|
|
18
|
-
I.click('Logout', '#nav');
|
|
19
|
-
// using strict locator
|
|
20
|
-
I.click({css: 'nav a.login'});
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
@param {CodeceptJS.LocatorOrString} locator clickable link or button located by text, or any element located by CSS|XPath|strict locator.
|
|
24
|
-
@param {?CodeceptJS.LocatorOrString | null} [context=null] (optional, `null` by default) element to search in CSS|XPath|Strict locator.
|
|
25
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Performs a click on a link and waits for navigation before moving on.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.clickLink('Logout', '#nav');
|
|
5
|
-
```
|
|
6
|
-
@param {CodeceptJS.LocatorOrString} locator clickable link or button located by text, or any element located by CSS|XPath|strict locator
|
|
7
|
-
@param {?CodeceptJS.LocatorOrString} [context=null] (optional, `null` by default) element to search in CSS|XPath|Strict locator
|
|
8
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
Opposite to `see`. Checks that a text is not present on a page.
|
|
2
|
-
Use context parameter to narrow down the search.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.dontSee('Login'); // assume we are already logged in.
|
|
6
|
-
I.dontSee('Login', '.nav'); // no login inside .nav element
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {string} text which is not present.
|
|
10
|
-
@param {CodeceptJS.LocatorOrString} [context] (optional) element located by CSS|XPath|strict locator in which to perfrom search.
|
|
11
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Verifies that the specified checkbox is not checked.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.dontSeeCheckboxIsChecked('#agree'); // located by ID
|
|
5
|
-
I.dontSeeCheckboxIsChecked('I agree to terms'); // located by label
|
|
6
|
-
I.dontSeeCheckboxIsChecked('agree'); // located by name
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {CodeceptJS.LocatorOrString} field located by label|name|CSS|XPath|strict locator.
|
|
10
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Checks that current url is not equal to provided one.
|
|
2
|
-
If a relative url provided, a configured url will be prepended to it.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.dontSeeCurrentUrlEquals('/login'); // relative url are ok
|
|
6
|
-
I.dontSeeCurrentUrlEquals('http://mysite.com/login'); // absolute urls are also ok
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {string} url value to check.
|
|
10
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Opposite to `seeElement`. Checks that element is not visible (or in DOM)
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.dontSeeElement('.modal'); // modal is not shown
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {CodeceptJS.LocatorOrString} locator located by CSS|XPath|Strict locator.
|
|
8
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Opposite to `seeElementInDOM`. Checks that element is not on page.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.dontSeeElementInDOM('.nav'); // checks that element is not on page visible or not
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {CodeceptJS.LocatorOrString} locator located by CSS|XPath|Strict locator.
|
|
8
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
Checks that value of input field or textarea doesn't equal to given value
|
|
2
|
-
Opposite to `seeInField`.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.dontSeeInField('email', 'user@user.com'); // field by name
|
|
6
|
-
I.dontSeeInField({ css: 'form input.email' }, 'user@user.com'); // field by CSS
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {CodeceptJS.LocatorOrString} field located by label|name|CSS|XPath|strict locator.
|
|
10
|
-
@param {string} value value to check.
|
|
11
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Performs a double-click on an element matched by link|button|label|CSS or XPath.
|
|
2
|
-
Context can be specified as second parameter to narrow search.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.doubleClick('Edit');
|
|
6
|
-
I.doubleClick('Edit', '.actions');
|
|
7
|
-
I.doubleClick({css: 'button.accept'});
|
|
8
|
-
I.doubleClick('.btn.edit');
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
@param {CodeceptJS.LocatorOrString} locator clickable link or button located by text, or any element located by CSS|XPath|strict locator.
|
|
12
|
-
@param {?CodeceptJS.LocatorOrString} [context=null] (optional, `null` by default) element to search in CSS|XPath|Strict locator.
|
|
13
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
Performs a download file on an element matched by link|button|CSS or XPath.
|
|
2
|
-
File is downloaded by default to output folder.
|
|
3
|
-
If no custom file name is provided, the default name will be used
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
```js
|
|
7
|
-
I.downloadFile('td[class="text-right file-link"] a', 'thisIsCustomName');
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
@param {CodeceptJS.LocatorOrString} locator clickable link or button located by CSS|XPath locator.
|
|
11
|
-
@param {string} file custom file name.
|
|
12
|
-
⚠️ returns a _promise_ which is synchronized internally by recorder
|