detox 20.22.2 → 20.23.0-smoke.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2-sources.jar → 20.23.0-smoke.1/detox-20.23.0-smoke.1-sources.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1-sources.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1-sources.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1-sources.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1-sources.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.pom → 20.23.0-smoke.1/detox-20.23.0-smoke.1.pom} +1 -1
  7. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1.pom.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1.pom.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1.pom.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.23.0-smoke.1/detox-20.23.0-smoke.1.pom.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  12. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  13. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  14. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  15. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  16. package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2-sources.jar → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1-sources.jar} +0 -0
  17. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1-sources.jar.md5 +1 -0
  18. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1-sources.jar.sha1 +1 -0
  19. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1-sources.jar.sha256 +1 -0
  20. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1-sources.jar.sha512 +1 -0
  21. package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.pom → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.pom} +1 -1
  22. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.pom.md5 +1 -0
  23. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.pom.sha1 +1 -0
  24. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.pom.sha256 +1 -0
  25. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.pom.sha512 +1 -0
  26. package/Detox-android/com/wix/detox-legacy/maven-metadata.xml +4 -4
  27. package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.md5 +1 -1
  28. package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha1 +1 -1
  29. package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha256 +1 -1
  30. package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha512 +1 -1
  31. package/Detox-ios-framework.tbz +0 -0
  32. package/Detox-ios-src.tbz +0 -0
  33. package/Detox-ios-xcuitest.tbz +0 -0
  34. package/detox.d.ts +109 -1
  35. package/package.json +2 -2
  36. package/src/android/core/WebElement.js +4 -0
  37. package/src/android/matchers/index.js +2 -0
  38. package/src/ios/XCUITestRunner.js +9 -5
  39. package/src/ios/expectTwo.js +2 -2
  40. package/src/ios/web.js +59 -8
  41. package/src/matchers/factories/index.js +1 -1
  42. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2-sources.jar.md5 +0 -1
  43. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2-sources.jar.sha1 +0 -1
  44. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2-sources.jar.sha256 +0 -1
  45. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2-sources.jar.sha512 +0 -1
  46. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2.pom.md5 +0 -1
  47. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2.pom.sha1 +0 -1
  48. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2.pom.sha256 +0 -1
  49. package/Detox-android/com/wix/detox/20.22.2/detox-20.22.2.pom.sha512 +0 -1
  50. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2-sources.jar.md5 +0 -1
  51. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2-sources.jar.sha1 +0 -1
  52. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2-sources.jar.sha256 +0 -1
  53. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2-sources.jar.sha512 +0 -1
  54. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2.pom.md5 +0 -1
  55. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2.pom.sha1 +0 -1
  56. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2.pom.sha256 +0 -1
  57. package/Detox-android/com/wix/detox-legacy/20.22.2/detox-legacy-20.22.2.pom.sha512 +0 -1
  58. /package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.aar → 20.23.0-smoke.1/detox-20.23.0-smoke.1.aar} +0 -0
  59. /package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.aar.md5 → 20.23.0-smoke.1/detox-20.23.0-smoke.1.aar.md5} +0 -0
  60. /package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.aar.sha1 → 20.23.0-smoke.1/detox-20.23.0-smoke.1.aar.sha1} +0 -0
  61. /package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.aar.sha256 → 20.23.0-smoke.1/detox-20.23.0-smoke.1.aar.sha256} +0 -0
  62. /package/Detox-android/com/wix/detox/{20.22.2/detox-20.22.2.aar.sha512 → 20.23.0-smoke.1/detox-20.23.0-smoke.1.aar.sha512} +0 -0
  63. /package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.aar → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.aar} +0 -0
  64. /package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.aar.md5 → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.aar.md5} +0 -0
  65. /package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.aar.sha1 → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.aar.sha1} +0 -0
  66. /package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.aar.sha256 → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.aar.sha256} +0 -0
  67. /package/Detox-android/com/wix/detox-legacy/{20.22.2/detox-legacy-20.22.2.aar.sha512 → 20.23.0-smoke.1/detox-legacy-20.23.0-smoke.1.aar.sha512} +0 -0
@@ -0,0 +1 @@
1
+ ee3d27fe55234d6570713a04a1c58395
@@ -0,0 +1 @@
1
+ b63a3bb5240755eadc14fb067109a54fb466faaf
@@ -0,0 +1 @@
1
+ d487b7c171172bb490a3e2e4a4f185071a9fc11e9c309956fedb832cc74dac74
@@ -0,0 +1 @@
1
+ 929f5aaabefce5d76246f38fc97b275697eff00e378fb0893f57dcfe7152332cfaa73cbcf8480abc84b55bb70d69852a71130fcc9cf96f6bf7b44da0a349f8e9
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.22.2</version>
6
+ <version>20.23.0-smoke.1</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ 692a1d019824c95a5a1547b82c00ecdb
@@ -0,0 +1 @@
1
+ 816833bc089c6224d633bfe8fafd450008079cc8
@@ -0,0 +1 @@
1
+ 6c327b19ac5edb252cfbadcda9b4976e7e448b3b4199e1987380545bd9d7ce26
@@ -0,0 +1 @@
1
+ bc01f0ebde7a8313dc0b6a4de9fca8671f02aafa1d1ffb79570cf655e5c9ac1ce12dda8355aad4783daffa206a7d5170e1e70e715384198eaed09cf53adae49a
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.22.2</latest>
7
- <release>20.22.2</release>
6
+ <latest>20.23.0-smoke.1</latest>
7
+ <release>20.23.0-smoke.1</release>
8
8
  <versions>
9
- <version>20.22.2</version>
9
+ <version>20.23.0-smoke.1</version>
10
10
  </versions>
11
- <lastUpdated>20240522143416</lastUpdated>
11
+ <lastUpdated>20240610051731</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- c24b0c322a113c1b390e986c5d8308c8
1
+ ef2b3ea24ee2ad016d2efdbe786c3b00
@@ -1 +1 @@
1
- 48caaf19e15988b71b46c92346e58db476719036
1
+ 85cf9f207c25f6608caf0a853df1c41eef88c105
@@ -1 +1 @@
1
- 7dfe28b05e07c13d02bcf6d4003fa32275f07a9944d3c7d1d41258dc55ae2227
1
+ ff348d208b03f4bfca1fea7ca576fdf0f15218c45ba180d42bdeff81e698e5ef
@@ -1 +1 @@
1
- 772be2b3c33a1595a492129a9ed872739fff866604505b913b91579aa14174652750a3f2ba58b29b025ddf3f2d83a4190f3ff9dd81129baf4297a5ac0a7a0cbf
1
+ 4f3457da46623fff6cce6ab427ded834582fc3c85b96b986474a4cf07961cd7765b02162d2c248021d562397160533d82f53d1b24932f2d95c43eed4d67a7c57
@@ -0,0 +1 @@
1
+ e80f2316632fdb0594fa5ff0d8ab7cbdc4cd473214ed364f74724b456413dcb3
@@ -0,0 +1 @@
1
+ f857a3248c6adfc620da4566e8941f52ce3066903699280bac6cb4d9d80f8101f67c5f70b5b0dae4bcac4e745ceae784f2511a61b0ac8f2412e3be18a8817c8d
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox-legacy</artifactId>
6
- <version>20.22.2</version>
6
+ <version>20.23.0-smoke.1</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ e945feee31ebfa2f37cbccadd1acd47c678cc1e2
@@ -0,0 +1 @@
1
+ a7cefbaf3b79ff2d7724c02f9f6433ffdfc0125aa12676e01faddf3b3ddcd559
@@ -0,0 +1 @@
1
+ 9cbd100ea8235075d1c4a1f2fe44467f8b0f35f309d8c4992e9dbaf563fd90f9a451200ab6ba89ccbd01b5f5e7bf037aab8b12080e92acc650f2335f191b8b13
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox-legacy</artifactId>
5
5
  <versioning>
6
- <latest>20.22.2</latest>
7
- <release>20.22.2</release>
6
+ <latest>20.23.0-smoke.1</latest>
7
+ <release>20.23.0-smoke.1</release>
8
8
  <versions>
9
- <version>20.22.2</version>
9
+ <version>20.23.0-smoke.1</version>
10
10
  </versions>
11
- <lastUpdated>20240522144004</lastUpdated>
11
+ <lastUpdated>20240610051818</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 43646f08499253012366de8ca06a7aa0
1
+ 772b547a862e05f31f75f46314caf933
@@ -1 +1 @@
1
- f7623dea9f86f703a5c7e4cf2d3badb37bf579ea
1
+ 9ead117eb63649c41297110111738e3bac65552d
@@ -1 +1 @@
1
- 0ef7cc0c5b989f9bde15546e79501be5f8ee2968024722157895c0d1b49bfbf6
1
+ 7f024a5dce43ad29619b257c4e52cb0e50f99024f501f5d6ecfd10425eecb3ce
@@ -1 +1 @@
1
- d3898b7dc911fb2ac46540b9860f6c1d58bdde1606edde3482a3ff134fa6c3f2364234befed176c6a95013191bc59518a0c2cf0b0bf44c8ad70ca9c2faa91ed7
1
+ d7b9bd14bdef88934c66d42e604be8e1a214482ea1c7683a2c047fa4d67d44042e113f7bdfe45f72d10cafb635794eb11653ed393c9c635160a4f8d0237aff4f
Binary file
package/Detox-ios-src.tbz CHANGED
Binary file
Binary file
package/detox.d.ts CHANGED
@@ -1112,6 +1112,30 @@ declare global {
1112
1112
  * web.element(by.web.tag('mark'))
1113
1113
  */
1114
1114
  tag(tagName: string): WebMatcher;
1115
+
1116
+ /**
1117
+ * (iOS Only) Find an element on the DOM tree by its value
1118
+ * @param value
1119
+ * @example
1120
+ * web.element(by.web.value('hello'))
1121
+ */
1122
+ value(value: string): WebMatcher;
1123
+
1124
+ /**
1125
+ * (iOS Only) Find an element or secured element on the web-view by its accessibility label.
1126
+ * @param text
1127
+ * @example
1128
+ * web.securedElement(by.web.label('Submit'))
1129
+ * web.element(by.web.label('Submit'))
1130
+ */
1131
+ label(text: string): MaybeSecuredWebMatcher;
1132
+
1133
+ /**
1134
+ * (iOS Only) Find a secured element on the web-view by its accessibility type.
1135
+ * @example
1136
+ * web.securedElement(by.web.type('textField'))
1137
+ */
1138
+ type(type: string): SecuredWebMatcher;
1115
1139
  }
1116
1140
 
1117
1141
  interface BySystemFacade {
@@ -1156,6 +1180,14 @@ declare global {
1156
1180
  __web__: any; // prevent type coercion
1157
1181
  }
1158
1182
 
1183
+ interface SecuredWebMatcher {
1184
+ __web__: any; // prevent type coercion
1185
+ }
1186
+
1187
+ interface MaybeSecuredWebMatcher {
1188
+ __web__: any; // prevent type coercion
1189
+ }
1190
+
1159
1191
  interface SystemMatcher {
1160
1192
  __system__: any; // prevent type coercion
1161
1193
  }
@@ -1165,15 +1197,22 @@ declare global {
1165
1197
 
1166
1198
  (webElement: WebElement): WebExpect;
1167
1199
 
1200
+ (securedWebElement: SecuredWebElement): SecuredWebExpect;
1201
+
1168
1202
  (systemElement: SystemElement): SystemExpect;
1169
1203
  }
1170
1204
 
1205
+ type MaybeSecuredWebElement<T> = T extends MaybeSecuredWebMatcher ?
1206
+ IndexableMaybeSecuredWebElement & SecuredWebElementFacade :
1207
+ T extends SecuredWebMatcher ? IndexableSecuredWebElement & SecuredWebElementFacade :
1208
+ IndexableWebElement;
1209
+
1171
1210
  interface WebViewElement {
1172
1211
  /**
1173
1212
  * Find a web element by a matcher.
1174
1213
  * @param webMatcher a web matcher for the web element.
1175
1214
  */
1176
- element(webMatcher: WebMatcher): IndexableWebElement;
1215
+ element<T extends WebMatcher>(webMatcher: T): MaybeSecuredWebElement<T>;
1177
1216
 
1178
1217
  /**
1179
1218
  * Returns the index-th web-view in the UI hierarchy that is matched by the given matcher.
@@ -1196,6 +1235,13 @@ declare global {
1196
1235
  (matcher?: NativeMatcher): WebViewElement;
1197
1236
  }
1198
1237
 
1238
+ interface SecuredWebElementFacade {
1239
+ /**
1240
+ * Gets the secured webview element as a testing element.
1241
+ */
1242
+ asSecured(): IndexableSecuredWebElement;
1243
+ }
1244
+
1199
1245
  interface SystemFacade {
1200
1246
  /**
1201
1247
  * Find an element on the System-level using a system matcher.
@@ -1592,6 +1638,20 @@ declare global {
1592
1638
  toExist(): R;
1593
1639
  }
1594
1640
 
1641
+ interface SecuredWebExpect<R = Promise<void>> {
1642
+ /**
1643
+ * (iOS Only) Negate the expectation.
1644
+ * @example await expect(web.securedElement(by.web.id('sessionTimeout'))).not.toExist();
1645
+ */
1646
+ not: this;
1647
+
1648
+ /**
1649
+ * (iOS Only) Expect the view to exist in the webview DOM tree.
1650
+ * @example await expect(web.securedElement(by.web.id('submitButton'))).toExist();
1651
+ */
1652
+ toExist(): R;
1653
+ }
1654
+
1595
1655
  interface SystemExpect<R = Promise<void>> {
1596
1656
  /**
1597
1657
  * Negate the expectation.
@@ -1608,6 +1668,39 @@ declare global {
1608
1668
  toExist(): R;
1609
1669
  }
1610
1670
 
1671
+ interface SecuredWebElement extends SecuredWebElementActions {
1672
+ }
1673
+
1674
+ interface SecuredWebElementActions {
1675
+ /**
1676
+ * Tap on a secured web element.
1677
+ * @example await web.securedElement(by.web.type('textField')).tap();
1678
+ */
1679
+ tap(): Promise<void>;
1680
+
1681
+ /**
1682
+ * (iOS Only) Type text into a web element.
1683
+ * @param text to type
1684
+ * @param isContentEditable whether the element is content-editable, default is false. Ignored on iOS.
1685
+ * @example await web.securedElement(by.web.type('textField')).typeText('passcode');
1686
+ */
1687
+ typeText(text: string, isContentEditable: boolean): Promise<void>;
1688
+
1689
+ /**
1690
+ * (iOS Only) Replaces the input content with the new text.
1691
+ * @param text to replace with the old content.
1692
+ * @example await web.securedElement(by.web.type('textField')).replaceText('passcode');
1693
+ */
1694
+ replaceText(text: string): Promise<void>;
1695
+
1696
+ /**
1697
+ * (iOS Only) Clears the input content.
1698
+ * @note On Android, not working for content-editable elements.
1699
+ * @example await web.securedElement(by.web.type('textField')).clearText();
1700
+ */
1701
+ clearText(): Promise<void>;
1702
+ }
1703
+
1611
1704
  interface IndexableWebElement extends WebElement {
1612
1705
  /**
1613
1706
  * Choose from multiple elements matching the same matcher using index.
@@ -1616,6 +1709,21 @@ declare global {
1616
1709
  atIndex(index: number): WebElement;
1617
1710
  }
1618
1711
 
1712
+ interface IndexableSecuredWebElement extends SecuredWebElement {
1713
+ /**
1714
+ * Choose from multiple elements matching the same matcher using index.
1715
+ * @example await web.securedElement(by.web.tag('p')).atIndex(2).tap();
1716
+ */
1717
+ atIndex(index: number): SecuredWebElement & SecuredWebElementFacade;
1718
+ }
1719
+
1720
+ interface IndexableMaybeSecuredWebElement {
1721
+ /**
1722
+ * Choose from multiple elements matching the same matcher using index
1723
+ */
1724
+ atIndex(index: number): WebElement & SecuredWebElementFacade;
1725
+ }
1726
+
1619
1727
  interface WebElement extends WebElementActions {
1620
1728
  }
1621
1729
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.22.2",
4
+ "version": "20.23.0-smoke.1",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -115,5 +115,5 @@
115
115
  "browserslist": [
116
116
  "node 14"
117
117
  ],
118
- "gitHead": "09096fb8e7b60eb68e48672a3a6fb19e946eccb7"
118
+ "gitHead": "271dbc8fb836c4edc725e1f6a73f662eceda331a"
119
119
  }
@@ -26,6 +26,10 @@ class WebElement {
26
26
  this.atIndex(0);
27
27
  }
28
28
 
29
+ asSecured() {
30
+ throw new DetoxRuntimeError('asSecured() is not supported for Android WebElement');
31
+ }
32
+
29
33
  atIndex(index) {
30
34
  const webViewElementCall = this[_webViewElement]._call;
31
35
  const webMatcherCall = this[_webMatcher]._call;
@@ -21,6 +21,8 @@ module.exports = {
21
21
  xpath: (value) => new web.XPathMatcher(value),
22
22
  href: (value) => new web.LinkTextMatcher(value),
23
23
  hrefContains: (value) => new web.PartialLinkTextMatcher(value),
24
+ label: (_value) => { throw new DetoxRuntimeError('Label matcher is not supported on Android'); },
25
+ value: (_value) => { throw new DetoxRuntimeError('Value matcher is not supported on Android'); },
24
26
  },
25
27
 
26
28
  system: {
@@ -5,14 +5,14 @@ const environment = require('../utils/environment');
5
5
  const log = require('../utils/logger').child({ cat: 'xcuitest-runner' });
6
6
 
7
7
  class XCUITestRunner {
8
- constructor({ simulatorId }) {
9
- this.simulatorId = simulatorId;
8
+ constructor({ runtimeDevice }) {
9
+ this.runtimeDevice = runtimeDevice;
10
10
  }
11
11
 
12
12
  async execute(invocationParams) {
13
13
  log.trace(
14
14
  { event: 'XCUITEST_RUNNER' },
15
- 'invocation params: %j, simulator id: %s', invocationParams, this.simulatorId
15
+ 'invocation params: %j, simulator id: %s, bundle id: %s', invocationParams, this.runtimeDevice.id, this.runtimeDevice._bundleId
16
16
  );
17
17
 
18
18
  const base64InvocationParams = Buffer.from(JSON.stringify(invocationParams)).toString('base64');
@@ -28,12 +28,16 @@ class XCUITestRunner {
28
28
  const flags = [
29
29
  '-xctestrun', runnerPath,
30
30
  '-sdk', 'iphonesimulator',
31
- '-destination', `"platform=iOS Simulator,id=${this.simulatorId}"`,
31
+ '-destination', `"platform=iOS Simulator,id=${this.runtimeDevice.id}"`,
32
32
  'test-without-building',
33
33
  ];
34
34
 
35
+ log.info(`Running XUICTest runner. See target logs using:\n` +
36
+ `\t/usr/bin/xcrun simctl spawn ${this.runtimeDevice.id} log stream --level debug --style compact ` +
37
+ `--predicate 'process == "DetoxXCUITestRunner-Runner" && subsystem == "com.wix.DetoxXCUITestRunner.xctrunner"'`);
38
+
35
39
  try {
36
- return await exec(`TEST_RUNNER_PARAMS="${base64InvocationParams}" xcodebuild ${flags.join(' ')}`);
40
+ return await exec(`TEST_RUNNER_PARAMS="${base64InvocationParams}" TEST_RUNNER_BUNDLE_ID="${this.runtimeDevice._bundleId}" xcodebuild ${flags.join(' ')}`);
37
41
  } catch (e) {
38
42
  const stdout = e.stdout.toString();
39
43
  const innerError = this.findInnerError(stdout);
@@ -783,7 +783,7 @@ class IosExpect {
783
783
  }
784
784
 
785
785
  if (isWebElement(element)) {
786
- return webExpect(this._invocationManager, element);
786
+ return webExpect(this._invocationManager, this._xcuitestRunner, element);
787
787
  }
788
788
 
789
789
  return expect(this._invocationManager, element);
@@ -807,7 +807,7 @@ class IosExpect {
807
807
  }
808
808
 
809
809
  const webViewElement = matcher ? element(this._invocationManager, this._emitter, matcher) : undefined;
810
- return webElement(this._invocationManager, this._emitter, webViewElement, webMatcher);
810
+ return webElement(this._invocationManager, this._xcuitestRunner, this._emitter, webViewElement, webMatcher);
811
811
  }
812
812
  };
813
813
  }
package/src/ios/web.js CHANGED
@@ -8,14 +8,17 @@ const traceInvocationCall = require('../utils/traceInvocationCall').bind(null, l
8
8
 
9
9
 
10
10
  class WebExpect {
11
- constructor(invocationManager, element) {
11
+ constructor(invocationManager, xcuitestRunner, element) {
12
12
  this._invocationManager = invocationManager;
13
+ this._xcuitestRunner = xcuitestRunner;
13
14
  this.element = element;
14
15
  this.modifiers = [];
15
16
  }
16
17
 
17
18
  toHaveText(text) {
19
+ if (this.element.isSecured) throw new DetoxRuntimeError('toHaveText cannot be used with secured elements');
18
20
  if (typeof text !== 'string') throw new DetoxRuntimeError('text should be a string, but got ' + (text + (' (' + (typeof text + ')'))));
21
+
19
22
  const traceDescription = expectDescription.toHaveText(text);
20
23
  return this.expect('toHaveText', traceDescription, text);
21
24
  }
@@ -51,17 +54,39 @@ class WebExpect {
51
54
 
52
55
  const invocation = this.createInvocation(expectation, ...params);
53
56
  traceDescription = expectDescription.full(traceDescription, this.modifiers.includes('not'));
54
- return _executeInvocation(this._invocationManager, invocation, traceDescription);
57
+
58
+ const invocationRunner = this.element.isSecured ? this._xcuitestRunner : this._invocationManager;
59
+ return _executeInvocation(invocationRunner, invocation, traceDescription);
55
60
  }
56
61
  }
57
62
 
58
63
  class WebElement {
59
- constructor(invocationManager, emitter, webViewElement, matcher, index) {
64
+ constructor(invocationManager, xcuitestRunner, emitter, webViewElement, matcher, index) {
60
65
  this._invocationManager = invocationManager;
66
+ this._xcuitestRunner = xcuitestRunner;
61
67
  this._emitter = emitter;
62
68
  this.webViewElement = webViewElement;
63
69
  this.matcher = matcher;
64
70
  this.index = index;
71
+ this.isSecured = false;
72
+ }
73
+
74
+ asSecured() {
75
+ const supportedMatcherTypes = ['label', 'type'];
76
+ const matcherType = this.matcher.predicate.type;
77
+
78
+ if (!supportedMatcherTypes.includes(matcherType)) {
79
+ throw new DetoxRuntimeError(`Only matchers of type ${supportedMatcherTypes.join(', ')} can be secured, got ${matcherType}`);
80
+ }
81
+
82
+ this.isSecured = true;
83
+ return this;
84
+ }
85
+
86
+ assertUnsecured() {
87
+ if (this.isSecured) {
88
+ throw new DetoxRuntimeError('This action is not supported on secured elements');
89
+ }
65
90
  }
66
91
 
67
92
  atIndex(index) {
@@ -91,11 +116,15 @@ class WebElement {
91
116
  }
92
117
 
93
118
  selectAllText() {
119
+ this.assertUnsecured();
120
+
94
121
  const traceDescription = webViewActionDescription.selectAllText();
95
122
  return this.withAction('selectAllText', traceDescription);
96
123
  }
97
124
 
98
125
  async getText() {
126
+ this.assertUnsecured();
127
+
99
128
  const traceDescription = webViewActionDescription.getText();
100
129
  let result = await this.withAction('getText', traceDescription);
101
130
  return this.extractResult(result, { type: 'text' });
@@ -118,21 +147,29 @@ class WebElement {
118
147
  }
119
148
 
120
149
  scrollToView() {
150
+ this.assertUnsecured();
151
+
121
152
  const traceDescription = webViewActionDescription.scrollToView();
122
153
  return this.withAction('scrollToView', traceDescription);
123
154
  }
124
155
 
125
156
  focus() {
157
+ this.assertUnsecured();
158
+
126
159
  const traceDescription = webViewActionDescription.focus();
127
160
  return this.withAction('focus', traceDescription);
128
161
  }
129
162
 
130
163
  moveCursorToEnd() {
164
+ this.assertUnsecured();
165
+
131
166
  const traceDescription = webViewActionDescription.moveCursorToEnd();
132
167
  return this.withAction('moveCursorToEnd', traceDescription);
133
168
  }
134
169
 
135
170
  async runScript(script, args) {
171
+ this.assertUnsecured();
172
+
136
173
  if (args !== undefined && args.length !== 0) {
137
174
  return await this.runScriptWithArgs(script, args);
138
175
  }
@@ -147,6 +184,8 @@ class WebElement {
147
184
  }
148
185
 
149
186
  async runScriptWithArgs(script, args) {
187
+ this.assertUnsecured();
188
+
150
189
  if (typeof script === 'function') {
151
190
  script = script.toString();
152
191
  }
@@ -157,12 +196,16 @@ class WebElement {
157
196
  }
158
197
 
159
198
  async getCurrentUrl() {
199
+ this.assertUnsecured();
200
+
160
201
  const traceDescription = webViewActionDescription.getCurrentUrl();
161
202
  let result = await this.withAction('getCurrentUrl', traceDescription);
162
203
  return this.extractResult(result, { type: 'url' });
163
204
  }
164
205
 
165
206
  async getTitle() {
207
+ this.assertUnsecured();
208
+
166
209
  const traceDescription = webViewActionDescription.getTitle();
167
210
  let result = await this.withAction('getTitle', traceDescription);
168
211
  return this.extractResult(result, { type: 'title' });
@@ -183,7 +226,9 @@ class WebElement {
183
226
  ...(params.length !== 0 && { params }),
184
227
  };
185
228
  traceDescription = webViewActionDescription.full(traceDescription);
186
- return _executeInvocation(this._invocationManager, invocation, traceDescription);
229
+
230
+ const invocationRunner = this.isSecured ? this._xcuitestRunner : this._invocationManager;
231
+ return _executeInvocation(invocationRunner, invocation, traceDescription);
187
232
  }
188
233
  }
189
234
 
@@ -247,18 +292,24 @@ class WebElementMatcher {
247
292
  this.predicate = { type: 'value', value: value.toString() };
248
293
  return this;
249
294
  }
295
+
296
+ type(type) {
297
+ if (typeof type !== 'string') throw new DetoxRuntimeError('type should be a string, but got ' + (type + (' (' + (typeof type + ')'))));
298
+ this.predicate = { type: 'type', value: type.toString() };
299
+ return this;
300
+ }
250
301
  }
251
302
 
252
303
  function webMatcher() {
253
304
  return new WebElementMatcher();
254
305
  }
255
306
 
256
- function webElement(invocationManager, emitter, webViewElement, matcher) {
307
+ function webElement(invocationManager, xcuitestRunner, emitter, webViewElement, matcher) {
257
308
  if (!(matcher instanceof WebElementMatcher)) {
258
309
  throwWebViewMatcherError(matcher);
259
310
  }
260
311
 
261
- return new WebElement(invocationManager, emitter, webViewElement, matcher);
312
+ return new WebElement(invocationManager, xcuitestRunner, emitter, webViewElement, matcher);
262
313
  }
263
314
 
264
315
  function throwWebViewMatcherError(param) {
@@ -266,8 +317,8 @@ function throwWebViewMatcherError(param) {
266
317
  throw new DetoxRuntimeError(`${paramDescription} is not a Detox web-view matcher. More about web-view matchers here: https://wix.github.io/Detox/docs/api/webviews`);
267
318
  }
268
319
 
269
- function webExpect(invocationManager, element) {
270
- return new WebExpect(invocationManager, element);
320
+ function webExpect(invocationManager, xcuitestRunner, element) {
321
+ return new WebExpect(invocationManager, xcuitestRunner, element);
271
322
  }
272
323
 
273
324
  function _executeInvocation(invocationManager, invocation, traceDescription) {
@@ -15,7 +15,7 @@ class Ios extends MatchersFactory {
15
15
  createMatchers({ invocationManager, runtimeDevice, eventEmitter }) {
16
16
  const IosExpect = require('../../ios/expectTwo');
17
17
  const XCUITestRunner = require('../../ios/XCUITestRunner');
18
- const xcuitestRunner = new XCUITestRunner({ simulatorId: runtimeDevice.id });
18
+ const xcuitestRunner = new XCUITestRunner({ runtimeDevice: runtimeDevice });
19
19
 
20
20
  return new IosExpect({
21
21
  invocationManager,
@@ -1 +0,0 @@
1
- ea08f3a68d1112fc56ed8df12114ae54
@@ -1 +0,0 @@
1
- 0956d6463084593a4f0694727e025c3a22ca9123
@@ -1 +0,0 @@
1
- 7154ea985be2114348b9686da274a758ca1c7c6da78e93680c25f9f1848ab9c2
@@ -1 +0,0 @@
1
- 964bc837c2228b684628df20f26db6729e9e7cc20618e924638666c060b85bef95b9ba864acbe423aee60500dc1dc58c608db4a9823747ecf14b5d8068f7c1a0
@@ -1 +0,0 @@
1
- 4a34b34e2a20984d7e5e6473d53bb640
@@ -1 +0,0 @@
1
- 0ccebc4abb4aadeb5bac90d126d244cda49a05ad
@@ -1 +0,0 @@
1
- 580c1340a3373fa6a804a2af4a61e3b0f3ae87fd613e9ff633a7bcb955b33e8d
@@ -1 +0,0 @@
1
- e4879f20162bb5ad5dcc5591e786c52458d027f02794d2bc14dbf3bb5d86ef4bab43083d4666c7a30cca2399ba791ce5e02566ff201731eac5d4d8e92db9ac30
@@ -1 +0,0 @@
1
- 95b110f61b318a206c15bade760c7f05
@@ -1 +0,0 @@
1
- e7248606d5870b157db69ac37bd1be492c04210d
@@ -1 +0,0 @@
1
- a9702f1d73785120f459b8a6eb2cbca303f540a6444cfcd55fc3554f6f3b923c
@@ -1 +0,0 @@
1
- 3d8bd0ee9aa2f8031c5c76acb7a90ae67d6a62f8c3780e0dccd91248c0ad7199aeb972c8975b725d373e8a4a7b6591b188a601b2e6f35b940f3405392ac2077c
@@ -1 +0,0 @@
1
- a51d799995d46408f94bf3462823f6a6
@@ -1 +0,0 @@
1
- 921a0f59c4f8c0b860e61228e16c47b0f2f3b8f1
@@ -1 +0,0 @@
1
- 374e4d719e6e2038fb81e5d5b780d817723aef9ceabd9f6e4a37d7c5a1255e1d
@@ -1 +0,0 @@
1
- dce9aeeab458a836abc879fbc1528277c82835b2f54e923e6e3ddb8eac409a82239a3e90f0c900ada967ab4300b555ae4809908b11fdbc4945cf68f4d7b80a06