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/lib/helper/Appium.js
CHANGED
|
@@ -17,8 +17,12 @@ const supportedPlatform = {
|
|
|
17
17
|
iOS: 'iOS',
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
const vendorPrefix = {
|
|
21
|
+
appium: 'appium',
|
|
22
|
+
};
|
|
23
|
+
|
|
20
24
|
/**
|
|
21
|
-
* Appium helper extends [
|
|
25
|
+
* Appium helper extends [Webdriver](http://codecept.io/helpers/WebDriver/) helper.
|
|
22
26
|
* It supports all browser methods and also includes special methods for mobile apps testing.
|
|
23
27
|
* You can use this helper to test Web on desktop and mobile devices and mobile apps.
|
|
24
28
|
*
|
|
@@ -27,7 +31,7 @@ const supportedPlatform = {
|
|
|
27
31
|
* Appium is an open source test automation framework for use with native, hybrid and mobile web apps that implements the WebDriver protocol.
|
|
28
32
|
* It allows you to run Selenium tests on mobile devices and also test native, hybrid and mobile web apps.
|
|
29
33
|
*
|
|
30
|
-
* Download and install [Appium](
|
|
34
|
+
* Download and install [Appium](https://appium.io/docs/en/2.1/)
|
|
31
35
|
*
|
|
32
36
|
* ```sh
|
|
33
37
|
* npm install -g appium
|
|
@@ -39,6 +43,7 @@ const supportedPlatform = {
|
|
|
39
43
|
*
|
|
40
44
|
* This helper should be configured in codecept.conf.ts or codecept.conf.js
|
|
41
45
|
*
|
|
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)
|
|
42
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
|
|
43
48
|
* * `host`: (default: 'localhost') Appium host
|
|
44
49
|
* * `port`: (default: '4723') Appium port
|
|
@@ -112,11 +117,48 @@ const supportedPlatform = {
|
|
|
112
117
|
* }
|
|
113
118
|
* ```
|
|
114
119
|
*
|
|
115
|
-
*
|
|
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>
|
|
116
158
|
*
|
|
117
159
|
* ## Access From Helpers
|
|
118
160
|
*
|
|
119
|
-
* Receive
|
|
161
|
+
* Receive Appium client from a custom helper by accessing `browser` property:
|
|
120
162
|
*
|
|
121
163
|
* ```js
|
|
122
164
|
* let browser = this.helpers['Appium'].browser
|
|
@@ -135,9 +177,17 @@ class Appium extends Webdriver {
|
|
|
135
177
|
super(config);
|
|
136
178
|
|
|
137
179
|
this.isRunning = false;
|
|
180
|
+
if (config.appiumV2 === true) {
|
|
181
|
+
this.appiumV2 = true;
|
|
182
|
+
}
|
|
138
183
|
this.axios = axios.create();
|
|
139
184
|
|
|
140
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
|
+
}
|
|
141
191
|
}
|
|
142
192
|
|
|
143
193
|
_validateConfig(config) {
|
|
@@ -181,14 +231,22 @@ class Appium extends Webdriver {
|
|
|
181
231
|
|
|
182
232
|
config.baseUrl = config.url || config.baseUrl;
|
|
183
233
|
if (config.desiredCapabilities && Object.keys(config.desiredCapabilities).length) {
|
|
184
|
-
config.capabilities = config.desiredCapabilities;
|
|
234
|
+
config.capabilities = this.appiumV2 === true ? this._convertAppiumV2Caps(config.desiredCapabilities) : config.desiredCapabilities;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (this.appiumV2) {
|
|
238
|
+
config.capabilities[`${vendorPrefix.appium}:deviceName`] = config[`${vendorPrefix.appium}:device`] || config.capabilities[`${vendorPrefix.appium}:deviceName`];
|
|
239
|
+
config.capabilities[`${vendorPrefix.appium}:browserName`] = config[`${vendorPrefix.appium}:browser`] || config.capabilities[`${vendorPrefix.appium}:browserName`];
|
|
240
|
+
config.capabilities[`${vendorPrefix.appium}:app`] = config[`${vendorPrefix.appium}:app`] || config.capabilities[`${vendorPrefix.appium}:app`];
|
|
241
|
+
config.capabilities[`${vendorPrefix.appium}:tunnelIdentifier`] = config[`${vendorPrefix.appium}:tunnelIdentifier`] || config.capabilities[`${vendorPrefix.appium}:tunnelIdentifier`]; // Adding the code to connect to sauce labs via sauce tunnel
|
|
242
|
+
} else {
|
|
243
|
+
config.capabilities.deviceName = config.device || config.capabilities.deviceName;
|
|
244
|
+
config.capabilities.browserName = config.browser || config.capabilities.browserName;
|
|
245
|
+
config.capabilities.app = config.app || config.capabilities.app;
|
|
246
|
+
config.capabilities.tunnelIdentifier = config.tunnelIdentifier || config.capabilities.tunnelIdentifier; // Adding the code to connect to sauce labs via sauce tunnel
|
|
185
247
|
}
|
|
186
248
|
|
|
187
|
-
config.capabilities.deviceName = config.device || config.capabilities.deviceName;
|
|
188
|
-
config.capabilities.browserName = config.browser || config.capabilities.browserName;
|
|
189
|
-
config.capabilities.app = config.app || config.capabilities.app;
|
|
190
249
|
config.capabilities.platformName = config.platform || config.capabilities.platformName;
|
|
191
|
-
config.capabilities.tunnelIdentifier = config.tunnelIdentifier || config.capabilities.tunnelIdentifier; // Adding the code to connect to sauce labs via sauce tunnel
|
|
192
250
|
config.waitForTimeoutInSeconds = config.waitForTimeout / 1000; // convert to seconds
|
|
193
251
|
|
|
194
252
|
// [CodeceptJS compatible] transform host to hostname
|
|
@@ -203,6 +261,10 @@ class Appium extends Webdriver {
|
|
|
203
261
|
}
|
|
204
262
|
|
|
205
263
|
this.platform = null;
|
|
264
|
+
if (config.capabilities[`${vendorPrefix.appium}:platformName`]) {
|
|
265
|
+
this.platform = config.capabilities[`${vendorPrefix.appium}:platformName`].toLowerCase();
|
|
266
|
+
}
|
|
267
|
+
|
|
206
268
|
if (config.capabilities.platformName) {
|
|
207
269
|
this.platform = config.capabilities.platformName.toLowerCase();
|
|
208
270
|
}
|
|
@@ -210,6 +272,22 @@ class Appium extends Webdriver {
|
|
|
210
272
|
return config;
|
|
211
273
|
}
|
|
212
274
|
|
|
275
|
+
_convertAppiumV2Caps(capabilities) {
|
|
276
|
+
const _convertedCaps = {};
|
|
277
|
+
for (const [key, value] of Object.entries(capabilities)) {
|
|
278
|
+
if (!key.startsWith(vendorPrefix.appium)) {
|
|
279
|
+
if (key !== 'platformName' && key !== 'bstack:options') {
|
|
280
|
+
_convertedCaps[`${vendorPrefix.appium}:${key}`] = value;
|
|
281
|
+
} else {
|
|
282
|
+
_convertedCaps[`${key}`] = value;
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
_convertedCaps[`${key}`] = value;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return _convertedCaps;
|
|
289
|
+
}
|
|
290
|
+
|
|
213
291
|
static _config() {
|
|
214
292
|
return [{
|
|
215
293
|
name: 'app',
|
|
@@ -229,6 +307,11 @@ class Appium extends Webdriver {
|
|
|
229
307
|
}
|
|
230
308
|
|
|
231
309
|
async _startBrowser() {
|
|
310
|
+
if (this.appiumV2 === true) {
|
|
311
|
+
this.options.capabilities = this._convertAppiumV2Caps(this.options.capabilities);
|
|
312
|
+
this.options.desiredCapabilities = this._convertAppiumV2Caps(this.options.desiredCapabilities);
|
|
313
|
+
}
|
|
314
|
+
|
|
232
315
|
try {
|
|
233
316
|
if (this.options.multiremote) {
|
|
234
317
|
this.browser = await webdriverio.multiremote(this.options.multiremote);
|
|
@@ -285,7 +368,7 @@ class Appium extends Webdriver {
|
|
|
285
368
|
if (context.web) return this.switchToWeb(context.web);
|
|
286
369
|
if (context.webview) return this.switchToWeb(context.webview);
|
|
287
370
|
}
|
|
288
|
-
return this.
|
|
371
|
+
return this.switchToContext(context);
|
|
289
372
|
}
|
|
290
373
|
|
|
291
374
|
_withinEnd() {
|
|
@@ -340,8 +423,8 @@ class Appium extends Webdriver {
|
|
|
340
423
|
async runOnIOS(caps, fn) {
|
|
341
424
|
if (this.platform !== 'ios') return;
|
|
342
425
|
recorder.session.start('iOS-only actions');
|
|
343
|
-
this._runWithCaps(caps, fn);
|
|
344
|
-
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());
|
|
345
428
|
return recorder.promise();
|
|
346
429
|
}
|
|
347
430
|
|
|
@@ -382,8 +465,8 @@ class Appium extends Webdriver {
|
|
|
382
465
|
async runOnAndroid(caps, fn) {
|
|
383
466
|
if (this.platform !== 'android') return;
|
|
384
467
|
recorder.session.start('Android-only actions');
|
|
385
|
-
this._runWithCaps(caps, fn);
|
|
386
|
-
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());
|
|
387
470
|
return recorder.promise();
|
|
388
471
|
}
|
|
389
472
|
|
|
@@ -445,6 +528,7 @@ class Appium extends Webdriver {
|
|
|
445
528
|
*/
|
|
446
529
|
async checkIfAppIsInstalled(bundleId) {
|
|
447
530
|
onlyForApps.call(this, supportedPlatform.android);
|
|
531
|
+
|
|
448
532
|
return this.browser.isAppInstalled(bundleId);
|
|
449
533
|
}
|
|
450
534
|
|
|
@@ -481,7 +565,7 @@ class Appium extends Webdriver {
|
|
|
481
565
|
async seeAppIsNotInstalled(bundleId) {
|
|
482
566
|
onlyForApps.call(this, supportedPlatform.android);
|
|
483
567
|
const res = await this.browser.isAppInstalled(bundleId);
|
|
484
|
-
return truth(`app ${bundleId}`, 'to be installed').negate(res);
|
|
568
|
+
return truth(`app ${bundleId}`, 'not to be installed').negate(res);
|
|
485
569
|
}
|
|
486
570
|
|
|
487
571
|
/**
|
|
@@ -750,7 +834,7 @@ class Appium extends Webdriver {
|
|
|
750
834
|
*
|
|
751
835
|
* @param {*} context the context to switch to
|
|
752
836
|
*/
|
|
753
|
-
async
|
|
837
|
+
async switchToContext(context) {
|
|
754
838
|
return this.browser.switchContext(context);
|
|
755
839
|
}
|
|
756
840
|
|
|
@@ -774,11 +858,11 @@ class Appium extends Webdriver {
|
|
|
774
858
|
this.isWeb = true;
|
|
775
859
|
this.defaultContext = 'body';
|
|
776
860
|
|
|
777
|
-
if (context) return this.
|
|
861
|
+
if (context) return this.switchToContext(context);
|
|
778
862
|
const contexts = await this.grabAllContexts();
|
|
779
863
|
this.debugSection('Contexts', contexts.toString());
|
|
780
864
|
for (const idx in contexts) {
|
|
781
|
-
if (contexts[idx].match(/^WEBVIEW/)) return this.
|
|
865
|
+
if (contexts[idx].match(/^WEBVIEW/)) return this.switchToContext(contexts[idx]);
|
|
782
866
|
}
|
|
783
867
|
|
|
784
868
|
throw new Error('No WEBVIEW could be guessed, please specify one in params');
|
|
@@ -801,8 +885,8 @@ class Appium extends Webdriver {
|
|
|
801
885
|
this.isWeb = false;
|
|
802
886
|
this.defaultContext = '//*';
|
|
803
887
|
|
|
804
|
-
if (context) return this.
|
|
805
|
-
return this.
|
|
888
|
+
if (context) return this.switchToContext(context);
|
|
889
|
+
return this.switchToContext('NATIVE_APP');
|
|
806
890
|
}
|
|
807
891
|
|
|
808
892
|
/**
|
|
@@ -837,11 +921,12 @@ class Appium extends Webdriver {
|
|
|
837
921
|
* I.setNetworkConnection(4) // airplane mode off, wifi off, data on
|
|
838
922
|
* I.setNetworkConnection(6) // airplane mode off, wifi on, data on
|
|
839
923
|
* ```
|
|
840
|
-
* See corresponding [webdriverio reference](
|
|
841
|
-
*
|
|
842
|
-
* @return {Promise<{}>}
|
|
924
|
+
* See corresponding [webdriverio reference](https://webdriver.io/docs/api/chromium/#setnetworkconnection).
|
|
843
925
|
*
|
|
844
926
|
* Appium: support only Android
|
|
927
|
+
*
|
|
928
|
+
* @param {number} value The network connection mode bitmask
|
|
929
|
+
* @return {Promise<number>}
|
|
845
930
|
*/
|
|
846
931
|
async setNetworkConnection(value) {
|
|
847
932
|
onlyForApps.call(this, supportedPlatform.android);
|
|
@@ -1339,10 +1424,10 @@ class Appium extends Webdriver {
|
|
|
1339
1424
|
*
|
|
1340
1425
|
* @return {Promise<void>}
|
|
1341
1426
|
*
|
|
1342
|
-
* Appium: support
|
|
1427
|
+
* Appium: support both Android and iOS
|
|
1343
1428
|
*/
|
|
1344
1429
|
async closeApp() {
|
|
1345
|
-
onlyForApps.call(this
|
|
1430
|
+
onlyForApps.call(this);
|
|
1346
1431
|
return this.browser.closeApp();
|
|
1347
1432
|
}
|
|
1348
1433
|
|
|
@@ -1395,8 +1480,9 @@ class Appium extends Webdriver {
|
|
|
1395
1480
|
*
|
|
1396
1481
|
*/
|
|
1397
1482
|
async dontSeeInField(field, value) {
|
|
1398
|
-
|
|
1399
|
-
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);
|
|
1400
1486
|
}
|
|
1401
1487
|
|
|
1402
1488
|
/**
|
|
@@ -1527,8 +1613,9 @@ class Appium extends Webdriver {
|
|
|
1527
1613
|
*
|
|
1528
1614
|
*/
|
|
1529
1615
|
async seeInField(field, value) {
|
|
1530
|
-
|
|
1531
|
-
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);
|
|
1532
1619
|
}
|
|
1533
1620
|
|
|
1534
1621
|
/**
|