codeceptjs 3.5.0 → 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 +24 -25
- package/lib/actor.js +6 -3
- package/lib/ai.js +12 -3
- package/lib/cli.js +12 -2
- package/lib/codecept.js +4 -0
- package/lib/colorUtils.js +10 -0
- package/lib/command/definitions.js +2 -7
- package/lib/command/dryRun.js +2 -1
- package/lib/command/info.js +24 -0
- package/lib/command/init.js +51 -5
- package/lib/command/run-multiple/collection.js +17 -5
- package/lib/command/run-multiple.js +4 -2
- package/lib/command/run-workers.js +66 -4
- package/lib/command/run.js +7 -0
- package/lib/command/workers/runTests.js +39 -0
- 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 +73 -24
- package/lib/helper/Expect.js +422 -0
- package/lib/helper/FileSystem.js +1 -1
- package/lib/helper/GraphQL.js +25 -0
- package/lib/helper/Nightmare.js +9 -4
- package/lib/helper/OpenAI.js +14 -10
- package/lib/helper/Playwright.js +1205 -288
- package/lib/helper/Protractor.js +11 -6
- package/lib/helper/Puppeteer.js +173 -61
- package/lib/helper/TestCafe.js +44 -9
- package/lib/helper/WebDriver.js +231 -82
- 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 +2 -2
- package/lib/html.js +3 -3
- package/lib/interfaces/bdd.js +1 -1
- package/lib/interfaces/gherkin.js +37 -3
- package/lib/interfaces/scenarioConfig.js +1 -0
- package/lib/locator.js +17 -4
- package/lib/mochaFactory.js +2 -1
- package/lib/output.js +1 -1
- package/lib/pause.js +12 -9
- package/lib/plugin/autoLogin.js +45 -10
- package/lib/plugin/heal.js +47 -17
- package/lib/plugin/retryFailedStep.js +10 -1
- package/lib/plugin/retryTo.js +2 -4
- 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 +20 -9
- package/lib/session.js +1 -1
- package/lib/step.js +30 -11
- package/lib/ui.js +1 -0
- package/lib/utils.js +18 -1
- package/lib/workers.js +28 -3
- package/package.json +108 -98
- 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 +5 -0
- 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 +8 -6
- package/typings/promiseBasedTypes.d.ts +784 -822
- package/typings/types.d.ts +1214 -727
- package/CHANGELOG.md +0 -2492
- package/docs/advanced.md +0 -351
- package/docs/ai.md +0 -246
- 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 -1978
- 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 -2147
- package/docs/build/OpenAI.js +0 -122
- package/docs/build/Playwright.js +0 -4134
- package/docs/build/Polly.js +0 -42
- package/docs/build/Protractor.js +0 -2701
- package/docs/build/Puppeteer.js +0 -3743
- package/docs/build/REST.js +0 -344
- package/docs/build/SeleniumWebdriver.js +0 -76
- package/docs/build/TestCafe.js +0 -2059
- package/docs/build/WebDriver.js +0 -4042
- package/docs/changelog.md +0 -2501
- 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 -1317
- 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 -1258
- package/docs/helpers/OpenAI.md +0 -70
- package/docs/helpers/Playwright.md +0 -2250
- package/docs/helpers/Polly.md +0 -44
- package/docs/helpers/Puppeteer-firefox.md +0 -86
- package/docs/helpers/Puppeteer.md +0 -2147
- package/docs/helpers/REST.md +0 -218
- package/docs/helpers/TestCafe.md +0 -1224
- package/docs/helpers/WebDriver.md +0 -2325
- 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 -344
- package/docs/nightmare.md +0 -223
- package/docs/pageobjects.md +0 -291
- package/docs/parallel.md +0 -288
- package/docs/playwright.md +0 -609
- package/docs/plugins.md +0 -1225
- 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 -36
- 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 -11
- 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 -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/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
|
@@ -132,9 +132,48 @@ function initializeListeners() {
|
|
|
132
132
|
duration: test.duration || 0,
|
|
133
133
|
err,
|
|
134
134
|
parent,
|
|
135
|
+
steps: test.steps && test.steps.length > 0 ? simplifyStepsInTestObject(test.steps, err) : [],
|
|
135
136
|
};
|
|
136
137
|
}
|
|
137
138
|
|
|
139
|
+
function simplifyStepsInTestObject(steps, err) {
|
|
140
|
+
steps = [...steps];
|
|
141
|
+
const _steps = [];
|
|
142
|
+
|
|
143
|
+
for (step of steps) {
|
|
144
|
+
const _args = [];
|
|
145
|
+
|
|
146
|
+
if (step.args) {
|
|
147
|
+
for (const arg of step.args) {
|
|
148
|
+
// check if arg is a JOI object
|
|
149
|
+
if (arg && arg.$_root) {
|
|
150
|
+
_args.push(JSON.stringify(arg).slice(0, 300));
|
|
151
|
+
// check if arg is a function
|
|
152
|
+
} else if (arg && typeof arg === 'function') {
|
|
153
|
+
_args.push(arg.name);
|
|
154
|
+
} else {
|
|
155
|
+
_args.push(arg);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
_steps.push({
|
|
161
|
+
actor: step.actor,
|
|
162
|
+
name: step.name,
|
|
163
|
+
status: step.status,
|
|
164
|
+
args: _args,
|
|
165
|
+
startedAt: step.startedAt,
|
|
166
|
+
startTime: step.startTime,
|
|
167
|
+
endTime: step.endTime,
|
|
168
|
+
finishedAt: step.finishedAt,
|
|
169
|
+
duration: step.duration,
|
|
170
|
+
err,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return _steps;
|
|
175
|
+
}
|
|
176
|
+
|
|
138
177
|
function simplifyStep(step, err = null) {
|
|
139
178
|
step = { ...step };
|
|
140
179
|
|
package/lib/data/context.js
CHANGED
|
@@ -23,6 +23,7 @@ module.exports = function (context) {
|
|
|
23
23
|
.inject({ current: dataRow.data }));
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
|
+
maskSecretInTitle(scenarios);
|
|
26
27
|
return new DataScenarioConfig(scenarios);
|
|
27
28
|
},
|
|
28
29
|
only: {
|
|
@@ -42,6 +43,7 @@ module.exports = function (context) {
|
|
|
42
43
|
.inject({ current: dataRow.data }));
|
|
43
44
|
}
|
|
44
45
|
});
|
|
46
|
+
maskSecretInTitle(scenarios);
|
|
45
47
|
return new DataScenarioConfig(scenarios);
|
|
46
48
|
},
|
|
47
49
|
},
|
|
@@ -71,12 +73,6 @@ function replaceTitle(title, dataRow) {
|
|
|
71
73
|
// it should be printed
|
|
72
74
|
if (Object.prototype.toString.call(dataRow.data) === (Object()).toString()
|
|
73
75
|
&& dataRow.data.toString() !== (Object()).toString()) {
|
|
74
|
-
Object.entries(dataRow.data).forEach(entry => {
|
|
75
|
-
const [key, value] = entry;
|
|
76
|
-
if (value instanceof Secret) {
|
|
77
|
-
dataRow.data[key] = value.getMasked();
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
76
|
return `${title} | ${dataRow.data}`;
|
|
81
77
|
}
|
|
82
78
|
|
|
@@ -119,3 +115,15 @@ function detectDataType(dataTable) {
|
|
|
119
115
|
|
|
120
116
|
throw new Error('Invalid data type. Data accepts either: DataTable || generator || Array || function');
|
|
121
117
|
}
|
|
118
|
+
|
|
119
|
+
function maskSecretInTitle(scenarios) {
|
|
120
|
+
scenarios.forEach(scenario => {
|
|
121
|
+
const res = [];
|
|
122
|
+
|
|
123
|
+
scenario.test.title.split(',').forEach(item => {
|
|
124
|
+
res.push(item.replace(/{"_secret":"(.*)"}/, '"*****"'));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
scenario.test.title = res.join(',');
|
|
128
|
+
});
|
|
129
|
+
}
|
package/lib/event.js
CHANGED
|
@@ -91,6 +91,8 @@ module.exports = {
|
|
|
91
91
|
bddStep: {
|
|
92
92
|
before: 'bddStep.before',
|
|
93
93
|
after: 'bddStep.after',
|
|
94
|
+
started: 'bddStep.started',
|
|
95
|
+
finished: 'bddStep.finished',
|
|
94
96
|
},
|
|
95
97
|
/**
|
|
96
98
|
* @type {object}
|
|
@@ -125,10 +127,12 @@ module.exports = {
|
|
|
125
127
|
* @inner
|
|
126
128
|
* @property {'workers.before'} before
|
|
127
129
|
* @property {'workers.after'} after
|
|
130
|
+
* @property {'workers.result'} result
|
|
128
131
|
*/
|
|
129
132
|
workers: {
|
|
130
133
|
before: 'workers.before',
|
|
131
134
|
after: 'workers.after',
|
|
135
|
+
result: 'workers.result',
|
|
132
136
|
},
|
|
133
137
|
|
|
134
138
|
/**
|
|
@@ -309,7 +309,8 @@ class ApiDataFactory extends Helper {
|
|
|
309
309
|
} catch (e) {
|
|
310
310
|
modulePath = path.join(global.codecept_dir, modulePath);
|
|
311
311
|
}
|
|
312
|
-
|
|
312
|
+
// check if the new syntax `export default new Factory()` is used and loads the builder, otherwise loads the module that used old syntax `module.exports = new Factory()`.
|
|
313
|
+
const builder = require(modulePath).default || require(modulePath);
|
|
313
314
|
return builder.build(data, options);
|
|
314
315
|
} catch (err) {
|
|
315
316
|
throw new Error(`Couldn't load factory file from ${modulePath}, check that
|
package/lib/helper/Appium.js
CHANGED
|
@@ -22,7 +22,7 @@ const vendorPrefix = {
|
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Appium helper extends [
|
|
25
|
+
* Appium helper extends [Webdriver](http://codecept.io/helpers/WebDriver/) helper.
|
|
26
26
|
* It supports all browser methods and also includes special methods for mobile apps testing.
|
|
27
27
|
* You can use this helper to test Web on desktop and mobile devices and mobile apps.
|
|
28
28
|
*
|
|
@@ -31,7 +31,7 @@ const vendorPrefix = {
|
|
|
31
31
|
* Appium is an open source test automation framework for use with native, hybrid and mobile web apps that implements the WebDriver protocol.
|
|
32
32
|
* It allows you to run Selenium tests on mobile devices and also test native, hybrid and mobile web apps.
|
|
33
33
|
*
|
|
34
|
-
* Download and install [Appium](
|
|
34
|
+
* Download and install [Appium](https://appium.io/docs/en/2.1/)
|
|
35
35
|
*
|
|
36
36
|
* ```sh
|
|
37
37
|
* npm install -g appium
|
|
@@ -43,7 +43,7 @@ const vendorPrefix = {
|
|
|
43
43
|
*
|
|
44
44
|
* This helper should be configured in codecept.conf.ts or codecept.conf.js
|
|
45
45
|
*
|
|
46
|
-
* * `appiumV2`: set this to true if you want to run tests with
|
|
46
|
+
* * `appiumV2`: set this to true if you want to run tests with AppiumV2. See more how to setup [here](https://codecept.io/mobile/#setting-up)
|
|
47
47
|
* * `app`: Application path. Local path or remote URL to an .ipa or .apk file, or a .zip containing one of these. Alias to desiredCapabilities.appPackage
|
|
48
48
|
* * `host`: (default: 'localhost') Appium host
|
|
49
49
|
* * `port`: (default: '4723') Appium port
|
|
@@ -117,7 +117,44 @@ const vendorPrefix = {
|
|
|
117
117
|
* }
|
|
118
118
|
* ```
|
|
119
119
|
*
|
|
120
|
-
*
|
|
120
|
+
* Example Android App using AppiumV2 on BrowserStack:
|
|
121
|
+
*
|
|
122
|
+
* ```js
|
|
123
|
+
* {
|
|
124
|
+
* helpers: {
|
|
125
|
+
* Appium: {
|
|
126
|
+
* appiumV2: true,
|
|
127
|
+
* host: "hub-cloud.browserstack.com",
|
|
128
|
+
* port: 4444,
|
|
129
|
+
* user: process.env.BROWSERSTACK_USER,
|
|
130
|
+
* key: process.env.BROWSERSTACK_KEY,
|
|
131
|
+
* app: `bs://c700ce60cf1gjhgjh3ae8ed9770ghjg5a55b8e022f13c5827cg`,
|
|
132
|
+
* browser: '',
|
|
133
|
+
* desiredCapabilities: {
|
|
134
|
+
* 'appPackage': data.packageName,
|
|
135
|
+
* 'deviceName': process.env.DEVICE || 'Google Pixel 3',
|
|
136
|
+
* 'platformName': process.env.PLATFORM || 'android',
|
|
137
|
+
* 'platformVersion': process.env.OS_VERSION || '10.0',
|
|
138
|
+
* 'automationName': process.env.ENGINE || 'UIAutomator2',
|
|
139
|
+
* 'newCommandTimeout': 300000,
|
|
140
|
+
* 'androidDeviceReadyTimeout': 300000,
|
|
141
|
+
* 'androidInstallTimeout': 90000,
|
|
142
|
+
* 'appWaitDuration': 300000,
|
|
143
|
+
* 'autoGrantPermissions': true,
|
|
144
|
+
* 'gpsEnabled': true,
|
|
145
|
+
* 'isHeadless': false,
|
|
146
|
+
* 'noReset': false,
|
|
147
|
+
* 'noSign': true,
|
|
148
|
+
* 'bstack:options' : {
|
|
149
|
+
* "appiumVersion" : "2.0.1",
|
|
150
|
+
* },
|
|
151
|
+
* }
|
|
152
|
+
* }
|
|
153
|
+
* }
|
|
154
|
+
* }
|
|
155
|
+
* ```
|
|
156
|
+
*
|
|
157
|
+
* Additional configuration params can be used from <https://github.com/appium/appium/blob/master/packages/appium/docs/en/guides/caps.md>
|
|
121
158
|
*
|
|
122
159
|
* ## Access From Helpers
|
|
123
160
|
*
|
|
@@ -146,6 +183,11 @@ class Appium extends Webdriver {
|
|
|
146
183
|
this.axios = axios.create();
|
|
147
184
|
|
|
148
185
|
webdriverio = require('webdriverio');
|
|
186
|
+
if (!config.appiumV2) {
|
|
187
|
+
console.log('The Appium core team does not maintain Appium 1.x anymore since the 1st of January 2022. Please migrating to Appium 2.x by adding appiumV2: true to your config.');
|
|
188
|
+
console.log('More info: https://bit.ly/appium-v2-migration');
|
|
189
|
+
console.log('This Appium 1.x support will be removed in next major release.');
|
|
190
|
+
}
|
|
149
191
|
}
|
|
150
192
|
|
|
151
193
|
_validateConfig(config) {
|
|
@@ -234,7 +276,11 @@ class Appium extends Webdriver {
|
|
|
234
276
|
const _convertedCaps = {};
|
|
235
277
|
for (const [key, value] of Object.entries(capabilities)) {
|
|
236
278
|
if (!key.startsWith(vendorPrefix.appium)) {
|
|
237
|
-
|
|
279
|
+
if (key !== 'platformName' && key !== 'bstack:options') {
|
|
280
|
+
_convertedCaps[`${vendorPrefix.appium}:${key}`] = value;
|
|
281
|
+
} else {
|
|
282
|
+
_convertedCaps[`${key}`] = value;
|
|
283
|
+
}
|
|
238
284
|
} else {
|
|
239
285
|
_convertedCaps[`${key}`] = value;
|
|
240
286
|
}
|
|
@@ -322,7 +368,7 @@ class Appium extends Webdriver {
|
|
|
322
368
|
if (context.web) return this.switchToWeb(context.web);
|
|
323
369
|
if (context.webview) return this.switchToWeb(context.webview);
|
|
324
370
|
}
|
|
325
|
-
return this.
|
|
371
|
+
return this.switchToContext(context);
|
|
326
372
|
}
|
|
327
373
|
|
|
328
374
|
_withinEnd() {
|
|
@@ -377,8 +423,8 @@ class Appium extends Webdriver {
|
|
|
377
423
|
async runOnIOS(caps, fn) {
|
|
378
424
|
if (this.platform !== 'ios') return;
|
|
379
425
|
recorder.session.start('iOS-only actions');
|
|
380
|
-
this._runWithCaps(caps, fn);
|
|
381
|
-
recorder.add('restore from iOS session', () => recorder.session.restore());
|
|
426
|
+
await this._runWithCaps(caps, fn);
|
|
427
|
+
await recorder.add('restore from iOS session', () => recorder.session.restore());
|
|
382
428
|
return recorder.promise();
|
|
383
429
|
}
|
|
384
430
|
|
|
@@ -419,8 +465,8 @@ class Appium extends Webdriver {
|
|
|
419
465
|
async runOnAndroid(caps, fn) {
|
|
420
466
|
if (this.platform !== 'android') return;
|
|
421
467
|
recorder.session.start('Android-only actions');
|
|
422
|
-
this._runWithCaps(caps, fn);
|
|
423
|
-
recorder.add('restore from Android session', () => recorder.session.restore());
|
|
468
|
+
await this._runWithCaps(caps, fn);
|
|
469
|
+
await recorder.add('restore from Android session', () => recorder.session.restore());
|
|
424
470
|
return recorder.promise();
|
|
425
471
|
}
|
|
426
472
|
|
|
@@ -788,7 +834,7 @@ class Appium extends Webdriver {
|
|
|
788
834
|
*
|
|
789
835
|
* @param {*} context the context to switch to
|
|
790
836
|
*/
|
|
791
|
-
async
|
|
837
|
+
async switchToContext(context) {
|
|
792
838
|
return this.browser.switchContext(context);
|
|
793
839
|
}
|
|
794
840
|
|
|
@@ -812,11 +858,11 @@ class Appium extends Webdriver {
|
|
|
812
858
|
this.isWeb = true;
|
|
813
859
|
this.defaultContext = 'body';
|
|
814
860
|
|
|
815
|
-
if (context) return this.
|
|
861
|
+
if (context) return this.switchToContext(context);
|
|
816
862
|
const contexts = await this.grabAllContexts();
|
|
817
863
|
this.debugSection('Contexts', contexts.toString());
|
|
818
864
|
for (const idx in contexts) {
|
|
819
|
-
if (contexts[idx].match(/^WEBVIEW/)) return this.
|
|
865
|
+
if (contexts[idx].match(/^WEBVIEW/)) return this.switchToContext(contexts[idx]);
|
|
820
866
|
}
|
|
821
867
|
|
|
822
868
|
throw new Error('No WEBVIEW could be guessed, please specify one in params');
|
|
@@ -839,8 +885,8 @@ class Appium extends Webdriver {
|
|
|
839
885
|
this.isWeb = false;
|
|
840
886
|
this.defaultContext = '//*';
|
|
841
887
|
|
|
842
|
-
if (context) return this.
|
|
843
|
-
return this.
|
|
888
|
+
if (context) return this.switchToContext(context);
|
|
889
|
+
return this.switchToContext('NATIVE_APP');
|
|
844
890
|
}
|
|
845
891
|
|
|
846
892
|
/**
|
|
@@ -875,11 +921,12 @@ class Appium extends Webdriver {
|
|
|
875
921
|
* I.setNetworkConnection(4) // airplane mode off, wifi off, data on
|
|
876
922
|
* I.setNetworkConnection(6) // airplane mode off, wifi on, data on
|
|
877
923
|
* ```
|
|
878
|
-
* See corresponding [webdriverio reference](
|
|
879
|
-
*
|
|
880
|
-
* @return {Promise<{}>}
|
|
924
|
+
* See corresponding [webdriverio reference](https://webdriver.io/docs/api/chromium/#setnetworkconnection).
|
|
881
925
|
*
|
|
882
926
|
* Appium: support only Android
|
|
927
|
+
*
|
|
928
|
+
* @param {number} value The network connection mode bitmask
|
|
929
|
+
* @return {Promise<number>}
|
|
883
930
|
*/
|
|
884
931
|
async setNetworkConnection(value) {
|
|
885
932
|
onlyForApps.call(this, supportedPlatform.android);
|
|
@@ -1377,10 +1424,10 @@ class Appium extends Webdriver {
|
|
|
1377
1424
|
*
|
|
1378
1425
|
* @return {Promise<void>}
|
|
1379
1426
|
*
|
|
1380
|
-
* Appium: support
|
|
1427
|
+
* Appium: support both Android and iOS
|
|
1381
1428
|
*/
|
|
1382
1429
|
async closeApp() {
|
|
1383
|
-
onlyForApps.call(this
|
|
1430
|
+
onlyForApps.call(this);
|
|
1384
1431
|
return this.browser.closeApp();
|
|
1385
1432
|
}
|
|
1386
1433
|
|
|
@@ -1433,8 +1480,9 @@ class Appium extends Webdriver {
|
|
|
1433
1480
|
*
|
|
1434
1481
|
*/
|
|
1435
1482
|
async dontSeeInField(field, value) {
|
|
1436
|
-
|
|
1437
|
-
return super.dontSeeInField(
|
|
1483
|
+
const _value = (typeof value === 'boolean') ? value : value.toString();
|
|
1484
|
+
if (this.isWeb) return super.dontSeeInField(field, _value);
|
|
1485
|
+
return super.dontSeeInField(parseLocator.call(this, field), _value);
|
|
1438
1486
|
}
|
|
1439
1487
|
|
|
1440
1488
|
/**
|
|
@@ -1565,8 +1613,9 @@ class Appium extends Webdriver {
|
|
|
1565
1613
|
*
|
|
1566
1614
|
*/
|
|
1567
1615
|
async seeInField(field, value) {
|
|
1568
|
-
|
|
1569
|
-
return super.seeInField(
|
|
1616
|
+
const _value = (typeof value === 'boolean') ? value : value.toString();
|
|
1617
|
+
if (this.isWeb) return super.seeInField(field, _value);
|
|
1618
|
+
return super.seeInField(parseLocator.call(this, field), _value);
|
|
1570
1619
|
}
|
|
1571
1620
|
|
|
1572
1621
|
/**
|