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.
Files changed (281) hide show
  1. package/README.md +31 -30
  2. package/bin/codecept.js +1 -1
  3. package/lib/actor.js +6 -3
  4. package/lib/ai.js +180 -0
  5. package/lib/cli.js +13 -3
  6. package/lib/codecept.js +8 -0
  7. package/lib/colorUtils.js +10 -0
  8. package/lib/command/definitions.js +2 -7
  9. package/lib/command/dryRun.js +11 -2
  10. package/lib/command/generate.js +46 -3
  11. package/lib/command/info.js +24 -0
  12. package/lib/command/init.js +64 -6
  13. package/lib/command/interactive.js +15 -1
  14. package/lib/command/run-multiple/collection.js +17 -5
  15. package/lib/command/run-multiple.js +4 -2
  16. package/lib/command/run-workers.js +68 -5
  17. package/lib/command/run.js +7 -0
  18. package/lib/command/workers/runTests.js +39 -0
  19. package/lib/container.js +13 -3
  20. package/lib/data/context.js +14 -6
  21. package/lib/event.js +4 -0
  22. package/lib/helper/ApiDataFactory.js +2 -1
  23. package/lib/helper/Appium.js +116 -29
  24. package/lib/helper/Expect.js +422 -0
  25. package/lib/helper/FileSystem.js +1 -1
  26. package/lib/helper/GraphQL.js +25 -0
  27. package/lib/helper/JSONResponse.js +4 -4
  28. package/lib/helper/Nightmare.js +10 -5
  29. package/lib/helper/OpenAI.js +126 -0
  30. package/lib/helper/Playwright.js +1298 -229
  31. package/lib/helper/Protractor.js +12 -7
  32. package/lib/helper/Puppeteer.js +204 -64
  33. package/lib/helper/REST.js +15 -5
  34. package/lib/helper/TestCafe.js +45 -10
  35. package/lib/helper/WebDriver.js +252 -83
  36. package/lib/helper/errors/ElementNotFound.js +2 -1
  37. package/lib/helper/extras/PlaywrightReactVueLocator.js +38 -0
  38. package/lib/helper/scripts/blurElement.js +17 -0
  39. package/lib/helper/scripts/focusElement.js +17 -0
  40. package/lib/helper/scripts/highlightElement.js +20 -0
  41. package/lib/html.js +258 -0
  42. package/lib/interfaces/bdd.js +1 -1
  43. package/lib/interfaces/gherkin.js +37 -3
  44. package/lib/interfaces/scenarioConfig.js +1 -0
  45. package/lib/listener/retry.js +2 -1
  46. package/lib/locator.js +17 -4
  47. package/lib/mochaFactory.js +2 -1
  48. package/lib/output.js +1 -1
  49. package/lib/pause.js +78 -19
  50. package/lib/plugin/autoLogin.js +45 -10
  51. package/lib/plugin/debugErrors.js +67 -0
  52. package/lib/plugin/fakerTransform.js +4 -6
  53. package/lib/plugin/heal.js +209 -0
  54. package/lib/plugin/retryFailedStep.js +10 -1
  55. package/lib/plugin/retryTo.js +2 -4
  56. package/lib/plugin/screenshotOnFail.js +11 -2
  57. package/lib/plugin/selenoid.js +6 -1
  58. package/lib/plugin/standardActingHelpers.js +0 -2
  59. package/lib/plugin/stepByStepReport.js +2 -2
  60. package/lib/plugin/tryTo.js +5 -7
  61. package/lib/plugin/wdio.js +0 -1
  62. package/lib/recorder.js +22 -11
  63. package/lib/secret.js +5 -4
  64. package/lib/session.js +1 -1
  65. package/lib/step.js +36 -12
  66. package/lib/ui.js +5 -3
  67. package/lib/utils.js +22 -1
  68. package/lib/workers.js +83 -10
  69. package/package.json +117 -95
  70. package/translations/de-DE.js +5 -0
  71. package/translations/fr-FR.js +14 -1
  72. package/translations/it-IT.js +1 -0
  73. package/translations/ja-JP.js +14 -9
  74. package/translations/pl-PL.js +5 -0
  75. package/translations/pt-BR.js +1 -0
  76. package/translations/ru-RU.js +1 -0
  77. package/translations/zh-CN.js +5 -0
  78. package/translations/zh-TW.js +5 -0
  79. package/typings/index.d.ts +51 -15
  80. package/typings/promiseBasedTypes.d.ts +864 -802
  81. package/typings/types.d.ts +1339 -744
  82. package/CHANGELOG.md +0 -2427
  83. package/docs/advanced.md +0 -351
  84. package/docs/api.md +0 -323
  85. package/docs/basics.md +0 -980
  86. package/docs/bdd.md +0 -535
  87. package/docs/best.md +0 -237
  88. package/docs/books.md +0 -37
  89. package/docs/bootstrap.md +0 -135
  90. package/docs/build/ApiDataFactory.js +0 -409
  91. package/docs/build/Appium.js +0 -1938
  92. package/docs/build/FileSystem.js +0 -228
  93. package/docs/build/GraphQL.js +0 -204
  94. package/docs/build/GraphQLDataFactory.js +0 -309
  95. package/docs/build/JSONResponse.js +0 -338
  96. package/docs/build/Mochawesome.js +0 -71
  97. package/docs/build/Nightmare.js +0 -2145
  98. package/docs/build/Playwright.js +0 -3986
  99. package/docs/build/Polly.js +0 -42
  100. package/docs/build/Protractor.js +0 -2699
  101. package/docs/build/Puppeteer.js +0 -3710
  102. package/docs/build/REST.js +0 -334
  103. package/docs/build/SeleniumWebdriver.js +0 -76
  104. package/docs/build/TestCafe.js +0 -2057
  105. package/docs/build/WebDriver.js +0 -4017
  106. package/docs/changelog.md +0 -2436
  107. package/docs/commands.md +0 -254
  108. package/docs/community-helpers.md +0 -58
  109. package/docs/configuration.md +0 -157
  110. package/docs/continuous-integration.md +0 -22
  111. package/docs/custom-helpers.md +0 -306
  112. package/docs/data.md +0 -375
  113. package/docs/detox.md +0 -235
  114. package/docs/docker.md +0 -137
  115. package/docs/email.md +0 -183
  116. package/docs/examples.md +0 -149
  117. package/docs/helpers/ApiDataFactory.md +0 -266
  118. package/docs/helpers/Appium.md +0 -1312
  119. package/docs/helpers/Detox.md +0 -586
  120. package/docs/helpers/FileSystem.md +0 -152
  121. package/docs/helpers/GraphQL.md +0 -130
  122. package/docs/helpers/GraphQLDataFactory.md +0 -226
  123. package/docs/helpers/JSONResponse.md +0 -254
  124. package/docs/helpers/Mochawesome.md +0 -8
  125. package/docs/helpers/MockRequest.md +0 -377
  126. package/docs/helpers/Nightmare.md +0 -1256
  127. package/docs/helpers/Playwright.md +0 -2208
  128. package/docs/helpers/Polly.md +0 -44
  129. package/docs/helpers/Puppeteer-firefox.md +0 -86
  130. package/docs/helpers/Puppeteer.md +0 -2141
  131. package/docs/helpers/REST.md +0 -217
  132. package/docs/helpers/TestCafe.md +0 -1222
  133. package/docs/helpers/WebDriver.md +0 -2319
  134. package/docs/hooks.md +0 -340
  135. package/docs/index.md +0 -111
  136. package/docs/installation.md +0 -75
  137. package/docs/internal-api.md +0 -265
  138. package/docs/locators.md +0 -331
  139. package/docs/mobile-react-native-locators.md +0 -67
  140. package/docs/mobile.md +0 -297
  141. package/docs/nightmare.md +0 -223
  142. package/docs/pageobjects.md +0 -291
  143. package/docs/parallel.md +0 -232
  144. package/docs/playwright.md +0 -609
  145. package/docs/plugins.md +0 -1171
  146. package/docs/puppeteer.md +0 -316
  147. package/docs/quickstart.md +0 -163
  148. package/docs/react.md +0 -69
  149. package/docs/reports.md +0 -392
  150. package/docs/secrets.md +0 -30
  151. package/docs/shadow.md +0 -68
  152. package/docs/shared/keys.mustache +0 -31
  153. package/docs/shared/react.mustache +0 -1
  154. package/docs/testcafe.md +0 -174
  155. package/docs/translation.md +0 -247
  156. package/docs/tutorial.md +0 -271
  157. package/docs/typescript.md +0 -180
  158. package/docs/ui.md +0 -59
  159. package/docs/videos.md +0 -28
  160. package/docs/visual.md +0 -202
  161. package/docs/vue.md +0 -121
  162. package/docs/webapi/amOnPage.mustache +0 -11
  163. package/docs/webapi/appendField.mustache +0 -9
  164. package/docs/webapi/attachFile.mustache +0 -12
  165. package/docs/webapi/checkOption.mustache +0 -13
  166. package/docs/webapi/clearCookie.mustache +0 -10
  167. package/docs/webapi/clearField.mustache +0 -9
  168. package/docs/webapi/click.mustache +0 -25
  169. package/docs/webapi/clickLink.mustache +0 -8
  170. package/docs/webapi/closeCurrentTab.mustache +0 -7
  171. package/docs/webapi/closeOtherTabs.mustache +0 -8
  172. package/docs/webapi/dontSee.mustache +0 -11
  173. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  174. package/docs/webapi/dontSeeCookie.mustache +0 -8
  175. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  176. package/docs/webapi/dontSeeElement.mustache +0 -8
  177. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  178. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  179. package/docs/webapi/dontSeeInField.mustache +0 -11
  180. package/docs/webapi/dontSeeInSource.mustache +0 -8
  181. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  182. package/docs/webapi/doubleClick.mustache +0 -13
  183. package/docs/webapi/downloadFile.mustache +0 -12
  184. package/docs/webapi/dragAndDrop.mustache +0 -9
  185. package/docs/webapi/dragSlider.mustache +0 -11
  186. package/docs/webapi/executeAsyncScript.mustache +0 -24
  187. package/docs/webapi/executeScript.mustache +0 -26
  188. package/docs/webapi/fillField.mustache +0 -16
  189. package/docs/webapi/forceClick.mustache +0 -28
  190. package/docs/webapi/forceRightClick.mustache +0 -18
  191. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  192. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  193. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  194. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  195. package/docs/webapi/grabCookie.mustache +0 -11
  196. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  197. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  198. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  199. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  200. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  201. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  202. package/docs/webapi/grabGeoLocation.mustache +0 -8
  203. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  204. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  205. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  206. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  207. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  208. package/docs/webapi/grabPopupText.mustache +0 -5
  209. package/docs/webapi/grabSource.mustache +0 -8
  210. package/docs/webapi/grabTextFrom.mustache +0 -10
  211. package/docs/webapi/grabTextFromAll.mustache +0 -9
  212. package/docs/webapi/grabTitle.mustache +0 -8
  213. package/docs/webapi/grabValueFrom.mustache +0 -9
  214. package/docs/webapi/grabValueFromAll.mustache +0 -8
  215. package/docs/webapi/moveCursorTo.mustache +0 -12
  216. package/docs/webapi/openNewTab.mustache +0 -7
  217. package/docs/webapi/pressKey.mustache +0 -12
  218. package/docs/webapi/pressKeyDown.mustache +0 -12
  219. package/docs/webapi/pressKeyUp.mustache +0 -12
  220. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  221. package/docs/webapi/refreshPage.mustache +0 -6
  222. package/docs/webapi/resizeWindow.mustache +0 -6
  223. package/docs/webapi/rightClick.mustache +0 -14
  224. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  225. package/docs/webapi/saveScreenshot.mustache +0 -12
  226. package/docs/webapi/say.mustache +0 -10
  227. package/docs/webapi/scrollIntoView.mustache +0 -11
  228. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  229. package/docs/webapi/scrollPageToTop.mustache +0 -6
  230. package/docs/webapi/scrollTo.mustache +0 -12
  231. package/docs/webapi/see.mustache +0 -11
  232. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  233. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  234. package/docs/webapi/seeCookie.mustache +0 -8
  235. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  236. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  237. package/docs/webapi/seeElement.mustache +0 -8
  238. package/docs/webapi/seeElementInDOM.mustache +0 -8
  239. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  240. package/docs/webapi/seeInField.mustache +0 -12
  241. package/docs/webapi/seeInPopup.mustache +0 -8
  242. package/docs/webapi/seeInSource.mustache +0 -7
  243. package/docs/webapi/seeInTitle.mustache +0 -8
  244. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  245. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  246. package/docs/webapi/seeTextEquals.mustache +0 -9
  247. package/docs/webapi/seeTitleEquals.mustache +0 -8
  248. package/docs/webapi/selectOption.mustache +0 -21
  249. package/docs/webapi/setCookie.mustache +0 -16
  250. package/docs/webapi/setGeoLocation.mustache +0 -12
  251. package/docs/webapi/switchTo.mustache +0 -9
  252. package/docs/webapi/switchToNextTab.mustache +0 -10
  253. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  254. package/docs/webapi/type.mustache +0 -18
  255. package/docs/webapi/uncheckOption.mustache +0 -13
  256. package/docs/webapi/wait.mustache +0 -8
  257. package/docs/webapi/waitForClickable.mustache +0 -11
  258. package/docs/webapi/waitForDetached.mustache +0 -10
  259. package/docs/webapi/waitForElement.mustache +0 -11
  260. package/docs/webapi/waitForEnabled.mustache +0 -6
  261. package/docs/webapi/waitForFunction.mustache +0 -17
  262. package/docs/webapi/waitForInvisible.mustache +0 -10
  263. package/docs/webapi/waitForText.mustache +0 -13
  264. package/docs/webapi/waitForValue.mustache +0 -10
  265. package/docs/webapi/waitForVisible.mustache +0 -10
  266. package/docs/webapi/waitInUrl.mustache +0 -9
  267. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  268. package/docs/webapi/waitToHide.mustache +0 -10
  269. package/docs/webapi/waitUrlEquals.mustache +0 -10
  270. package/docs/webdriver.md +0 -657
  271. package/docs/wiki/Books-&-Posts.md +0 -27
  272. package/docs/wiki/Community-Helpers-&-Plugins.md +0 -49
  273. package/docs/wiki/Converting-Playwright-to-Istanbul-Coverage.md +0 -29
  274. package/docs/wiki/Examples.md +0 -139
  275. package/docs/wiki/Google-Summer-of-Code-(GSoC)-2020.md +0 -68
  276. package/docs/wiki/Home.md +0 -16
  277. package/docs/wiki/Release-Process.md +0 -24
  278. package/docs/wiki/Roadmap.md +0 -23
  279. package/docs/wiki/Tests.md +0 -1393
  280. package/docs/wiki/Upgrading-to-CodeceptJS-3.md +0 -153
  281. package/docs/wiki/Videos.md +0 -19
@@ -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 [Webriver](http://codecept.io/helpers/WebDriver/) helper.
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](http://appium.io/)
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
- * Additional configuration params can be used from <https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md>
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 a Appium client from a custom helper by accessing `browser` property:
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._switchToContext(context);
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 _switchToContext(context) {
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._switchToContext(context);
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._switchToContext(contexts[idx]);
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._switchToContext(context);
805
- return this._switchToContext('NATIVE_APP');
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](http://webdriver.io/api/mobile/setNetworkConnection.html).
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 only iOS
1427
+ * Appium: support both Android and iOS
1343
1428
  */
1344
1429
  async closeApp() {
1345
- onlyForApps.call(this, 'iOS');
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
- if (this.isWeb) return super.dontSeeInField(field, value);
1399
- return super.dontSeeInField(parseLocator.call(this, field), value);
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
- if (this.isWeb) return super.seeInField(field, value);
1531
- return super.seeInField(parseLocator.call(this, field), value);
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
  /**