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