codeceptjs 4.0.0-rc.2 → 4.0.0-rc.20
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 +39 -27
- package/bin/codecept.js +15 -2
- package/bin/codeceptq.js +49 -0
- package/bin/mcp-server.js +1187 -0
- package/docs/advanced.md +201 -0
- package/docs/agents.md +159 -0
- package/docs/ai.md +537 -0
- package/docs/aitrace.md +266 -0
- package/docs/api.md +332 -0
- package/docs/assertions.md +415 -0
- package/docs/auth.md +318 -0
- package/docs/basics.md +424 -0
- package/docs/bdd.md +539 -0
- package/docs/best.md +240 -0
- package/docs/bootstrap.md +132 -0
- package/docs/commands.md +352 -0
- package/docs/community-helpers.md +63 -0
- package/docs/configuration.md +230 -0
- package/docs/continuous-integration.md +497 -0
- package/docs/custom-helpers.md +297 -0
- package/docs/data.md +448 -0
- package/docs/debugging.md +332 -0
- package/docs/detox.md +235 -0
- package/docs/docker.md +136 -0
- package/docs/effects.md +179 -0
- package/docs/element-based-testing.md +295 -0
- package/docs/element-selection.md +125 -0
- package/docs/els.md +328 -0
- package/docs/examples.md +161 -0
- package/docs/heal.md +213 -0
- package/docs/helpers/ApiDataFactory.md +267 -0
- package/docs/helpers/Appium.md +1405 -0
- package/docs/helpers/Detox.md +665 -0
- package/docs/helpers/ExpectHelper.md +275 -0
- package/docs/helpers/FileSystem.md +152 -0
- package/docs/helpers/GraphQL.md +152 -0
- package/docs/helpers/GraphQLDataFactory.md +226 -0
- package/docs/helpers/JSONResponse.md +255 -0
- package/docs/helpers/Mochawesome.md +8 -0
- package/docs/helpers/MockRequest.md +377 -0
- package/docs/helpers/MockServer.md +212 -0
- package/docs/helpers/Playwright.md +2969 -0
- package/docs/helpers/Polly.md +44 -0
- package/docs/helpers/Protractor.md +1769 -0
- package/docs/helpers/Puppeteer-firefox.md +86 -0
- package/docs/helpers/Puppeteer.md +2690 -0
- package/docs/helpers/REST.md +289 -0
- package/docs/helpers/SoftExpectHelper.md +352 -0
- package/docs/helpers/WebDriver.md +2682 -0
- package/docs/hooks.md +339 -0
- package/docs/index.md +111 -0
- package/docs/installation.md +83 -0
- package/docs/internal-api.md +265 -0
- package/docs/internal-test-server.md +89 -0
- package/docs/locators.md +355 -0
- package/docs/mcp.md +485 -0
- package/docs/migration-4.md +556 -0
- package/docs/mobile.md +338 -0
- package/docs/pageobjects.md +399 -0
- package/docs/parallel.md +585 -0
- package/docs/playwright.md +714 -0
- package/docs/plugins.md +866 -0
- package/docs/puppeteer.md +314 -0
- package/docs/quickstart.md +120 -0
- package/docs/react.md +70 -0
- package/docs/reports.md +483 -0
- package/docs/retry.md +274 -0
- package/docs/secrets.md +150 -0
- package/docs/sessions.md +80 -0
- package/docs/shadow.md +68 -0
- package/docs/test-structure.md +275 -0
- package/docs/timeouts.md +183 -0
- package/docs/translation.md +247 -0
- package/docs/tutorial.md +271 -0
- package/docs/typescript.md +374 -0
- package/docs/web-element.md +251 -0
- package/docs/webdriver.md +708 -0
- package/docs/within.md +55 -0
- package/lib/ai.js +3 -2
- package/lib/aria.js +260 -0
- package/lib/assertions.js +18 -0
- package/lib/codecept.js +26 -23
- package/lib/command/check.js +2 -1
- package/lib/command/dryRun.js +24 -5
- package/lib/command/generate.js +2 -0
- package/lib/command/gherkin/snippets.js +5 -4
- package/lib/command/init.js +248 -269
- package/lib/command/list.js +150 -10
- package/lib/command/query.js +218 -0
- package/lib/command/run-multiple.js +2 -0
- package/lib/command/run-workers.js +2 -0
- package/lib/command/run.js +1 -1
- package/lib/command/workers/runTests.js +10 -10
- package/lib/config.js +77 -4
- package/lib/container.js +114 -17
- package/lib/effects.js +17 -0
- package/lib/element/WebElement.js +246 -2
- package/lib/els.js +12 -6
- package/lib/globals.js +32 -19
- package/lib/heal.js +4 -3
- package/lib/helper/ApiDataFactory.js +2 -1
- package/lib/helper/Appium.js +8 -8
- package/lib/helper/FileSystem.js +3 -2
- package/lib/helper/GraphQLDataFactory.js +2 -1
- package/lib/helper/Playwright.js +228 -162
- package/lib/helper/Puppeteer.js +208 -76
- package/lib/helper/WebDriver.js +173 -68
- package/lib/helper/errors/MultipleElementsFound.js +27 -110
- package/lib/helper/errors/NonFocusedType.js +8 -0
- package/lib/helper/extras/Download.js +45 -0
- package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
- package/lib/helper/extras/elementSelection.js +58 -0
- package/lib/helper/extras/focusCheck.js +43 -0
- package/lib/helper/extras/richTextEditor.js +178 -0
- package/lib/helper/scripts/dropFile.js +11 -0
- package/lib/history.js +3 -2
- package/lib/html.js +103 -16
- package/lib/index.js +9 -1
- package/lib/listener/config.js +6 -4
- package/lib/listener/emptyRun.js +2 -1
- package/lib/listener/globalRetry.js +32 -6
- package/lib/listener/helpers.js +4 -1
- package/lib/listener/mocha.js +2 -1
- package/lib/listener/pageobjects.js +43 -0
- package/lib/listener/result.js +3 -2
- package/lib/locator.js +126 -3
- package/lib/mocha/cli.js +14 -2
- package/lib/mocha/factory.js +7 -2
- package/lib/mocha/inject.js +1 -1
- package/lib/mocha/scenarioConfig.js +2 -1
- package/lib/mocha/ui.js +5 -6
- package/lib/parser.js +2 -2
- package/lib/pause.js +38 -4
- package/lib/plugin/aiTrace.js +453 -0
- package/lib/plugin/analyze.js +1 -1
- package/lib/plugin/auth.js +3 -3
- package/lib/plugin/browser.js +77 -0
- package/lib/plugin/expose.js +159 -0
- package/lib/plugin/heal.js +44 -1
- package/lib/plugin/pageInfo.js +53 -49
- package/lib/plugin/pause.js +131 -0
- package/lib/plugin/pauseOnFail.js +10 -34
- package/lib/plugin/retryFailedStep.js +28 -19
- package/lib/plugin/screencast.js +287 -0
- package/lib/plugin/screenshot.js +563 -0
- package/lib/plugin/screenshotOnFail.js +8 -171
- package/lib/rerun.js +2 -1
- package/lib/result.js +2 -1
- package/lib/step/base.js +3 -2
- package/lib/step/config.js +15 -2
- package/lib/step/record.js +2 -2
- package/lib/store.js +72 -3
- package/lib/translation.js +2 -1
- package/lib/utils/mask_data.js +2 -1
- package/lib/utils/pluginParser.js +151 -0
- package/lib/utils/trace.js +297 -0
- package/lib/utils.js +77 -3
- package/lib/workers.js +52 -22
- package/package.json +19 -13
- package/typings/index.d.ts +19 -5
- package/docs/webapi/amOnPage.mustache +0 -11
- package/docs/webapi/appendField.mustache +0 -11
- package/docs/webapi/attachFile.mustache +0 -12
- package/docs/webapi/blur.mustache +0 -18
- package/docs/webapi/checkOption.mustache +0 -13
- package/docs/webapi/clearCookie.mustache +0 -9
- package/docs/webapi/clearField.mustache +0 -9
- package/docs/webapi/click.mustache +0 -29
- 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/dontSeeCurrentPathEquals.mustache +0 -10
- 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/dontSeeTraffic.mustache +0 -13
- 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/flushNetworkTraffics.mustache +0 -5
- package/docs/webapi/focus.mustache +0 -13
- 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/grabRecordedNetworkTraffics.mustache +0 -10
- 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/grabWebElement.mustache +0 -9
- package/docs/webapi/grabWebElements.mustache +0 -9
- 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/seeCurrentPathEquals.mustache +0 -10
- 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/seeTraffic.mustache +0 -36
- package/docs/webapi/selectOption.mustache +0 -21
- package/docs/webapi/setCookie.mustache +0 -16
- package/docs/webapi/setGeoLocation.mustache +0 -12
- package/docs/webapi/startRecordingTraffic.mustache +0 -8
- package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
- package/docs/webapi/stopRecordingTraffic.mustache +0 -5
- package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
- 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 -21
- package/docs/webapi/uncheckOption.mustache +0 -13
- package/docs/webapi/wait.mustache +0 -8
- package/docs/webapi/waitForClickable.mustache +0 -11
- package/docs/webapi/waitForCookie.mustache +0 -9
- package/docs/webapi/waitForDetached.mustache +0 -10
- package/docs/webapi/waitForDisabled.mustache +0 -6
- 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/waitForNumberOfTabs.mustache +0 -9
- 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/lib/helper/AI.js +0 -214
- package/lib/listener/enhancedGlobalRetry.js +0 -110
- package/lib/plugin/enhancedRetryFailedStep.js +0 -99
- package/lib/plugin/htmlReporter.js +0 -3648
- package/lib/plugin/stepByStepReport.js +0 -427
- package/lib/plugin/subtitles.js +0 -89
- package/lib/retryCoordinator.js +0 -207
- package/typings/promiseBasedTypes.d.ts +0 -9469
- package/typings/types.d.ts +0 -11402
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
Verifies that a certain request is part of network traffic.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
// checking the request url contains certain query strings
|
|
5
|
-
I.amOnPage('https://openai.com/blog/chatgpt');
|
|
6
|
-
I.startRecordingTraffic();
|
|
7
|
-
await I.seeTraffic({
|
|
8
|
-
name: 'sentry event',
|
|
9
|
-
url: 'https://images.openai.com/blob/cf717bdb-0c8c-428a-b82b-3c3add87a600',
|
|
10
|
-
parameters: {
|
|
11
|
-
width: '1919',
|
|
12
|
-
height: '1138',
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
```js
|
|
18
|
-
// checking the request url contains certain post data
|
|
19
|
-
I.amOnPage('https://openai.com/blog/chatgpt');
|
|
20
|
-
I.startRecordingTraffic();
|
|
21
|
-
await I.seeTraffic({
|
|
22
|
-
name: 'event',
|
|
23
|
-
url: 'https://cloudflareinsights.com/cdn-cgi/rum',
|
|
24
|
-
requestPostData: {
|
|
25
|
-
st: 2,
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
@param {Object} opts - options when checking the traffic network.
|
|
31
|
-
@param {string} opts.name A name of that request. Can be any value. Only relevant to have a more meaningful error message in case of fail.
|
|
32
|
-
@param {string} opts.url Expected URL of request in network traffic
|
|
33
|
-
@param {Object} [opts.parameters] Expected parameters of that request in network traffic
|
|
34
|
-
@param {Object} [opts.requestPostData] Expected that request contains post data in network traffic
|
|
35
|
-
@param {number} [opts.timeout] Timeout to wait for request in seconds. Default is 10 seconds.
|
|
36
|
-
@return {void} automatically synchronized promise through #recorder
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
Selects an option in a drop-down select.
|
|
2
|
-
Field is searched by label | name | CSS | XPath.
|
|
3
|
-
Option is selected by visible text or by value.
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
I.selectOption('Choose Plan', 'Monthly'); // select by label
|
|
7
|
-
I.selectOption('subscription', 'Monthly'); // match option by text
|
|
8
|
-
I.selectOption('subscription', '0'); // or by value
|
|
9
|
-
I.selectOption('//form/select[@name=account]','Premium');
|
|
10
|
-
I.selectOption('form select[name=account]', 'Premium');
|
|
11
|
-
I.selectOption({css: 'form select[name=account]'}, 'Premium');
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Provide an array for the second argument to select multiple options.
|
|
15
|
-
|
|
16
|
-
```js
|
|
17
|
-
I.selectOption('Which OS do you use?', ['Android', 'iOS']);
|
|
18
|
-
```
|
|
19
|
-
@param {LocatorOrString} select field located by label|name|CSS|XPath|strict locator.
|
|
20
|
-
@param {string|Array<*>} option visible text or value of option.
|
|
21
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
Sets cookie(s).
|
|
2
|
-
|
|
3
|
-
Can be a single cookie object or an array of cookies:
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
I.setCookie({name: 'auth', value: true});
|
|
7
|
-
|
|
8
|
-
// as array
|
|
9
|
-
I.setCookie([
|
|
10
|
-
{name: 'auth', value: true},
|
|
11
|
-
{name: 'agree', value: true}
|
|
12
|
-
]);
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
@param {Cookie|Array<Cookie>} cookie a cookie object or array of cookie objects.
|
|
16
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
Set the current geo location
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.setGeoLocation(121.21, 11.56);
|
|
6
|
-
I.setGeoLocation(121.21, 11.56, 10);
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {number} latitude to set.
|
|
10
|
-
@param {number} longitude to set
|
|
11
|
-
@param {number=} altitude (optional, null by default) to set
|
|
12
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Switches frame or in case of null locator reverts to parent.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.switchTo('iframe'); // switch to first iframe
|
|
5
|
-
I.switchTo(); // switch back to main page
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {?CodeceptJS.LocatorOrString} [locator=null] (optional, `null` by default) element located by CSS|XPath|strict locator.
|
|
9
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Switch focus to a particular tab by its number. It waits tabs loading and then switch tab.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.switchToNextTab();
|
|
5
|
-
I.switchToNextTab(2);
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {number} [num] (optional) number of tabs to switch forward, default: 1.
|
|
9
|
-
@param {number | null} [sec] (optional) time in seconds to wait.
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Switch focus to a particular tab by its number. It waits tabs loading and then switch tab.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.switchToPreviousTab();
|
|
5
|
-
I.switchToPreviousTab(2);
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {number} [num] (optional) number of tabs to switch backward, default: 1.
|
|
9
|
-
@param {number?} [sec] (optional) time in seconds to wait.
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
Types out the given text into an active field.
|
|
2
|
-
To slow down typing use a second parameter, to set interval between key presses.
|
|
3
|
-
_Note:_ Should be used when [`fillField`](#fillfield) is not an option.
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
// passing in a string
|
|
7
|
-
I.type('Type this out.');
|
|
8
|
-
|
|
9
|
-
// typing values with a 100ms interval
|
|
10
|
-
I.type('4141555311111111', 100);
|
|
11
|
-
|
|
12
|
-
// passing in an array
|
|
13
|
-
I.type(['T', 'E', 'X', 'T']);
|
|
14
|
-
|
|
15
|
-
// passing a secret
|
|
16
|
-
I.type(secret('123456'));
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
@param {string|string[]} key or array of keys to type.
|
|
20
|
-
@param {?number} [delay=null] (optional) delay in ms between key presses
|
|
21
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Unselects 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.uncheckOption('#agree');
|
|
8
|
-
I.uncheckOption('I Agree to Terms and Conditions');
|
|
9
|
-
I.uncheckOption('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 {void} automatically synchronized promise through #recorder
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
Waits for element to be clickable (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForClickable('.btn.continue');
|
|
6
|
-
I.waitForClickable('.btn.continue', 5); // wait for 5 secs
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
10
|
-
@param {number} [sec] (optional, `1` by default) time in seconds to wait
|
|
11
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Waits for the specified cookie in the cookies.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.waitForCookie("token");
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {string} name expected cookie name.
|
|
8
|
-
@param {number} [sec=3] (optional, `3` by default) time in seconds to wait
|
|
9
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for an element to become not attached to the DOM on a page (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForDetached('#popup');
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
Waits for element to become disabled (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
5
|
-
@param {number} [sec=1] (optional) time in seconds to wait, 1 by default.
|
|
6
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
Waits for element to be present on page (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForElement('.btn.continue');
|
|
6
|
-
I.waitForElement('.btn.continue', 5); // wait for 5 secs
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
10
|
-
@param {number} [sec] (optional, `1` by default) time in seconds to wait
|
|
11
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
Waits for element to become enabled (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
5
|
-
@param {number} [sec=1] (optional) time in seconds to wait, 1 by default.
|
|
6
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
Waits for a function to return true (waits for 1 sec by default).
|
|
2
|
-
Running in browser context.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForFunction(fn[, [args[, timeout]])
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
```js
|
|
9
|
-
I.waitForFunction(() => window.requests == 0);
|
|
10
|
-
I.waitForFunction(() => window.requests == 0, 5); // waits for 5 sec
|
|
11
|
-
I.waitForFunction((count) => window.requests == count, [3], 5) // pass args and wait for 5 sec
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
@param {string|function} fn to be executed in browser context.
|
|
15
|
-
@param {any[]|number} [argsOrSec] (optional, `1` by default) arguments for function or seconds.
|
|
16
|
-
@param {number} [sec] (optional, `1` by default) time in seconds to wait
|
|
17
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for an element to be removed or become invisible on a page (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForInvisible('#popup');
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Waits for a text to appear (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
Narrow down search results by providing context.
|
|
4
|
-
|
|
5
|
-
```js
|
|
6
|
-
I.waitForText('Thank you, form has been submitted');
|
|
7
|
-
I.waitForText('Thank you, form has been submitted', 5, '#modal');
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
@param {string }text to wait for.
|
|
11
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
12
|
-
@param {CodeceptJS.LocatorOrString} [context] (optional) element located by CSS|XPath|strict locator.
|
|
13
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for the specified value to be in value attribute.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.waitForValue('//input', "GoodValue");
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {LocatorOrString} field input field.
|
|
8
|
-
@param {string }value expected value.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for an element to become visible on a page (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitForVisible('#popup');
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Waiting for the part of the URL to match the expected. Useful for SPA to understand that page was changed.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.waitInUrl('/info', 2);
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {string} urlPart value to check.
|
|
8
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
9
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for a specified number of elements on the page.
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.waitNumberOfVisibleElements('a', 3);
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
8
|
-
@param {number} num number of elements.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for an element to hide (by default waits for 1sec).
|
|
2
|
-
Element can be located by CSS or XPath.
|
|
3
|
-
|
|
4
|
-
```js
|
|
5
|
-
I.waitToHide('#popup');
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {CodeceptJS.LocatorOrString} locator element located by CSS|XPath|strict locator.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Waits for the entire URL to match the expected
|
|
2
|
-
|
|
3
|
-
```js
|
|
4
|
-
I.waitUrlEquals('/info', 2);
|
|
5
|
-
I.waitUrlEquals('http://127.0.0.1:8000/info');
|
|
6
|
-
```
|
|
7
|
-
|
|
8
|
-
@param {string} urlPart value to check.
|
|
9
|
-
@param {number} [sec=1] (optional, `1` by default) time in seconds to wait
|
|
10
|
-
@returns {void} automatically synchronized promise through #recorder
|
package/lib/helper/AI.js
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import HelperModule from '@codeceptjs/helper'
|
|
2
|
-
import ora from 'ora-classic'
|
|
3
|
-
import fs from 'fs'
|
|
4
|
-
import path from 'path'
|
|
5
|
-
import ai from '../ai.js'
|
|
6
|
-
import Container from '../container.js'
|
|
7
|
-
import { splitByChunks, minifyHtml } from '../html.js'
|
|
8
|
-
import { beautify } from '../utils.js'
|
|
9
|
-
import output from '../output.js'
|
|
10
|
-
import { registerVariable } from '../pause.js'
|
|
11
|
-
|
|
12
|
-
const standardActingHelpers = Container.STANDARD_ACTING_HELPERS
|
|
13
|
-
|
|
14
|
-
const gtpRole = {
|
|
15
|
-
user: 'user',
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* AI Helper for CodeceptJS.
|
|
20
|
-
*
|
|
21
|
-
* This helper class provides integration with the AI GPT-3.5 or 4 language model for generating responses to questions or prompts within the context of web pages. It allows you to interact with the GPT-3.5 model to obtain intelligent responses based on HTML fragments or general prompts.
|
|
22
|
-
* This helper should be enabled with any web helpers like Playwright or Puppeteer or WebDriver to ensure the HTML context is available.
|
|
23
|
-
*
|
|
24
|
-
* Use it only in development mode. It is recommended to run it only inside pause() mode.
|
|
25
|
-
*
|
|
26
|
-
* ## Configuration
|
|
27
|
-
*
|
|
28
|
-
* This helper should be configured in codecept.conf.{js|ts}
|
|
29
|
-
*
|
|
30
|
-
* * `chunkSize`: (optional, default: 80000) - The maximum number of characters to send to the AI API at once. We split HTML fragments by 8000 chars to not exceed token limit. Increase this value if you use GPT-4.
|
|
31
|
-
*/
|
|
32
|
-
class AI extends Helper {
|
|
33
|
-
constructor(config) {
|
|
34
|
-
super(config)
|
|
35
|
-
this.aiAssistant = ai
|
|
36
|
-
|
|
37
|
-
this.options = {
|
|
38
|
-
chunkSize: 80000,
|
|
39
|
-
}
|
|
40
|
-
this.options = { ...this.options, ...config }
|
|
41
|
-
this.aiAssistant.enable(this.config)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
_beforeSuite() {
|
|
45
|
-
const helpers = Container.helpers()
|
|
46
|
-
|
|
47
|
-
for (const helperName of standardActingHelpers) {
|
|
48
|
-
if (Object.keys(helpers).indexOf(helperName) > -1) {
|
|
49
|
-
this.helper = helpers[helperName]
|
|
50
|
-
break
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Asks the AI GPT language model a question based on the provided prompt within the context of the current page's HTML.
|
|
57
|
-
*
|
|
58
|
-
* ```js
|
|
59
|
-
* I.askGptOnPage('what does this page do?');
|
|
60
|
-
* ```
|
|
61
|
-
*
|
|
62
|
-
* @async
|
|
63
|
-
* @param {string} prompt - The question or prompt to ask the GPT model.
|
|
64
|
-
* @returns {Promise<string>} - A Promise that resolves to the generated responses from the GPT model, joined by newlines.
|
|
65
|
-
*/
|
|
66
|
-
async askGptOnPage(prompt) {
|
|
67
|
-
const html = await this.helper.grabSource()
|
|
68
|
-
|
|
69
|
-
const htmlChunks = splitByChunks(html, this.options.chunkSize)
|
|
70
|
-
|
|
71
|
-
if (htmlChunks.length > 1) this.debug(`Splitting HTML into ${htmlChunks.length} chunks`)
|
|
72
|
-
|
|
73
|
-
const responses = []
|
|
74
|
-
|
|
75
|
-
for (const chunk of htmlChunks) {
|
|
76
|
-
const messages = [
|
|
77
|
-
{ role: gtpRole.user, content: prompt },
|
|
78
|
-
{ role: gtpRole.user, content: `Within this HTML: ${await minifyHtml(chunk)}` },
|
|
79
|
-
]
|
|
80
|
-
|
|
81
|
-
if (htmlChunks.length > 1)
|
|
82
|
-
messages.push({
|
|
83
|
-
role: 'user',
|
|
84
|
-
content: 'If action is not possible on this page, do not propose anything, I will send another HTML fragment',
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
const response = await this._processAIRequest(messages)
|
|
88
|
-
|
|
89
|
-
output.print(response)
|
|
90
|
-
|
|
91
|
-
responses.push(response)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return responses.join('\n\n')
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Asks the AI a question based on the provided prompt within the context of a specific HTML fragment on the current page.
|
|
99
|
-
*
|
|
100
|
-
* ```js
|
|
101
|
-
* I.askGptOnPageFragment('describe features of this screen', '.screen');
|
|
102
|
-
* ```
|
|
103
|
-
*
|
|
104
|
-
* @async
|
|
105
|
-
* @param {string} prompt - The question or prompt to ask the GPT-3.5 model.
|
|
106
|
-
* @param {string} locator - The locator or selector used to identify the HTML fragment on the page.
|
|
107
|
-
* @returns {Promise<string>} - A Promise that resolves to the generated response from the GPT model.
|
|
108
|
-
*/
|
|
109
|
-
async askGptOnPageFragment(prompt, locator) {
|
|
110
|
-
const html = await this.helper.grabHTMLFrom(locator)
|
|
111
|
-
|
|
112
|
-
const messages = [
|
|
113
|
-
{ role: gtpRole.user, content: prompt },
|
|
114
|
-
{ role: gtpRole.user, content: `Within this HTML: ${await minifyHtml(html)}` },
|
|
115
|
-
]
|
|
116
|
-
|
|
117
|
-
const response = await this._processAIRequest(messages)
|
|
118
|
-
|
|
119
|
-
output.print(response)
|
|
120
|
-
|
|
121
|
-
return response
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Send a general request to AI and return response.
|
|
126
|
-
* @param {string} prompt
|
|
127
|
-
* @returns {Promise<string>} - A Promise that resolves to the generated response from the GPT model.
|
|
128
|
-
*/
|
|
129
|
-
async askGptGeneralPrompt(prompt) {
|
|
130
|
-
const messages = [{ role: gtpRole.user, content: prompt }]
|
|
131
|
-
|
|
132
|
-
const response = await this._processAIRequest(messages)
|
|
133
|
-
|
|
134
|
-
output.print(response)
|
|
135
|
-
|
|
136
|
-
return response
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Generates PageObject for current page using AI.
|
|
141
|
-
*
|
|
142
|
-
* It saves the PageObject to the output directory. You can review the page object and adjust it as needed and move to pages directory.
|
|
143
|
-
* Prompt can be customized in a global config file.
|
|
144
|
-
*
|
|
145
|
-
* ```js
|
|
146
|
-
* // create page object for whole page
|
|
147
|
-
* I.askForPageObject('home');
|
|
148
|
-
*
|
|
149
|
-
* // create page object with extra prompt
|
|
150
|
-
* I.askForPageObject('home', 'implement signIn(username, password) method');
|
|
151
|
-
*
|
|
152
|
-
* // create page object for a specific element
|
|
153
|
-
* I.askForPageObject('home', null, '.detail');
|
|
154
|
-
* ```
|
|
155
|
-
*
|
|
156
|
-
* Asks for a page object based on the provided page name, locator, and extra prompt.
|
|
157
|
-
*
|
|
158
|
-
* @async
|
|
159
|
-
* @param {string} pageName - The name of the page to retrieve the object for.
|
|
160
|
-
* @param {string|null} [extraPrompt=null] - An optional extra prompt for additional context or information.
|
|
161
|
-
* @param {string|null} [locator=null] - An optional locator to find a specific element on the page.
|
|
162
|
-
* @returns {Promise<Object>} A promise that resolves to the requested page object.
|
|
163
|
-
*/
|
|
164
|
-
async askForPageObject(pageName, extraPrompt = null, locator = null) {
|
|
165
|
-
const spinner = ora(' Processing AI request...').start()
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
const html = locator ? await this.helper.grabHTMLFrom(locator) : await this.helper.grabSource()
|
|
169
|
-
await this.aiAssistant.setHtmlContext(html)
|
|
170
|
-
const response = await this.aiAssistant.generatePageObject(extraPrompt, locator)
|
|
171
|
-
spinner.stop()
|
|
172
|
-
|
|
173
|
-
if (!response[0]) {
|
|
174
|
-
output.error('No response from AI')
|
|
175
|
-
return ''
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const code = beautify(response[0])
|
|
179
|
-
|
|
180
|
-
output.print('----- Generated PageObject ----')
|
|
181
|
-
output.print(code)
|
|
182
|
-
output.print('-------------------------------')
|
|
183
|
-
|
|
184
|
-
const fileName = path.join(output_dir, `${pageName}Page-${Date.now()}.js`)
|
|
185
|
-
|
|
186
|
-
output.print(output.styles.bold(`Page object for ${pageName} is saved to ${output.styles.bold(fileName)}`))
|
|
187
|
-
fs.writeFileSync(fileName, code)
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
registerVariable('page', require(fileName))
|
|
191
|
-
output.success('Page object registered for this session as `page` variable')
|
|
192
|
-
output.print('Use `=>page.methodName()` in shell to run methods of page object')
|
|
193
|
-
output.print('Use `click(page.locatorName)` to check locators of page object')
|
|
194
|
-
} catch (err) {
|
|
195
|
-
output.error('Error while registering page object')
|
|
196
|
-
output.error(err.message)
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return code
|
|
200
|
-
} catch (e) {
|
|
201
|
-
spinner.stop()
|
|
202
|
-
throw Error(`Something went wrong! ${e.message}`)
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async _processAIRequest(messages) {
|
|
207
|
-
const spinner = ora(' Processing AI request...').start()
|
|
208
|
-
const response = await this.aiAssistant.createCompletion(messages)
|
|
209
|
-
spinner.stop()
|
|
210
|
-
return response
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export default AI
|