codeceptjs 4.0.0-rc.2 → 4.0.0-rc.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/README.md +39 -27
  2. package/bin/codecept.js +15 -2
  3. package/bin/codeceptq.js +49 -0
  4. package/bin/mcp-server.js +1187 -0
  5. package/docs/advanced.md +201 -0
  6. package/docs/agents.md +159 -0
  7. package/docs/ai.md +537 -0
  8. package/docs/aitrace.md +266 -0
  9. package/docs/api.md +332 -0
  10. package/docs/assertions.md +415 -0
  11. package/docs/auth.md +318 -0
  12. package/docs/basics.md +424 -0
  13. package/docs/bdd.md +539 -0
  14. package/docs/best.md +240 -0
  15. package/docs/bootstrap.md +132 -0
  16. package/docs/commands.md +352 -0
  17. package/docs/community-helpers.md +63 -0
  18. package/docs/configuration.md +230 -0
  19. package/docs/continuous-integration.md +497 -0
  20. package/docs/custom-helpers.md +297 -0
  21. package/docs/data.md +448 -0
  22. package/docs/debugging.md +332 -0
  23. package/docs/detox.md +235 -0
  24. package/docs/docker.md +136 -0
  25. package/docs/effects.md +179 -0
  26. package/docs/element-based-testing.md +295 -0
  27. package/docs/element-selection.md +125 -0
  28. package/docs/els.md +328 -0
  29. package/docs/examples.md +161 -0
  30. package/docs/heal.md +213 -0
  31. package/docs/helpers/ApiDataFactory.md +267 -0
  32. package/docs/helpers/Appium.md +1405 -0
  33. package/docs/helpers/Detox.md +665 -0
  34. package/docs/helpers/ExpectHelper.md +275 -0
  35. package/docs/helpers/FileSystem.md +152 -0
  36. package/docs/helpers/GraphQL.md +152 -0
  37. package/docs/helpers/GraphQLDataFactory.md +226 -0
  38. package/docs/helpers/JSONResponse.md +255 -0
  39. package/docs/helpers/Mochawesome.md +8 -0
  40. package/docs/helpers/MockRequest.md +377 -0
  41. package/docs/helpers/MockServer.md +212 -0
  42. package/docs/helpers/Playwright.md +2969 -0
  43. package/docs/helpers/Polly.md +44 -0
  44. package/docs/helpers/Protractor.md +1769 -0
  45. package/docs/helpers/Puppeteer-firefox.md +86 -0
  46. package/docs/helpers/Puppeteer.md +2690 -0
  47. package/docs/helpers/REST.md +289 -0
  48. package/docs/helpers/SoftExpectHelper.md +352 -0
  49. package/docs/helpers/WebDriver.md +2682 -0
  50. package/docs/hooks.md +339 -0
  51. package/docs/index.md +111 -0
  52. package/docs/installation.md +83 -0
  53. package/docs/internal-api.md +265 -0
  54. package/docs/internal-test-server.md +89 -0
  55. package/docs/locators.md +355 -0
  56. package/docs/mcp.md +485 -0
  57. package/docs/migration-4.md +556 -0
  58. package/docs/mobile.md +338 -0
  59. package/docs/pageobjects.md +399 -0
  60. package/docs/parallel.md +585 -0
  61. package/docs/playwright.md +714 -0
  62. package/docs/plugins.md +866 -0
  63. package/docs/puppeteer.md +314 -0
  64. package/docs/quickstart.md +120 -0
  65. package/docs/react.md +70 -0
  66. package/docs/reports.md +483 -0
  67. package/docs/retry.md +274 -0
  68. package/docs/secrets.md +150 -0
  69. package/docs/sessions.md +80 -0
  70. package/docs/shadow.md +68 -0
  71. package/docs/test-structure.md +275 -0
  72. package/docs/timeouts.md +183 -0
  73. package/docs/translation.md +247 -0
  74. package/docs/tutorial.md +271 -0
  75. package/docs/typescript.md +374 -0
  76. package/docs/web-element.md +251 -0
  77. package/docs/webdriver.md +708 -0
  78. package/docs/within.md +55 -0
  79. package/lib/ai.js +3 -2
  80. package/lib/aria.js +260 -0
  81. package/lib/assertions.js +18 -0
  82. package/lib/codecept.js +26 -23
  83. package/lib/command/check.js +2 -1
  84. package/lib/command/dryRun.js +24 -5
  85. package/lib/command/generate.js +2 -0
  86. package/lib/command/gherkin/snippets.js +5 -4
  87. package/lib/command/init.js +248 -269
  88. package/lib/command/list.js +150 -10
  89. package/lib/command/query.js +218 -0
  90. package/lib/command/run-multiple.js +2 -0
  91. package/lib/command/run-workers.js +2 -0
  92. package/lib/command/run.js +1 -1
  93. package/lib/command/workers/runTests.js +10 -10
  94. package/lib/config.js +77 -4
  95. package/lib/container.js +114 -17
  96. package/lib/effects.js +17 -0
  97. package/lib/element/WebElement.js +246 -2
  98. package/lib/els.js +12 -6
  99. package/lib/globals.js +32 -19
  100. package/lib/heal.js +4 -3
  101. package/lib/helper/ApiDataFactory.js +2 -1
  102. package/lib/helper/Appium.js +8 -8
  103. package/lib/helper/FileSystem.js +3 -2
  104. package/lib/helper/GraphQLDataFactory.js +2 -1
  105. package/lib/helper/Playwright.js +228 -162
  106. package/lib/helper/Puppeteer.js +208 -76
  107. package/lib/helper/WebDriver.js +173 -68
  108. package/lib/helper/errors/MultipleElementsFound.js +27 -110
  109. package/lib/helper/errors/NonFocusedType.js +8 -0
  110. package/lib/helper/extras/Download.js +45 -0
  111. package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
  112. package/lib/helper/extras/elementSelection.js +58 -0
  113. package/lib/helper/extras/focusCheck.js +43 -0
  114. package/lib/helper/extras/richTextEditor.js +178 -0
  115. package/lib/helper/scripts/dropFile.js +11 -0
  116. package/lib/history.js +3 -2
  117. package/lib/html.js +103 -16
  118. package/lib/index.js +9 -1
  119. package/lib/listener/config.js +6 -4
  120. package/lib/listener/emptyRun.js +2 -1
  121. package/lib/listener/globalRetry.js +32 -6
  122. package/lib/listener/helpers.js +4 -1
  123. package/lib/listener/mocha.js +2 -1
  124. package/lib/listener/pageobjects.js +43 -0
  125. package/lib/listener/result.js +3 -2
  126. package/lib/locator.js +126 -3
  127. package/lib/mocha/cli.js +14 -2
  128. package/lib/mocha/factory.js +7 -2
  129. package/lib/mocha/inject.js +1 -1
  130. package/lib/mocha/scenarioConfig.js +2 -1
  131. package/lib/mocha/ui.js +5 -6
  132. package/lib/parser.js +2 -2
  133. package/lib/pause.js +38 -4
  134. package/lib/plugin/aiTrace.js +453 -0
  135. package/lib/plugin/analyze.js +1 -1
  136. package/lib/plugin/auth.js +3 -3
  137. package/lib/plugin/browser.js +77 -0
  138. package/lib/plugin/expose.js +159 -0
  139. package/lib/plugin/heal.js +44 -1
  140. package/lib/plugin/pageInfo.js +53 -49
  141. package/lib/plugin/pause.js +131 -0
  142. package/lib/plugin/pauseOnFail.js +10 -34
  143. package/lib/plugin/retryFailedStep.js +28 -19
  144. package/lib/plugin/screencast.js +287 -0
  145. package/lib/plugin/screenshot.js +563 -0
  146. package/lib/plugin/screenshotOnFail.js +8 -171
  147. package/lib/rerun.js +2 -1
  148. package/lib/result.js +2 -1
  149. package/lib/step/base.js +3 -2
  150. package/lib/step/config.js +15 -2
  151. package/lib/step/record.js +2 -2
  152. package/lib/store.js +72 -3
  153. package/lib/translation.js +2 -1
  154. package/lib/utils/mask_data.js +2 -1
  155. package/lib/utils/pluginParser.js +151 -0
  156. package/lib/utils/trace.js +297 -0
  157. package/lib/utils.js +77 -3
  158. package/lib/workers.js +52 -22
  159. package/package.json +19 -13
  160. package/typings/index.d.ts +19 -5
  161. package/docs/webapi/amOnPage.mustache +0 -11
  162. package/docs/webapi/appendField.mustache +0 -11
  163. package/docs/webapi/attachFile.mustache +0 -12
  164. package/docs/webapi/blur.mustache +0 -18
  165. package/docs/webapi/checkOption.mustache +0 -13
  166. package/docs/webapi/clearCookie.mustache +0 -9
  167. package/docs/webapi/clearField.mustache +0 -9
  168. package/docs/webapi/click.mustache +0 -29
  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/dontSeeCurrentPathEquals.mustache +0 -10
  176. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  177. package/docs/webapi/dontSeeElement.mustache +0 -8
  178. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  179. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  180. package/docs/webapi/dontSeeInField.mustache +0 -11
  181. package/docs/webapi/dontSeeInSource.mustache +0 -8
  182. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  183. package/docs/webapi/dontSeeTraffic.mustache +0 -13
  184. package/docs/webapi/doubleClick.mustache +0 -13
  185. package/docs/webapi/downloadFile.mustache +0 -12
  186. package/docs/webapi/dragAndDrop.mustache +0 -9
  187. package/docs/webapi/dragSlider.mustache +0 -11
  188. package/docs/webapi/executeAsyncScript.mustache +0 -24
  189. package/docs/webapi/executeScript.mustache +0 -26
  190. package/docs/webapi/fillField.mustache +0 -16
  191. package/docs/webapi/flushNetworkTraffics.mustache +0 -5
  192. package/docs/webapi/focus.mustache +0 -13
  193. package/docs/webapi/forceClick.mustache +0 -28
  194. package/docs/webapi/forceRightClick.mustache +0 -18
  195. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  196. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  197. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  198. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  199. package/docs/webapi/grabCookie.mustache +0 -11
  200. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  201. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  202. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  203. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  204. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  205. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  206. package/docs/webapi/grabGeoLocation.mustache +0 -8
  207. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  208. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  209. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  210. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  211. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  212. package/docs/webapi/grabPopupText.mustache +0 -5
  213. package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
  214. package/docs/webapi/grabSource.mustache +0 -8
  215. package/docs/webapi/grabTextFrom.mustache +0 -10
  216. package/docs/webapi/grabTextFromAll.mustache +0 -9
  217. package/docs/webapi/grabTitle.mustache +0 -8
  218. package/docs/webapi/grabValueFrom.mustache +0 -9
  219. package/docs/webapi/grabValueFromAll.mustache +0 -8
  220. package/docs/webapi/grabWebElement.mustache +0 -9
  221. package/docs/webapi/grabWebElements.mustache +0 -9
  222. package/docs/webapi/moveCursorTo.mustache +0 -12
  223. package/docs/webapi/openNewTab.mustache +0 -7
  224. package/docs/webapi/pressKey.mustache +0 -12
  225. package/docs/webapi/pressKeyDown.mustache +0 -12
  226. package/docs/webapi/pressKeyUp.mustache +0 -12
  227. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  228. package/docs/webapi/refreshPage.mustache +0 -6
  229. package/docs/webapi/resizeWindow.mustache +0 -6
  230. package/docs/webapi/rightClick.mustache +0 -14
  231. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  232. package/docs/webapi/saveScreenshot.mustache +0 -12
  233. package/docs/webapi/say.mustache +0 -10
  234. package/docs/webapi/scrollIntoView.mustache +0 -11
  235. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  236. package/docs/webapi/scrollPageToTop.mustache +0 -6
  237. package/docs/webapi/scrollTo.mustache +0 -12
  238. package/docs/webapi/see.mustache +0 -11
  239. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  240. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  241. package/docs/webapi/seeCookie.mustache +0 -8
  242. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  243. package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
  244. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  245. package/docs/webapi/seeElement.mustache +0 -8
  246. package/docs/webapi/seeElementInDOM.mustache +0 -8
  247. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  248. package/docs/webapi/seeInField.mustache +0 -12
  249. package/docs/webapi/seeInPopup.mustache +0 -8
  250. package/docs/webapi/seeInSource.mustache +0 -7
  251. package/docs/webapi/seeInTitle.mustache +0 -8
  252. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  253. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  254. package/docs/webapi/seeTextEquals.mustache +0 -9
  255. package/docs/webapi/seeTitleEquals.mustache +0 -8
  256. package/docs/webapi/seeTraffic.mustache +0 -36
  257. package/docs/webapi/selectOption.mustache +0 -21
  258. package/docs/webapi/setCookie.mustache +0 -16
  259. package/docs/webapi/setGeoLocation.mustache +0 -12
  260. package/docs/webapi/startRecordingTraffic.mustache +0 -8
  261. package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
  262. package/docs/webapi/stopRecordingTraffic.mustache +0 -5
  263. package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
  264. package/docs/webapi/switchTo.mustache +0 -9
  265. package/docs/webapi/switchToNextTab.mustache +0 -10
  266. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  267. package/docs/webapi/type.mustache +0 -21
  268. package/docs/webapi/uncheckOption.mustache +0 -13
  269. package/docs/webapi/wait.mustache +0 -8
  270. package/docs/webapi/waitForClickable.mustache +0 -11
  271. package/docs/webapi/waitForCookie.mustache +0 -9
  272. package/docs/webapi/waitForDetached.mustache +0 -10
  273. package/docs/webapi/waitForDisabled.mustache +0 -6
  274. package/docs/webapi/waitForElement.mustache +0 -11
  275. package/docs/webapi/waitForEnabled.mustache +0 -6
  276. package/docs/webapi/waitForFunction.mustache +0 -17
  277. package/docs/webapi/waitForInvisible.mustache +0 -10
  278. package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
  279. package/docs/webapi/waitForText.mustache +0 -13
  280. package/docs/webapi/waitForValue.mustache +0 -10
  281. package/docs/webapi/waitForVisible.mustache +0 -10
  282. package/docs/webapi/waitInUrl.mustache +0 -9
  283. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  284. package/docs/webapi/waitToHide.mustache +0 -10
  285. package/docs/webapi/waitUrlEquals.mustache +0 -10
  286. package/lib/helper/AI.js +0 -214
  287. package/lib/listener/enhancedGlobalRetry.js +0 -110
  288. package/lib/plugin/enhancedRetryFailedStep.js +0 -99
  289. package/lib/plugin/htmlReporter.js +0 -3648
  290. package/lib/plugin/stepByStepReport.js +0 -427
  291. package/lib/plugin/subtitles.js +0 -89
  292. package/lib/retryCoordinator.js +0 -207
  293. package/typings/promiseBasedTypes.d.ts +0 -9469
  294. package/typings/types.d.ts +0 -11402
@@ -0,0 +1,665 @@
1
+ ---
2
+ permalink: /helpers/Detox
3
+ sidebar: auto
4
+ title: Detox
5
+ ---
6
+
7
+ # Detox
8
+
9
+
10
+ <!-- Generated by documentation.js. Update this documentation by updating the source code. -->
11
+
12
+ ## Detox
13
+
14
+ **Extends Helper**
15
+
16
+ This is a wrapper on top of [Detox][1] library, aimied to unify testing experience for CodeceptJS framework.
17
+ Detox provides a grey box testing for mobile applications, playing especially good for React Native apps.
18
+
19
+ Detox plays quite differently from Appium. To establish detox testing you need to build a mobile application in a special way to inject Detox code.
20
+ This why **Detox is grey box testing** solution, so you need access to application source code, and a way to build and execute it on emulator.
21
+
22
+ Comparing to Appium, Detox runs faster and more stable but requires an additional setup for build.
23
+
24
+ ### Setup
25
+
26
+ 1. [Install and configure Detox][2]
27
+ 2. [Build an application][3] using `detox build` command.
28
+ 3. Install [CodeceptJS][4] and detox-helper:
29
+
30
+ <!---->
31
+
32
+ npm i @codeceptjs/detox-helper --save
33
+
34
+ Detox configuration is required in `package.json` under `detox` section.
35
+
36
+ If you completed step 1 and step 2 you should have a configuration similar this:
37
+
38
+ ```js
39
+ "detox": {
40
+ "configurations": {
41
+ "ios.sim.debug": {
42
+ "device": "simulator",
43
+ "app": "ios.debug"
44
+ }
45
+ },
46
+ "apps": {
47
+ "ios.debug": {
48
+ "type": "ios.app",
49
+ "binaryPath": "../test/ios/build/Build/Products/Debug-iphonesimulator/MyTestApp.app",
50
+ "build": "xcodebuild -workspace ../test/ios/MyTestApp.xcworkspace -scheme MyTestApp -configuration Debug -sdk iphonesimulator -derivedDataPath ../test/ios/build"
51
+ }
52
+ },
53
+ "devices": {
54
+ "simulator": {
55
+ "type": "ios.simulator",
56
+ "device": {
57
+ "type": "iPhone 15"
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### Configuration
65
+
66
+ Besides Detox configuration, CodeceptJS should also be configured to use Detox.
67
+
68
+ In `codecept.conf.js` enable Detox helper:
69
+
70
+ ```js
71
+ helpers: {
72
+ Detox: {
73
+ require: '@codeceptjs/detox-helper',
74
+ configuration: '<detox-configuration-name>',
75
+ }
76
+ }
77
+
78
+ ```
79
+
80
+ It's important to specify a package name under `require` section and current detox configuration taken from `package.json`.
81
+
82
+ Options:
83
+
84
+ * `configuration` - a detox configuration name. Required.
85
+ * `reloadReactNative` - should be enabled for React Native applications.
86
+ * `reuse` - reuse application for tests. By default, Detox reinstalls and relaunches app.
87
+ * `registerGlobals` - (default: true) Register Detox helper functions `by`, `element`, `expect`, `waitFor` globally.
88
+ * `url` - URL to open via deep-link each time the app is launched (android) or immediately afterwards (iOS). Useful for opening a bundle URL at the beginning of tests when working with Expo.
89
+
90
+ ### Parameters
91
+
92
+ * `config` &#x20;
93
+
94
+ ### appendField
95
+
96
+ Appends text into the field.
97
+ A field can be located by text, accessibility id, id.
98
+
99
+ ```js
100
+ I.appendField('name', 'davert');
101
+ ```
102
+
103
+ #### Parameters
104
+
105
+ * `field` **([string][5] | [object][6])**&#x20;
106
+ * `value` **[string][5]**&#x20;
107
+
108
+ ### checkIfElementExists
109
+
110
+ Checks if an element exists.
111
+
112
+ ```js
113
+ I.checkIfElementExists('~edit'); // located by accessibility id
114
+ I.checkIfElementExists('~edit', '#menu'); // element inside #menu
115
+ ```
116
+
117
+ #### Parameters
118
+
119
+ * `locator` **([string][5] | [object][6])** element to locate
120
+ * `context` **([string][5] | [object][6] | null)** context element (optional, default `null`)
121
+
122
+ ### clearField
123
+
124
+ Clears a text field.
125
+ A field can be located by text, accessibility id, id.
126
+
127
+ ```js
128
+ I.clearField('~name');
129
+ ```
130
+
131
+ #### Parameters
132
+
133
+ * `field` **([string][5] | [object][6])** an input element to clear
134
+
135
+ ### click
136
+
137
+ Clicks on an element.
138
+ Element can be located by its text or id or accessibility id
139
+
140
+ The second parameter is a context (id | type | accessibility id) to narrow the search.
141
+
142
+ Same as [tap][7]
143
+
144
+ ```js
145
+ I.click('Login'); // locate by text
146
+ I.click('~nav-1'); // locate by accessibility label
147
+ I.click('#user'); // locate by id
148
+ I.click('Login', '#nav'); // locate by text inside #nav
149
+ I.click({ ios: 'Save', android: 'SAVE' }, '#main'); // different texts on iOS and Android
150
+ ```
151
+
152
+ #### Parameters
153
+
154
+ * `locator` **([string][5] | [object][6])**&#x20;
155
+ * `context` **([string][5] | [object][6] | null)** (optional, default `null`)
156
+
157
+ ### clickAtPoint
158
+
159
+ Performs click on element with horizontal and vertical offset.
160
+ An element is located by text, id, accessibility id.
161
+
162
+ ```js
163
+ I.clickAtPoint('Save', 10, 10);
164
+ I.clickAtPoint('~save', 10, 10); // locate by accessibility id
165
+ ```
166
+
167
+ #### Parameters
168
+
169
+ * `locator` **([string][5] | [object][6])**&#x20;
170
+ * `x` **[number][8]** horizontal offset (optional, default `0`)
171
+ * `y` **[number][8]** vertical offset (optional, default `0`)
172
+
173
+ ### dontSee
174
+
175
+ Checks text not to be visible.
176
+ Use second parameter to narrow down the search.
177
+
178
+ ```js
179
+ I.dontSee('Record created');
180
+ I.dontSee('Record updated', '#message');
181
+ I.dontSee('Record deleted', '~message');
182
+ ```
183
+
184
+ #### Parameters
185
+
186
+ * `text` **[string][5]** to check invisibility
187
+ * `context` **([string][5] | [object][6] | null)** element in which to search for text (optional, default `null`)
188
+
189
+ ### dontSeeElement
190
+
191
+ Checks that element is not visible.
192
+ Use second parameter to narrow down the search.
193
+
194
+ ```js
195
+ I.dontSeeElement('~edit'); // located by accessibility id
196
+ I.dontSeeElement('~edit', '#menu'); // element inside #menu
197
+ ```
198
+
199
+ #### Parameters
200
+
201
+ * `locator` **([string][5] | [object][6])** element to locate
202
+ * `context` **([string][5] | [object][6] | null)** context element (optional, default `null`)
203
+
204
+ ### dontSeeElementExists
205
+
206
+ Checks that element not exists.
207
+ Use second parameter to narrow down the search.
208
+
209
+ ```js
210
+ I.dontSeeElementExist('~edit'); // located by accessibility id
211
+ I.dontSeeElementExist('~edit', '#menu'); // element inside #menu
212
+ ```
213
+
214
+ #### Parameters
215
+
216
+ * `locator` **([string][5] | [object][6])** element to locate
217
+ * `context` **([string][5] | [object][6])** context element (optional, default `null`)
218
+
219
+ ### fillField
220
+
221
+ Fills in text field in an app.
222
+ A field can be located by text, accessibility id, id.
223
+
224
+ ```js
225
+ I.fillField('Username', 'davert');
226
+ I.fillField('~name', 'davert');
227
+ I.fillField({ android: 'NAME', ios: 'name' }, 'davert');
228
+ ```
229
+
230
+ #### Parameters
231
+
232
+ * `field` **([string][5] | [object][6])** an input element to fill in
233
+ * `value` **[string][5]** value to fill
234
+
235
+ ### goBack
236
+
237
+ Goes back on Android
238
+
239
+ ```js
240
+ I.goBack(); // on Android only
241
+ ```
242
+
243
+ ### grabPlatform
244
+
245
+ Grab the device platform
246
+
247
+ ```js
248
+ const platform = await I.grabPlatform();
249
+ ```
250
+
251
+ ### installApp
252
+
253
+ Installs a configured application.
254
+ Application is installed by default.
255
+
256
+ ```js
257
+ I.installApp();
258
+ ```
259
+
260
+ ### launchApp
261
+
262
+ Launches an application. If application instance already exists, use [relaunchApp][9].
263
+
264
+ ```js
265
+ I.launchApp();
266
+ ```
267
+
268
+ ### longPress
269
+
270
+ Taps an element and holds for a requested time.
271
+
272
+ ```js
273
+ I.longPress('Login', 2); // locate by text, hold for 2 seconds
274
+ I.longPress('~nav', 1); // locate by accessibility label, hold for second
275
+ I.longPress('Update', 2, '#menu'); // locate by text inside #menu, hold for 2 seconds
276
+ ```
277
+
278
+ #### Parameters
279
+
280
+ * `locator` **([string][5] | [object][6])** element to locate
281
+ * `sec` **[number][8]** number of seconds to hold tap
282
+ * `context` **([string][5] | [object][6] | null)** context element (optional, default `null`)
283
+
284
+ ### multiTap
285
+
286
+ Multi taps on an element.
287
+ Element can be located by its text or id or accessibility id.
288
+
289
+ Set the number of taps in second argument.
290
+ Optionally define the context element by third argument.
291
+
292
+ ```js
293
+ I.multiTap('Login', 2); // locate by text
294
+ I.multiTap('~nav', 2); // locate by accessibility label
295
+ I.multiTap('#user', 2); // locate by id
296
+ I.multiTap('Update', 2, '#menu'); // locate by id
297
+ ```
298
+
299
+ #### Parameters
300
+
301
+ * `locator` **([string][5] | [object][6])** element to locate
302
+ * `num` **[number][8]** number of taps
303
+ * `context` **([string][5] | [object][6] | null)** context element (optional, default `null`)
304
+
305
+ ### relaunchApp
306
+
307
+ Relaunches an application.
308
+
309
+ ```js
310
+ I.relaunchApp();
311
+ ```
312
+
313
+ ### runOnAndroid
314
+
315
+ Execute code only on Android
316
+
317
+ ```js
318
+ I.runOnAndroid(() => {
319
+ I.click('Button');
320
+ I.see('Hi, Android');
321
+ });
322
+ ```
323
+
324
+ #### Parameters
325
+
326
+ * `fn` **[Function][10]** a function which will be executed on android
327
+
328
+ ### runOnIOS
329
+
330
+ Execute code only on iOS
331
+
332
+ ```js
333
+ I.runOnIOS(() => {
334
+ I.click('Button');
335
+ I.see('Hi, IOS');
336
+ });
337
+ ```
338
+
339
+ #### Parameters
340
+
341
+ * `fn` **[Function][10]** a function which will be executed on iOS
342
+
343
+ ### saveScreenshot
344
+
345
+ Saves a screenshot to the output dir
346
+
347
+ ```js
348
+ I.saveScreenshot('main-window.png');
349
+ ```
350
+
351
+ #### Parameters
352
+
353
+ * `name` **[string][5]**&#x20;
354
+
355
+ ### scrollDown
356
+
357
+ Scrolls to the bottom of an element.
358
+
359
+ ```js
360
+ I.scrollDown('#container');
361
+ ```
362
+
363
+ #### Parameters
364
+
365
+ * `locator` **([string][5] | [object][6])**&#x20;
366
+
367
+ ### scrollLeft
368
+
369
+ Scrolls to the left of an element.
370
+
371
+ ```js
372
+ I.scrollLeft('#container');
373
+ ```
374
+
375
+ #### Parameters
376
+
377
+ * `locator` **([string][5] | [object][6])**&#x20;
378
+
379
+ ### scrollRight
380
+
381
+ Scrolls to the right of an element.
382
+
383
+ ```js
384
+ I.scrollRight('#container');
385
+ ```
386
+
387
+ #### Parameters
388
+
389
+ * `locator` **([string][5] | [object][6])**&#x20;
390
+
391
+ ### scrollToElement
392
+
393
+ Scrolls within a scrollable container to an element.
394
+
395
+ #### Parameters
396
+
397
+ * `targetLocator` **([string][5] | [object][6])** Locator of the element to scroll to
398
+ * `containerLocator` **([string][5] | [object][6])** Locator of the scrollable container
399
+ * `direction` **[string][5]** 'up' or 'down' (optional, default `'down'`)
400
+ * `offset` **[number][8]** Offset for scroll, can be adjusted based on need (optional, default `100`)
401
+
402
+ ### scrollUp
403
+
404
+ Scrolls to the top of an element.
405
+
406
+ ```js
407
+ I.scrollUp('#container');
408
+ ```
409
+
410
+ #### Parameters
411
+
412
+ * `locator` **([string][5] | [object][6])**&#x20;
413
+
414
+ ### see
415
+
416
+ Checks text to be visible.
417
+ Use second parameter to narrow down the search.
418
+
419
+ ```js
420
+ I.see('Record created');
421
+ I.see('Record updated', '#message');
422
+ I.see('Record deleted', '~message');
423
+ ```
424
+
425
+ #### Parameters
426
+
427
+ * `text` **[string][5]** to check visibility
428
+ * `context` **([string][5] | [object][6] | null)** element inside which to search for text (optional, default `null`)
429
+
430
+ ### seeElement
431
+
432
+ Checks for visibility of an element.
433
+ Use second parameter to narrow down the search.
434
+
435
+ ```js
436
+ I.seeElement('~edit'); // located by accessibility id
437
+ I.seeElement('~edit', '#menu'); // element inside #menu
438
+ ```
439
+
440
+ #### Parameters
441
+
442
+ * `locator` **([string][5] | [object][6])** element to locate
443
+ * `context` **([string][5] | [object][6] | null)** context element (optional, default `null`)
444
+
445
+ ### seeElementExists
446
+
447
+ Checks for existence of an element. An element can be visible or not.
448
+ Use second parameter to narrow down the search.
449
+
450
+ ```js
451
+ I.seeElementExists('~edit'); // located by accessibility id
452
+ I.seeElementExists('~edit', '#menu'); // element inside #menu
453
+ ```
454
+
455
+ #### Parameters
456
+
457
+ * `locator` **([string][5] | [object][6])** element to locate
458
+ * `context` **([string][5] | [object][6])** context element (optional, default `null`)
459
+
460
+ ### setLandscapeOrientation
461
+
462
+ Switches device to landscape orientation
463
+
464
+ ```js
465
+ I.setLandscapeOrientation();
466
+ ```
467
+
468
+ ### setPortraitOrientation
469
+
470
+ Switches device to portrait orientation
471
+
472
+ ```js
473
+ I.setPortraitOrientation();
474
+ ```
475
+
476
+ ### shakeDevice
477
+
478
+ Shakes the device.
479
+
480
+ ```js
481
+ I.shakeDevice();
482
+ ```
483
+
484
+ ### swipeDown
485
+
486
+ Performs a swipe up inside an element.
487
+ Can be `slow` or `fast` swipe.
488
+
489
+ ```js
490
+ I.swipeUp('#container');
491
+ ```
492
+
493
+ #### Parameters
494
+
495
+ * `locator` **([string][5] | [object][6])** an element on which to perform swipe
496
+ * `speed` **[string][5]** a speed to perform: `slow` or `fast`. (optional, default `'slow'`)
497
+
498
+ ### swipeLeft
499
+
500
+ Performs a swipe up inside an element.
501
+ Can be `slow` or `fast` swipe.
502
+
503
+ ```js
504
+ I.swipeUp('#container');
505
+ ```
506
+
507
+ #### Parameters
508
+
509
+ * `locator` **([string][5] | [object][6])** an element on which to perform swipe
510
+ * `speed` **[string][5]** a speed to perform: `slow` or `fast`. (optional, default `'slow'`)
511
+
512
+ ### swipeRight
513
+
514
+ Performs a swipe up inside an element.
515
+ Can be `slow` or `fast` swipe.
516
+
517
+ ```js
518
+ I.swipeUp('#container');
519
+ ```
520
+
521
+ #### Parameters
522
+
523
+ * `locator` **([string][5] | [object][6])** an element on which to perform swipe
524
+ * `speed` **[string][5]** a speed to perform: `slow` or `fast`. (optional, default `'slow'`)
525
+
526
+ ### swipeUp
527
+
528
+ Performs a swipe up inside an element.
529
+ Can be `slow` or `fast` swipe.
530
+
531
+ ```js
532
+ I.swipeUp('#container');
533
+ ```
534
+
535
+ #### Parameters
536
+
537
+ * `locator` **([string][5] | [object][6])** an element on which to perform swipe
538
+ * `speed` **[string][5]** a speed to perform: `slow` or `fast`. (optional, default `'slow'`)
539
+
540
+ ### tap
541
+
542
+ Taps on an element.
543
+ Element can be located by its text or id or accessibility id.
544
+
545
+ The second parameter is a context element to narrow the search.
546
+
547
+ Same as [click][11]
548
+
549
+ ```js
550
+ I.tap('Login'); // locate by text
551
+ I.tap('~nav-1'); // locate by accessibility label
552
+ I.tap('#user'); // locate by id
553
+ I.tap('Login', '#nav'); // locate by text inside #nav
554
+ I.tap({ ios: 'Save', android: 'SAVE' }, '#main'); // different texts on iOS and Android
555
+ ```
556
+
557
+ #### Parameters
558
+
559
+ * `locator` **([string][5] | [object][6])**&#x20;
560
+ * `context` **([string][5] | [object][6] | null)** (optional, default `null`)
561
+
562
+ ### tapByLabel
563
+
564
+ Clicks on an element.
565
+ Element can be located by its label
566
+
567
+ The second parameter is a context (id | type | accessibility id) to narrow the search.
568
+
569
+ ```js
570
+ I.tapByLabel('Login'); // locate by text
571
+ I.tapByLabel('Login', '#nav'); // locate by text inside #nav
572
+ ```
573
+
574
+ #### Parameters
575
+
576
+ * `locator` **([string][5] | [object][6])**&#x20;
577
+ * `context` **([string][5] | [object][6] | null)** (optional, default `null`)
578
+
579
+ ### tapReturnKey
580
+
581
+ Taps return key.
582
+ A field can be located by text, accessibility id, id.
583
+
584
+ ```js
585
+ I.tapReturnKey('Username');
586
+ I.tapReturnKey('~name');
587
+ I.tapReturnKey({ android: 'NAME', ios: 'name' });
588
+ ```
589
+
590
+ #### Parameters
591
+
592
+ * `field` **([string][5] | [object][6])** an input element to fill in
593
+
594
+ ### wait
595
+
596
+ Waits for number of seconds
597
+
598
+ ```js
599
+ I.wait(2); // waits for 2 seconds
600
+ ```
601
+
602
+ #### Parameters
603
+
604
+ * `sec` **[number][8]** number of seconds to wait
605
+
606
+ ### waitForElement
607
+
608
+ Waits for an element to exist on page.
609
+
610
+ ```js
611
+ I.waitForElement('#message', 1); // wait for 1 second
612
+ ```
613
+
614
+ #### Parameters
615
+
616
+ * `locator` **([string][5] | [object][6])** an element to wait for
617
+ * `sec` **[number][8]** number of seconds to wait, 5 by default (optional, default `5`)
618
+
619
+ ### waitForElementVisible
620
+
621
+ Waits for an element to be visible on page.
622
+
623
+ ```js
624
+ I.waitForElementVisible('#message', 1); // wait for 1 second
625
+ ```
626
+
627
+ #### Parameters
628
+
629
+ * `locator` **([string][5] | [object][6])** an element to wait for
630
+ * `sec` **[number][8]** number of seconds to wait (optional, default `5`)
631
+
632
+ ### waitToHide
633
+
634
+ Waits an elmenet to become not visible.
635
+
636
+ ```js
637
+ I.waitToHide('#message', 2); // wait for 2 seconds
638
+ ```
639
+
640
+ #### Parameters
641
+
642
+ * `locator` **([string][5] | [object][6])** an element to wait for
643
+ * `sec` **[number][8]** number of seconds to wait (optional, default `5`)
644
+
645
+ [1]: https://github.com/wix/Detox
646
+
647
+ [2]: https://wix.github.io/Detox/docs/introduction/project-setup
648
+
649
+ [3]: https://wix.github.io/Detox/docs/introduction/project-setup#step-5-build-the-app
650
+
651
+ [4]: https://codecept.io
652
+
653
+ [5]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
654
+
655
+ [6]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
656
+
657
+ [7]: #tap
658
+
659
+ [8]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number
660
+
661
+ [9]: #relaunchApp
662
+
663
+ [10]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function
664
+
665
+ [11]: #click