detox 20.22.1 → 20.23.0-smoke.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1-sources.jar → 20.23.0-smoke.0/detox-20.23.0-smoke.0-sources.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0-sources.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0-sources.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0-sources.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0-sources.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.pom → 20.23.0-smoke.0/detox-20.23.0-smoke.0.pom} +1 -1
  7. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0.pom.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0.pom.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0.pom.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.23.0-smoke.0/detox-20.23.0-smoke.0.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.1/detox-legacy-20.22.1-sources.jar → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0-sources.jar} +0 -0
  17. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0-sources.jar.md5 +1 -0
  18. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0-sources.jar.sha1 +1 -0
  19. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0-sources.jar.sha256 +1 -0
  20. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0-sources.jar.sha512 +1 -0
  21. package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.pom → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.pom} +1 -1
  22. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.pom.md5 +1 -0
  23. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.pom.sha1 +1 -0
  24. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.pom.sha256 +1 -0
  25. package/Detox-android/com/wix/detox-legacy/20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.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/scripts/pack_ios.sh +13 -9
  37. package/src/android/core/WebElement.js +4 -0
  38. package/src/android/matchers/index.js +2 -0
  39. package/src/ios/XCUITestRunner.js +9 -5
  40. package/src/ios/expectTwo.js +2 -2
  41. package/src/ios/web.js +59 -8
  42. package/src/matchers/factories/index.js +1 -1
  43. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1-sources.jar.md5 +0 -1
  44. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1-sources.jar.sha1 +0 -1
  45. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1-sources.jar.sha256 +0 -1
  46. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1-sources.jar.sha512 +0 -1
  47. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1.pom.md5 +0 -1
  48. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1.pom.sha1 +0 -1
  49. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1.pom.sha256 +0 -1
  50. package/Detox-android/com/wix/detox/20.22.1/detox-20.22.1.pom.sha512 +0 -1
  51. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1-sources.jar.md5 +0 -1
  52. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1-sources.jar.sha1 +0 -1
  53. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1-sources.jar.sha256 +0 -1
  54. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1-sources.jar.sha512 +0 -1
  55. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1.pom.md5 +0 -1
  56. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1.pom.sha1 +0 -1
  57. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1.pom.sha256 +0 -1
  58. package/Detox-android/com/wix/detox-legacy/20.22.1/detox-legacy-20.22.1.pom.sha512 +0 -1
  59. /package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.aar → 20.23.0-smoke.0/detox-20.23.0-smoke.0.aar} +0 -0
  60. /package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.aar.md5 → 20.23.0-smoke.0/detox-20.23.0-smoke.0.aar.md5} +0 -0
  61. /package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.aar.sha1 → 20.23.0-smoke.0/detox-20.23.0-smoke.0.aar.sha1} +0 -0
  62. /package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.aar.sha256 → 20.23.0-smoke.0/detox-20.23.0-smoke.0.aar.sha256} +0 -0
  63. /package/Detox-android/com/wix/detox/{20.22.1/detox-20.22.1.aar.sha512 → 20.23.0-smoke.0/detox-20.23.0-smoke.0.aar.sha512} +0 -0
  64. /package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.aar → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.aar} +0 -0
  65. /package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.aar.md5 → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.aar.md5} +0 -0
  66. /package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.aar.sha1 → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.aar.sha1} +0 -0
  67. /package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.aar.sha256 → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.aar.sha256} +0 -0
  68. /package/Detox-android/com/wix/detox-legacy/{20.22.1/detox-legacy-20.22.1.aar.sha512 → 20.23.0-smoke.0/detox-legacy-20.23.0-smoke.0.aar.sha512} +0 -0
@@ -0,0 +1 @@
1
+ 35960dfcb6e053dbdd1cddf842f8a932
@@ -0,0 +1 @@
1
+ 280b11f2addf683c2a11d09d555079ca891aba5d
@@ -0,0 +1 @@
1
+ 24dc946bbdc697e12f43d81d9867e5c5e713c88c93badd195e16874d9a0e865c
@@ -0,0 +1 @@
1
+ 3446f3c4f924dc988149f58cfe0bc89a20720dfa81d2317bd74d30b3cf292da013d0a5a3f5f36f8621c05beb7917b524a15fdb97ed2ab53d234d7008a05f67fd
@@ -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.1</version>
6
+ <version>20.23.0-smoke.0</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
+ 01b16d5926dc555cc5aca7c9501c2f7f
@@ -0,0 +1 @@
1
+ da14af43696da5fd72561d49f7bef89a86d76bd5
@@ -0,0 +1 @@
1
+ 6a8709f6a239e043a22435da51ef90f7d19ea6a95c526c14e0c2b211469d6d5b
@@ -0,0 +1 @@
1
+ 5bc04cef0eae6bdd6fdb51e94afa336c9f7758a90746ad1391360ea8dd1222e8157577e0518fea9d045061e20bc67edbbe0965846419d0e84f09e185764fbc0f
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.22.1</latest>
7
- <release>20.22.1</release>
6
+ <latest>20.23.0-smoke.0</latest>
7
+ <release>20.23.0-smoke.0</release>
8
8
  <versions>
9
- <version>20.22.1</version>
9
+ <version>20.23.0-smoke.0</version>
10
10
  </versions>
11
- <lastUpdated>20240522140456</lastUpdated>
11
+ <lastUpdated>20240610043639</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- be375cfc5f6f5d52ccd52744de282b44
1
+ 143a2d3e3c326e37422bc57b233be521
@@ -1 +1 @@
1
- b5e4ab1628b01486489fd6889ab1bee10df43ca2
1
+ e23ee18844ac5e3c0aab78a8ee990282083ac459
@@ -1 +1 @@
1
- 14de207023f462ae370425b1669b6d13e5a02160d3a7f7b581b25ff113fc28cf
1
+ 3f7034ec2947d54dbaba93f26ef2fdd044020834c570958bba0af2f05272a716
@@ -1 +1 @@
1
- 591f800135fe68cdb99f56ea49997a74e5c353b1ecf77a70a0e3a779f33b4f174a1b478361056b349bdd4f966e1aa0437a168abf5f2dd74c8faa042317a8d7df
1
+ 72bc4724d4bab46f6cda6469072b2093b08b3a88786b7ee11eab97509b129a842b8b5a111b310d9e0130bda31e03d83c4c04633e4b7ca4bb54d08afc9c5e64de
@@ -0,0 +1 @@
1
+ fb8a89ec2730d466a946e144df0bdc48fc441da6cc14ca38c8bce43922a524aa
@@ -0,0 +1 @@
1
+ 0f0dce8745a13baf07808c178751d19f2d667d921e6a4b05d983b2c6a31828dfc23c439b918123e82130cb52855fd591068ba021c12104aaf1a1d3271bea3115
@@ -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.1</version>
6
+ <version>20.23.0-smoke.0</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
+ 8658c9475bc816f19537d92d9c3d077d75610a94
@@ -0,0 +1 @@
1
+ d246e00073b7f935fe20c0a708c34f707503d5f052d520e36689ad4db34cd9ff
@@ -0,0 +1 @@
1
+ 141f3b5854900d41b777a0110edbb1aa9cac6703ca28ecfc5b07a0aa10e270eaa3d1c53fccd095c7290a0ebd9ea648181a63c6532ecc5e9a7c0ea6588139f214
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox-legacy</artifactId>
5
5
  <versioning>
6
- <latest>20.22.1</latest>
7
- <release>20.22.1</release>
6
+ <latest>20.23.0-smoke.0</latest>
7
+ <release>20.23.0-smoke.0</release>
8
8
  <versions>
9
- <version>20.22.1</version>
9
+ <version>20.23.0-smoke.0</version>
10
10
  </versions>
11
- <lastUpdated>20240522140527</lastUpdated>
11
+ <lastUpdated>20240610043752</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- d800dd5b49eac3eb61df71c2f4609c6b
1
+ 237e4dabfdb650076ff4d4516c642737
@@ -1 +1 @@
1
- 351f9fb4f8c062897ded72817f766ec70fa3efcd
1
+ 6d65e7dbd88a65a18b29567f074c8ab1d979332e
@@ -1 +1 @@
1
- 54d45c0fc44b6e69c9fb7db576f8792b9d47bbd9fda8cc9e951c9282a2c53ab3
1
+ 6e53c962e3829538ae724dc1cb2e1b7a70a246ca075fa26ede1d661857ecbb92
@@ -1 +1 @@
1
- fa3890f141a927f269a7f2e4d807a65f9a2a4171c745858898229e826249ec830a6fbfae74eeb23e9602c6e40d274fc42f9c937bd3667f9784c36ef82d3da980
1
+ e943c05deacc50394255d977b8409d46826419511dff50638810f1ee6c1436748af91b51bedef06ba1ed82b1d59389f7aca75eecc65b40138c1e96825b78de0e
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
+ __securedWeb__: any; // prevent type coercion
1185
+ }
1186
+
1187
+ interface MaybeSecuredWebMatcher {
1188
+ __maybeSecuredWeb__: 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.1",
4
+ "version": "20.23.0-smoke.0",
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": "20413288382d53854fe485784683117490e203c4"
118
+ "gitHead": "9bf6700bebfd49e49927cad7cf8b4ddd0731eb67"
119
119
  }
@@ -15,18 +15,22 @@ cd ..
15
15
  echo "Packaging iOS sources and prebuilt frameworks"
16
16
 
17
17
  # Create temp build directory
18
- mkdir build_temp
18
+ mkdir build_temp_framework
19
19
 
20
20
  # Package prebuilt framework
21
- scripts/build_framework.ios.sh "ios/Detox.xcodeproj" "build_temp"
21
+ scripts/build_framework.ios.sh "ios/Detox.xcodeproj" "build_temp_framework"
22
+ cd build_temp_framework
23
+ tar --exclude-from=../ios/.tbzignore -cjf ../Detox-ios-framework.tbz .
24
+ cd ..
25
+ rm -rf build_temp_framework
22
26
 
23
- # Package prebuilt XCUITest runner
24
- scripts/build_xcuitest.ios.sh "ios/DetoxXCUITestRunner/DetoxXCUITestRunner.xcodeproj" "build_temp"
25
27
 
26
- cd build_temp
28
+ # Create temp build directory
29
+ mkdir build_temp_xcuitest
30
+
31
+ # Package prebuilt XCUITest runner
32
+ scripts/build_xcuitest.ios.sh "ios/DetoxXCUITestRunner/DetoxXCUITestRunner.xcodeproj" "build_temp_xcuitest"
33
+ cd build_temp_xcuitest
27
34
  tar --exclude-from=../ios/.tbzignore -cjf ../Detox-ios-xcuitest.tbz .
28
- tar --exclude-from=../ios/.tbzignore -cjf ../Detox-ios-framework.tbz .
29
35
  cd ..
30
-
31
- # Cleanup
32
- rm -fr build_temp
36
+ rm -rf build_temp_xcuitest
@@ -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
- 12fc5f8f5320722c32cec05913e1ea6b
@@ -1 +0,0 @@
1
- 6c359a3d909e73c7a186d15a480de5d523803c0d
@@ -1 +0,0 @@
1
- f7a62fd36fa62076f9273972eea7319f13a4ecc89b87efdf766523ba3a1b1b59
@@ -1 +0,0 @@
1
- 27fca15dfea754479b3d4932c65e57a305822286a148f4ed496be8726650c612367529ac6d7bf1f959086a674513ae141523fa4ada8480fc170518261d7b4292
@@ -1 +0,0 @@
1
- 6d487956856369ba599fef5ba68a73c9
@@ -1 +0,0 @@
1
- eaeeac7afa38642e32dd5e36396d78c724842a19
@@ -1 +0,0 @@
1
- 0ac8080eaaf88cc82d30ed366786ab6c0023e591b33d3857e935fd34eb73ed19
@@ -1 +0,0 @@
1
- a60debc9e9267c3fa18c7a71539c6b35d4d2e60def71a08ba72a584217c602db2eac2c79c83a30beddea7d6b08fc2ac052bf9588660171c43dccab53ff314615
@@ -1 +0,0 @@
1
- 68151b450b19bd10ebc8119f7a9382a5
@@ -1 +0,0 @@
1
- 55a0ede0c449fd4b7fca263566dfaa1dd0eb19ab
@@ -1 +0,0 @@
1
- 7b6e5ee416c4d6d7dfc834fdd59600f429c3abf51f12b038f8083bce6f9cf7dd
@@ -1 +0,0 @@
1
- 5faae34c57ba69628bb52fdb7dac52f85a8388977e316029525b66fb19a4d317574b847b280c23269b62b1d615b4e7f8bc0fcffd8c69c379a33b6378acbd4562
@@ -1 +0,0 @@
1
- 68ca5e83cbe1ded287a19e9e32b06982
@@ -1 +0,0 @@
1
- d1dfc9a900e3adc43218535a9461e47d9128aea5
@@ -1 +0,0 @@
1
- d507b9f1814be25348eb81707b668aaf44f212b7a17bbb2597a9bc174f3f4e60
@@ -1 +0,0 @@
1
- 654a047e166839fed9b651bd1b1f22005b8d8b2d7ccfd0e4e43afb9d87f48a6d3e6d9375f6a71b0384443f65b61daf06475b7c526ebd263f99b8e80e28a09091