@testspectra/cli 1.1.8-rc.1 → 1.1.8-rc.3

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 (188) hide show
  1. package/bin/.testspectra-runner.hash +1 -1
  2. package/bin/spectra.js +0 -0
  3. package/bin/{testspectra-runner → testspectra-runner.exe} +0 -0
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/commands/__tests__/run-e2e.test.js +49 -49
  6. package/dist/commands/init.js +148 -148
  7. package/dist/commands/test.js +29 -1
  8. package/dist/index.js +11 -11
  9. package/dist/linter/__tests__/component-test-imports.test.js +51 -51
  10. package/dist/linter/__tests__/spec-schema.test.js +167 -167
  11. package/dist/linter/schemas/spec.schema.d.ts +8 -8
  12. package/dist/linter/schemas/suite.schema.d.ts +4 -4
  13. package/dist/reporter/semantic-formatter.js +5 -0
  14. package/package.json +4 -4
  15. package/templates/default/CLAUDE.md +16 -16
  16. package/templates/default/global-hooks/after/mobile.hook.ts +3 -3
  17. package/templates/default/global-hooks/after/web.hook.ts +3 -3
  18. package/templates/default/global-hooks/before/mobile.hook.ts +3 -3
  19. package/templates/default/global-hooks/before/web.hook.ts +3 -3
  20. package/templates/default/package.json +2 -2
  21. package/templates/default/page-objects/AuthPage/mobile.ts +5 -5
  22. package/templates/default/page-objects/AuthPage/web.ts +10 -10
  23. package/templates/default/page-objects/MatchersPage/mobile.ts +70 -70
  24. package/templates/default/page-objects/MatchersPage/web.ts +43 -43
  25. package/templates/default/page-objects/NavigationPage/mobile.ts +14 -14
  26. package/templates/default/page-objects/NavigationPage/web.ts +8 -8
  27. package/templates/default/page-objects/PlaygroundPage/mobile.ts +42 -42
  28. package/templates/default/page-objects/PlaygroundPage/web.ts +31 -31
  29. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -53
  30. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -19
  31. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -31
  32. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -3
  33. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -3
  34. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +27 -27
  35. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -19
  36. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -26
  37. package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +30 -30
  38. package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -22
  39. package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -27
  40. package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -20
  41. package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -24
  42. package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -26
  43. package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -37
  44. package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -21
  45. package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -29
  46. package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -16
  47. package/templates/default/specs/ApiInterception/suite.md +10 -10
  48. package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -30
  49. package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -23
  50. package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -16
  51. package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -28
  52. package/templates/default/specs/ApiSeeding/suite.md +9 -9
  53. package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/mobile.test.ts +7 -7
  54. package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/spec.md +19 -19
  55. package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/web.test.ts +9 -9
  56. package/templates/default/specs/Authentication/suite.md +9 -9
  57. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +9 -9
  58. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +17 -17
  59. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +19 -19
  60. package/templates/default/specs/BrowserContext/TC-0022-history-navigation/mobile.test.ts +17 -17
  61. package/templates/default/specs/BrowserContext/TC-0022-history-navigation/spec.md +28 -28
  62. package/templates/default/specs/BrowserContext/TC-0022-history-navigation/web.test.ts +26 -26
  63. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/common.test.ts +26 -26
  64. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +19 -19
  65. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +11 -11
  66. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +17 -17
  67. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +11 -11
  68. package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/common.test.ts +14 -14
  69. package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/spec.md +21 -21
  70. package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -28
  71. package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -29
  72. package/templates/default/specs/DeepLink/suite.md +9 -9
  73. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +11 -11
  74. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +17 -17
  75. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +11 -11
  76. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +29 -29
  77. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +19 -19
  78. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +29 -29
  79. package/templates/default/specs/ElementMatchers/suite.md +10 -10
  80. package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -5
  81. package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -16
  82. package/templates/default/specs/EnvironmentConfig/suite.md +9 -9
  83. package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -26
  84. package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -22
  85. package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -13
  86. package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -20
  87. package/templates/default/specs/PermissionRationale/suite.md +9 -9
  88. package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +6 -6
  89. package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +18 -18
  90. package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +6 -6
  91. package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +6 -6
  92. package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +18 -18
  93. package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +6 -6
  94. package/templates/default/spectra.config.ts +52 -52
  95. package/templates/default/support/actions/fillCredentials/mobile.action.ts +4 -4
  96. package/templates/default/support/actions/fillCredentials/web.action.ts +4 -4
  97. package/templates/default/support/actions/seedSession/mobile.action.ts +9 -9
  98. package/templates/default/support/actions/seedSession/web.action.ts +13 -13
  99. package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +5 -5
  100. package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +5 -5
  101. package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +6 -6
  102. package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +6 -6
  103. package/templates/nx/.nx/workspace-data/{70094CFD-E89B-57A1-9619-2FC5F4963C54.db-shm → 59842386-c7c4-44ca-b2c2-20e1700bd13d.db-shm} +0 -0
  104. package/templates/nx/.nx/workspace-data/{70094CFD-E89B-57A1-9619-2FC5F4963C54.db-wal → 59842386-c7c4-44ca-b2c2-20e1700bd13d.db-wal} +0 -0
  105. package/templates/nx/.nx/workspace-data/d/daemon.log +1612 -5388
  106. package/templates/nx/.nx/workspace-data/d/server-process.json +1 -1
  107. package/templates/nx/.nx/workspace-data/file-map.json +115 -115
  108. package/templates/nx/.nx/workspace-data/lockfile.hash +1 -1
  109. package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
  110. package/templates/nx/.nx/workspace-data/parsed-lock-file.json +535 -535
  111. package/templates/nx/.nx/workspace-data/project-graph.json +584 -584
  112. package/templates/nx/CLAUDE.md +10 -10
  113. package/templates/nx/package.json +2 -2
  114. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -27
  115. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -27
  116. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +24 -24
  117. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -24
  118. package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +3 -3
  119. package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +19 -19
  120. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +3 -3
  121. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +17 -17
  122. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +3 -3
  123. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +11 -11
  124. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +3 -3
  125. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +11 -11
  126. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +3 -3
  127. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +29 -29
  128. package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -5
  129. package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -16
  130. package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/suite.md +9 -9
  131. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/mobile.test.ts +3 -3
  132. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +6 -6
  133. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +3 -3
  134. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +6 -6
  135. package/templates/nx/pnpm-lock.yaml +6663 -6663
  136. package/templates/nx/pnpm-workspace.yaml +9 -9
  137. package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +33 -33
  138. package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +91 -91
  139. package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +5 -5
  140. package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +8 -8
  141. package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +26 -26
  142. package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +31 -31
  143. package/templates/nx/shared/testing/project.json +19 -19
  144. package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +4 -4
  145. package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +4 -4
  146. package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +3 -3
  147. package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +5 -5
  148. package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +4 -4
  149. package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +6 -6
  150. package/templates/nx/spectra.config.ts +52 -52
  151. package/templates/react-component/.cursorrules +17 -17
  152. package/templates/react-component/.vscode/extensions.json +5 -5
  153. package/templates/react-component/CLAUDE.md +14 -14
  154. package/templates/react-component/README.md +69 -69
  155. package/templates/react-component/fixtures/component-mock.json +12 -12
  156. package/templates/react-component/global-hooks/after/web.hook.ts +3 -3
  157. package/templates/react-component/global-hooks/before/web.hook.ts +3 -3
  158. package/templates/react-component/package.json +27 -27
  159. package/templates/react-component/page-objects/BadgeComponent/web.ts +23 -23
  160. package/templates/react-component/page-objects/ButtonComponent/web.ts +23 -23
  161. package/templates/react-component/page-objects/InputComponent/web.ts +13 -13
  162. package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/spec.md +18 -18
  163. package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/web.test.tsx +11 -11
  164. package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/spec.md +18 -18
  165. package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/web.test.tsx +10 -10
  166. package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/spec.md +18 -18
  167. package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/web.test.tsx +16 -16
  168. package/templates/react-component/specs/BadgeComponent/suite.md +12 -12
  169. package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/spec.md +19 -19
  170. package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/web.test.tsx +28 -28
  171. package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/spec.md +19 -19
  172. package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/web.test.tsx +22 -22
  173. package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/spec.md +18 -18
  174. package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/web.test.tsx +8 -8
  175. package/templates/react-component/specs/ButtonComponent/suite.md +12 -12
  176. package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/spec.md +20 -20
  177. package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/web.test.tsx +28 -28
  178. package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/spec.md +18 -18
  179. package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/web.test.tsx +9 -9
  180. package/templates/react-component/specs/InputComponent/suite.md +12 -12
  181. package/templates/react-component/spectra.config.ts +27 -27
  182. package/templates/react-component/src/components/Badge/Badge.tsx +60 -60
  183. package/templates/react-component/src/components/Button/Button.tsx +57 -57
  184. package/templates/react-component/src/components/Input/Input.tsx +41 -41
  185. package/templates/react-component/src/test-utils.tsx +23 -23
  186. package/templates/react-component/support/actions/fillInputField/web.action.ts +9 -9
  187. package/templates/react-component/support/steps/verifyButtonState/web.step.ts +12 -12
  188. /package/templates/nx/.nx/workspace-data/{70094CFD-E89B-57A1-9619-2FC5F4963C54.db → 59842386-c7c4-44ca-b2c2-20e1700bd13d.db} +0 -0
@@ -14,36 +14,36 @@ export declare const SuiteFrontmatterSchema: z.ZodEffects<z.ZodObject<{
14
14
  tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
15
  }, "strip", z.ZodTypeAny, {
16
16
  id: string;
17
+ name?: string | undefined;
17
18
  status?: "active" | "draft" | "deprecated" | undefined;
18
19
  title?: string | undefined;
19
- name?: string | undefined;
20
20
  tags?: string[] | undefined;
21
21
  description?: string | undefined;
22
22
  executionOrder?: number | undefined;
23
23
  parallel?: boolean | undefined;
24
24
  }, {
25
25
  id: string;
26
+ name?: string | undefined;
26
27
  status?: "active" | "draft" | "deprecated" | undefined;
27
28
  title?: string | undefined;
28
- name?: string | undefined;
29
29
  tags?: string[] | undefined;
30
30
  description?: string | undefined;
31
31
  executionOrder?: number | undefined;
32
32
  parallel?: boolean | undefined;
33
33
  }>, {
34
34
  id: string;
35
+ name?: string | undefined;
35
36
  status?: "active" | "draft" | "deprecated" | undefined;
36
37
  title?: string | undefined;
37
- name?: string | undefined;
38
38
  tags?: string[] | undefined;
39
39
  description?: string | undefined;
40
40
  executionOrder?: number | undefined;
41
41
  parallel?: boolean | undefined;
42
42
  }, {
43
43
  id: string;
44
+ name?: string | undefined;
44
45
  status?: "active" | "draft" | "deprecated" | undefined;
45
46
  title?: string | undefined;
46
- name?: string | undefined;
47
47
  tags?: string[] | undefined;
48
48
  description?: string | undefined;
49
49
  executionOrder?: number | undefined;
@@ -50,6 +50,11 @@ function formatCollectionTarget(target) {
50
50
  export function formatAction(actionKey, target, args = {}) {
51
51
  const el = formatElementTarget(target);
52
52
  switch (actionKey) {
53
+ // Component testing only (@testspectra/react's Spectra.mount()) — target is a component name,
54
+ // not a DOM selector, so it's rendered plainly rather than through formatElementTarget's
55
+ // `element "..."` wrapping.
56
+ case 'mount':
57
+ return `Mount component "${extractTargetString(target) || '{component}'}"`;
53
58
  case 'click':
54
59
  return `Click on ${el}`;
55
60
  case 'doubleClick':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testspectra/cli",
3
- "version": "1.1.8-rc.1",
3
+ "version": "1.1.8-rc.3",
4
4
  "description": "TestSpectra Zero-Config Cross-Platform Test Runner CLI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -35,9 +35,9 @@
35
35
  ],
36
36
  "dependencies": {
37
37
  "@clack/prompts": "catalog:",
38
- "@testspectra/matchers": "^1.1.8-rc.1",
39
- "@testspectra/react": "workspace:*",
40
- "@testspectra/skills": "^1.1.8-rc.1",
38
+ "@testspectra/matchers": "^1.1.8-rc.3",
39
+ "@testspectra/react": "^1.1.8-rc.3",
40
+ "@testspectra/skills": "^1.1.8-rc.3",
41
41
  "chalk": "catalog:",
42
42
  "commander": "catalog:",
43
43
  "dotenv": "catalog:",
@@ -1,16 +1,16 @@
1
- # CLAUDE.md - TestSpectra Framework Conventions
2
-
3
- ## Commands
4
- - Run all Web tests: `pnpm test:web` (or `spectra run -t web`)
5
- - Run all Mobile tests: `pnpm test:mobile` (or `spectra run -t mobile`)
6
- - Run Android tests: `pnpm test:android` (or `spectra run -t android`)
7
- - Run iOS tests: `pnpm test:ios` (or `spectra run -t ios`)
8
- - Run specific spec: `spectra run "specs/Playground/TC-0001-form-controls/mobile.test.ts" -t mobile`
9
- - Type checking: `pnpm type-check` (or `tsc -b`)
10
- - Preflight doctor: `pnpm doctor` (or `spectra doctor`)
11
- - Sync ambient types: `pnpm sync-types`
12
-
13
- ## Element Selectors
14
- - `~name` → **accessibility id** (Android `content-desc`, RN `accessibilityLabel`, web `aria-label`) — the portable default.
15
- - `#name` → **native id** (Android `resource-id`, RN `testID`, web CSS `id`).
16
- - Each prefix maps to exactly one attribute (no silent cross-matching). Prefer `~` for user-perceivable elements, `#` for stable test ids. See `docs/v2/cli/selectors.md`.
1
+ # CLAUDE.md - TestSpectra Framework Conventions
2
+
3
+ ## Commands
4
+ - Run all Web tests: `pnpm test:web` (or `spectra run -t web`)
5
+ - Run all Mobile tests: `pnpm test:mobile` (or `spectra run -t mobile`)
6
+ - Run Android tests: `pnpm test:android` (or `spectra run -t android`)
7
+ - Run iOS tests: `pnpm test:ios` (or `spectra run -t ios`)
8
+ - Run specific spec: `spectra run "specs/Playground/TC-0001-form-controls/mobile.test.ts" -t mobile`
9
+ - Type checking: `pnpm type-check` (or `tsc -b`)
10
+ - Preflight doctor: `pnpm doctor` (or `spectra doctor`)
11
+ - Sync ambient types: `pnpm sync-types`
12
+
13
+ ## Element Selectors
14
+ - `~name` → **accessibility id** (Android `content-desc`, RN `accessibilityLabel`, web `aria-label`) — the portable default.
15
+ - `#name` → **native id** (Android `resource-id`, RN `testID`, web CSS `id`).
16
+ - Each prefix maps to exactly one attribute (no silent cross-matching). Prefer `~` for user-perceivable elements, `#` for stable test ids. See `docs/v2/cli/selectors.md`.
@@ -1,3 +1,3 @@
1
- export default async function () {
2
- // Global mobile teardown
3
- }
1
+ export default async function () {
2
+ // Global mobile teardown
3
+ }
@@ -1,3 +1,3 @@
1
- export default async function () {
2
- // Global web teardown
3
- }
1
+ export default async function () {
2
+ // Global web teardown
3
+ }
@@ -1,3 +1,3 @@
1
- export default async function () {
2
- // Global mobile initialization
3
- }
1
+ export default async function () {
2
+ // Global mobile initialization
3
+ }
@@ -1,3 +1,3 @@
1
- export default async function () {
2
- // Global web initialization
3
- }
1
+ export default async function () {
2
+ // Global web initialization
3
+ }
@@ -17,8 +17,8 @@
17
17
  "postinstall": "spectra sync-types"
18
18
  },
19
19
  "devDependencies": {
20
- "@testspectra/cli": "^1.1.8-rc.1",
21
- "@testspectra/matchers": "^1.1.8-rc.1",
20
+ "@testspectra/cli": "^1.1.8-rc.3",
21
+ "@testspectra/matchers": "^1.1.8-rc.3",
22
22
  "@types/node": "^20.14.0",
23
23
  "@wdio/cli": "^9.2.8",
24
24
  "@wdio/local-runner": "^9.2.8",
@@ -1,5 +1,5 @@
1
- class AuthPage {
2
- get statusBadge() { return Spectra.get("~auth-status-badge"); }
3
- }
4
-
5
- export default new AuthPage();
1
+ class AuthPage {
2
+ get statusBadge() { return Spectra.get("~auth-status-badge"); }
3
+ }
4
+
5
+ export default new AuthPage();
@@ -1,10 +1,10 @@
1
- class AuthPage {
2
- get checkStatusButton() { return Spectra.get("#check-auth-status-btn"); }
3
- get statusBadge() { return Spectra.get("#auth-status-badge"); }
4
-
5
- async open() {
6
- await Spectra.navigate("/#auth");
7
- }
8
- }
9
-
10
- export default new AuthPage();
1
+ class AuthPage {
2
+ get checkStatusButton() { return Spectra.get("#check-auth-status-btn"); }
3
+ get statusBadge() { return Spectra.get("#auth-status-badge"); }
4
+
5
+ async open() {
6
+ await Spectra.navigate("/#auth");
7
+ }
8
+ }
9
+
10
+ export default new AuthPage();
@@ -1,70 +1,70 @@
1
- class MatchersPage {
2
- get visibleElement() { return Spectra.get("~visible-element"); }
3
- get hiddenElement() { return Spectra.get("~hidden-element"); }
4
- get existingElement() { return Spectra.get("~existing-element"); }
5
- get removableElement() { return Spectra.get("~removable-element"); }
6
- get submitButton() { return Spectra.get("~submit-button"); }
7
- get disabledButton() { return Spectra.get("~disabled-button"); }
8
- get checkbox() { return Spectra.get("~terms-checkbox"); }
9
- get radio() { return Spectra.get("~mode-radio"); }
10
- get emailInput() { return Spectra.get("~email-input"); }
11
- get tokenInput() { return Spectra.get("~token-input"); }
12
- get exactText() { return Spectra.get("~exact-text"); }
13
- get partialText() { return Spectra.get("~partial-text"); }
14
- // `#` = native id (RN testID → resource-id). Its accessibility label deliberately reads
15
- // "active-tab is-active" (RN exposes no CSS classes, so the class is carried in the a11y label
16
- // for `shouldHaveClass`), so it isn't addressable by the a11y-id form `~active-tab`.
17
- get activeTab() { return Spectra.get("#active-tab"); }
18
- get navLink() { return Spectra.get("~nav-link"); }
19
- get styledElement() { return Spectra.get("~styled-element"); }
20
- get focusInput() { return Spectra.get("~focus-input"); }
21
- get productCards() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
22
- get emptyList() { return Spectra.getAll("~empty-list-item"); }
23
- get overviewSection() { return Spectra.get("#overview-section"); }
24
- // Scoped lookups via element.get() — resolved within overview-section's own bounds (Android
25
- // has no ancestor API, so this is a bounds-containment lookup), not screen-wide.
26
- overviewSubtitle() { return this.overviewSection.get("#demo-page-subtitle"); }
27
- overviewOutsideElement() { return this.overviewSection.get("~submit-button"); }
28
-
29
- // API Demo elements
30
- get fetchApiButton() { return Spectra.get("~fetch-api-btn"); }
31
- get fetchStatusBadge() { return Spectra.get("~fetch-status-badge"); }
32
- get fetchedItems() { return Spectra.getAll("~api-post-item"); }
33
- get fetchLoadingIndicator() { return Spectra.get("~fetch-loading-indicator"); }
34
- get fetchCustomUrlInput() { return Spectra.get("~fetch-custom-url"); }
35
- get postTitleInput() { return Spectra.get("~post-title-input"); }
36
- get postBodyInput() { return Spectra.get("~post-body-input"); }
37
- get submitPostButton() { return Spectra.get("~submit-post-btn"); }
38
- get postStatusBadge() { return Spectra.get("~post-status-badge"); }
39
- get postSuccessBanner() { return Spectra.get("~post-success-banner"); }
40
- get postResponseJson() { return Spectra.get("~post-response-json"); }
41
-
42
- async open(section = "") {
43
- try {
44
- // A fresh app process (relaunched by the orchestrator's bootstrap before every suite) has to
45
- // fetch, parse, and execute the RN JS bundle from Metro before anything is on screen — on a
46
- // cold start this can take well past a normal action's poll budget. Wait for the home screen
47
- // itself first so that timing doesn't silently swallow the sidebar click below and leave the
48
- // real failure to surface confusingly on whatever element the test touches next.
49
- await Spectra.get("~toggle-sidebar-btn").waitForElement(30000);
50
-
51
- const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
52
- if (!isDrawerOpen) {
53
- await Spectra.get("~toggle-sidebar-btn").click();
54
- // The mobile drawer is a React Native `<Modal>` — a separate OS-level window with its own
55
- // slide-in animation, not a plain re-rendered View — so its content (including every
56
- // nav-item below) isn't in the accessibility tree at all until Android actually finishes
57
- // creating that window, which is async and occasionally slow under load. Without this
58
- // wait, clicking a nav item right after the toggle relies entirely on click()'s own
59
- // poll-retry to bridge that gap, which can eat most of the ~10s implicit-wait budget when
60
- // the Modal is slow to materialize.
61
- await Spectra.get("~close-sidebar-btn").waitForElement(10000);
62
- }
63
- if (section) {
64
- await Spectra.get(`~nav-item-${section}`).click();
65
- }
66
- } catch {}
67
- }
68
- }
69
-
70
- export default new MatchersPage();
1
+ class MatchersPage {
2
+ get visibleElement() { return Spectra.get("~visible-element"); }
3
+ get hiddenElement() { return Spectra.get("~hidden-element"); }
4
+ get existingElement() { return Spectra.get("~existing-element"); }
5
+ get removableElement() { return Spectra.get("~removable-element"); }
6
+ get submitButton() { return Spectra.get("~submit-button"); }
7
+ get disabledButton() { return Spectra.get("~disabled-button"); }
8
+ get checkbox() { return Spectra.get("~terms-checkbox"); }
9
+ get radio() { return Spectra.get("~mode-radio"); }
10
+ get emailInput() { return Spectra.get("~email-input"); }
11
+ get tokenInput() { return Spectra.get("~token-input"); }
12
+ get exactText() { return Spectra.get("~exact-text"); }
13
+ get partialText() { return Spectra.get("~partial-text"); }
14
+ // `#` = native id (RN testID → resource-id). Its accessibility label deliberately reads
15
+ // "active-tab is-active" (RN exposes no CSS classes, so the class is carried in the a11y label
16
+ // for `shouldHaveClass`), so it isn't addressable by the a11y-id form `~active-tab`.
17
+ get activeTab() { return Spectra.get("#active-tab"); }
18
+ get navLink() { return Spectra.get("~nav-link"); }
19
+ get styledElement() { return Spectra.get("~styled-element"); }
20
+ get focusInput() { return Spectra.get("~focus-input"); }
21
+ get productCards() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
22
+ get emptyList() { return Spectra.getAll("~empty-list-item"); }
23
+ get overviewSection() { return Spectra.get("#overview-section"); }
24
+ // Scoped lookups via element.get() — resolved within overview-section's own bounds (Android
25
+ // has no ancestor API, so this is a bounds-containment lookup), not screen-wide.
26
+ overviewSubtitle() { return this.overviewSection.get("#demo-page-subtitle"); }
27
+ overviewOutsideElement() { return this.overviewSection.get("~submit-button"); }
28
+
29
+ // API Demo elements
30
+ get fetchApiButton() { return Spectra.get("~fetch-api-btn"); }
31
+ get fetchStatusBadge() { return Spectra.get("~fetch-status-badge"); }
32
+ get fetchedItems() { return Spectra.getAll("~api-post-item"); }
33
+ get fetchLoadingIndicator() { return Spectra.get("~fetch-loading-indicator"); }
34
+ get fetchCustomUrlInput() { return Spectra.get("~fetch-custom-url"); }
35
+ get postTitleInput() { return Spectra.get("~post-title-input"); }
36
+ get postBodyInput() { return Spectra.get("~post-body-input"); }
37
+ get submitPostButton() { return Spectra.get("~submit-post-btn"); }
38
+ get postStatusBadge() { return Spectra.get("~post-status-badge"); }
39
+ get postSuccessBanner() { return Spectra.get("~post-success-banner"); }
40
+ get postResponseJson() { return Spectra.get("~post-response-json"); }
41
+
42
+ async open(section = "") {
43
+ try {
44
+ // A fresh app process (relaunched by the orchestrator's bootstrap before every suite) has to
45
+ // fetch, parse, and execute the RN JS bundle from Metro before anything is on screen — on a
46
+ // cold start this can take well past a normal action's poll budget. Wait for the home screen
47
+ // itself first so that timing doesn't silently swallow the sidebar click below and leave the
48
+ // real failure to surface confusingly on whatever element the test touches next.
49
+ await Spectra.get("~toggle-sidebar-btn").waitForElement(30000);
50
+
51
+ const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
52
+ if (!isDrawerOpen) {
53
+ await Spectra.get("~toggle-sidebar-btn").click();
54
+ // The mobile drawer is a React Native `<Modal>` — a separate OS-level window with its own
55
+ // slide-in animation, not a plain re-rendered View — so its content (including every
56
+ // nav-item below) isn't in the accessibility tree at all until Android actually finishes
57
+ // creating that window, which is async and occasionally slow under load. Without this
58
+ // wait, clicking a nav item right after the toggle relies entirely on click()'s own
59
+ // poll-retry to bridge that gap, which can eat most of the ~10s implicit-wait budget when
60
+ // the Modal is slow to materialize.
61
+ await Spectra.get("~close-sidebar-btn").waitForElement(10000);
62
+ }
63
+ if (section) {
64
+ await Spectra.get(`~nav-item-${section}`).click();
65
+ }
66
+ } catch {}
67
+ }
68
+ }
69
+
70
+ export default new MatchersPage();
@@ -1,43 +1,43 @@
1
- class MatchersPage {
2
- get visibleElement() { return Spectra.get("#demo-visible-el"); }
3
- get hiddenElement() { return Spectra.get("#demo-hidden-el"); }
4
- get existingElement() { return Spectra.get("#demo-existing-el"); }
5
- get submitButton() { return Spectra.get("#demo-submit-btn"); }
6
- get disabledButton() { return Spectra.get("#demo-disabled-btn"); }
7
- get checkbox() { return Spectra.get("#demo-checkbox"); }
8
- get radio() { return Spectra.get("#demo-radio"); }
9
- get emailInput() { return Spectra.get("#demo-email-input"); }
10
- get tokenInput() { return Spectra.get("#demo-token-input"); }
11
- get exactText() { return Spectra.get("#demo-exact-text"); }
12
- get partialText() { return Spectra.get("#demo-partial-text"); }
13
- get activeTab() { return Spectra.get("#demo-active-tab"); }
14
- get navLink() { return Spectra.get("#demo-nav-link"); }
15
- get styledElement() { return Spectra.get("#demo-styled-el"); }
16
- get focusInput() { return Spectra.get("#demo-focus-input"); }
17
- get productCards() { return Spectra.getAll(".demo-product-card"); }
18
- get emptyList() { return Spectra.getAll("#demo-empty-list > *"); }
19
- get overviewSection() { return Spectra.get("#overview"); }
20
- // Scoped lookups via element.get() — resolved within overview-section's own subtree, not
21
- // document-wide.
22
- overviewSubtitle() { return this.overviewSection.get("#demo-page-subtitle"); }
23
- overviewOutsideElement() { return this.overviewSection.get("#demo-submit-btn"); }
24
-
25
- // API Interception & Mocking elements
26
- get fetchApiButton() { return Spectra.get("#fetch-api-btn"); }
27
- get fetchStatusBadge() { return Spectra.get("#fetch-status-badge"); }
28
- get fetchedItems() { return Spectra.getAll(".api-fetched-item"); }
29
- get fetchLoadingIndicator() { return Spectra.get("#fetch-loading-indicator"); }
30
- get fetchCustomUrlInput() { return Spectra.get("#fetch-custom-url-input"); }
31
- get postTitleInput() { return Spectra.get("#post-input-title"); }
32
- get postBodyInput() { return Spectra.get("#post-input-body"); }
33
- get submitPostButton() { return Spectra.get("#submit-post-btn"); }
34
- get postStatusBadge() { return Spectra.get("#post-status-badge"); }
35
- get postSuccessBanner() { return Spectra.get("#post-success-banner"); }
36
- get postResponseJson() { return Spectra.get("#post-response-json"); }
37
-
38
- async open(section = "") {
39
- await Spectra.navigate("/" + (section ? "#" + section : ""));
40
- }
41
- }
42
-
43
- export default new MatchersPage();
1
+ class MatchersPage {
2
+ get visibleElement() { return Spectra.get("#demo-visible-el"); }
3
+ get hiddenElement() { return Spectra.get("#demo-hidden-el"); }
4
+ get existingElement() { return Spectra.get("#demo-existing-el"); }
5
+ get submitButton() { return Spectra.get("#demo-submit-btn"); }
6
+ get disabledButton() { return Spectra.get("#demo-disabled-btn"); }
7
+ get checkbox() { return Spectra.get("#demo-checkbox"); }
8
+ get radio() { return Spectra.get("#demo-radio"); }
9
+ get emailInput() { return Spectra.get("#demo-email-input"); }
10
+ get tokenInput() { return Spectra.get("#demo-token-input"); }
11
+ get exactText() { return Spectra.get("#demo-exact-text"); }
12
+ get partialText() { return Spectra.get("#demo-partial-text"); }
13
+ get activeTab() { return Spectra.get("#demo-active-tab"); }
14
+ get navLink() { return Spectra.get("#demo-nav-link"); }
15
+ get styledElement() { return Spectra.get("#demo-styled-el"); }
16
+ get focusInput() { return Spectra.get("#demo-focus-input"); }
17
+ get productCards() { return Spectra.getAll(".demo-product-card"); }
18
+ get emptyList() { return Spectra.getAll("#demo-empty-list > *"); }
19
+ get overviewSection() { return Spectra.get("#overview"); }
20
+ // Scoped lookups via element.get() — resolved within overview-section's own subtree, not
21
+ // document-wide.
22
+ overviewSubtitle() { return this.overviewSection.get("#demo-page-subtitle"); }
23
+ overviewOutsideElement() { return this.overviewSection.get("#demo-submit-btn"); }
24
+
25
+ // API Interception & Mocking elements
26
+ get fetchApiButton() { return Spectra.get("#fetch-api-btn"); }
27
+ get fetchStatusBadge() { return Spectra.get("#fetch-status-badge"); }
28
+ get fetchedItems() { return Spectra.getAll(".api-fetched-item"); }
29
+ get fetchLoadingIndicator() { return Spectra.get("#fetch-loading-indicator"); }
30
+ get fetchCustomUrlInput() { return Spectra.get("#fetch-custom-url-input"); }
31
+ get postTitleInput() { return Spectra.get("#post-input-title"); }
32
+ get postBodyInput() { return Spectra.get("#post-input-body"); }
33
+ get submitPostButton() { return Spectra.get("#submit-post-btn"); }
34
+ get postStatusBadge() { return Spectra.get("#post-status-badge"); }
35
+ get postSuccessBanner() { return Spectra.get("#post-success-banner"); }
36
+ get postResponseJson() { return Spectra.get("#post-response-json"); }
37
+
38
+ async open(section = "") {
39
+ await Spectra.navigate("/" + (section ? "#" + section : ""));
40
+ }
41
+ }
42
+
43
+ export default new MatchersPage();
@@ -1,14 +1,14 @@
1
- class NavigationPage {
2
- get sidebarLinks() {
3
- return Spectra.getAll(
4
- "~nav-item-overview, ~nav-item-element-matchers, ~nav-item-visibility, ~nav-item-existence, ~nav-item-state, ~nav-item-value, ~nav-item-text, ~nav-item-class-attr, ~nav-item-browser-matchers, ~nav-item-url, ~nav-item-title, ~nav-item-collection-matchers, ~nav-item-length, ~nav-item-api-matchers, ~nav-item-api-fetch, ~nav-item-api-post, ~nav-item-playground"
5
- );
6
- }
7
- get toggleSidebarButton() { return Spectra.get("~toggle-sidebar-btn"); }
8
- get closeSidebarButton() { return Spectra.get("~close-sidebar-btn"); }
9
- get overviewLink() { return Spectra.get("~nav-item-overview"); }
10
- get visibilityLink() { return Spectra.get("~nav-item-visibility"); }
11
- get playgroundLink() { return Spectra.get("~nav-item-playground"); }
12
- }
13
-
14
- export default new NavigationPage();
1
+ class NavigationPage {
2
+ get sidebarLinks() {
3
+ return Spectra.getAll(
4
+ "~nav-item-overview, ~nav-item-element-matchers, ~nav-item-visibility, ~nav-item-existence, ~nav-item-state, ~nav-item-value, ~nav-item-text, ~nav-item-class-attr, ~nav-item-browser-matchers, ~nav-item-url, ~nav-item-title, ~nav-item-collection-matchers, ~nav-item-length, ~nav-item-api-matchers, ~nav-item-api-fetch, ~nav-item-api-post, ~nav-item-playground"
5
+ );
6
+ }
7
+ get toggleSidebarButton() { return Spectra.get("~toggle-sidebar-btn"); }
8
+ get closeSidebarButton() { return Spectra.get("~close-sidebar-btn"); }
9
+ get overviewLink() { return Spectra.get("~nav-item-overview"); }
10
+ get visibilityLink() { return Spectra.get("~nav-item-visibility"); }
11
+ get playgroundLink() { return Spectra.get("~nav-item-playground"); }
12
+ }
13
+
14
+ export default new NavigationPage();
@@ -1,8 +1,8 @@
1
- class NavigationPage {
2
- get sidebarLinks() { return Spectra.getAll("aside a"); }
3
- get overviewLink() { return Spectra.get("aside a[href='#overview']"); }
4
- get visibilityLink() { return Spectra.get("aside a[href='#visibility']"); }
5
- get playgroundLink() { return Spectra.get("aside a[href='#playground']"); }
6
- }
7
-
8
- export default new NavigationPage();
1
+ class NavigationPage {
2
+ get sidebarLinks() { return Spectra.getAll("aside a"); }
3
+ get overviewLink() { return Spectra.get("aside a[href='#overview']"); }
4
+ get visibilityLink() { return Spectra.get("aside a[href='#visibility']"); }
5
+ get playgroundLink() { return Spectra.get("aside a[href='#playground']"); }
6
+ }
7
+
8
+ export default new NavigationPage();
@@ -1,42 +1,42 @@
1
- class PlaygroundPage {
2
- get visibleElement() { return Spectra.get("~playground-visible"); }
3
- get hiddenElement() { return Spectra.get("~playground-hidden"); }
4
- get existingElement() { return Spectra.get("~playground-existing"); }
5
- get removedElement() { return Spectra.get("~playground-removable"); }
6
- get enabledButton() { return Spectra.get("~enabled-button"); }
7
- get disabledButton() { return Spectra.get("~pg-disabled-button"); }
8
- get termsCheckbox() { return Spectra.get("~pg-terms-checkbox"); }
9
- get modeRadio() { return Spectra.get("~pg-mode-radio"); }
10
- get emailInput() { return Spectra.get("~pg-email-input"); }
11
- get tokenInput() { return Spectra.get("~pg-token-input"); }
12
- get exactText() { return Spectra.get("~exact-text-el"); }
13
- get partialText() { return Spectra.get("~partial-text-el"); }
14
- get activeTab() { return Spectra.get("~active-tab-el"); }
15
- get navLink() { return Spectra.get("~nav-link-el"); }
16
- get styledElement() { return Spectra.get("~playground-styled-element"); }
17
- get focusInput() { return Spectra.get("~playground-focus-input"); }
18
- get productItems() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
19
- get emptyList() { return Spectra.getAll("~empty-list-el-item"); }
20
-
21
- async open() {
22
- try {
23
- // See MatchersPage.open()'s equivalent comment: waits for the cold-start home screen, then
24
- // for the drawer Modal to actually finish materializing before clicking a nav item inside
25
- // it — both races that otherwise surface as an occasional ~10s stall on the next click.
26
- await Spectra.get("~toggle-sidebar-btn").waitForElement(30000);
27
-
28
- const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
29
- if (!isDrawerOpen) {
30
- await Spectra.get("~toggle-sidebar-btn").click();
31
- await Spectra.get("~close-sidebar-btn").waitForElement(10000);
32
- }
33
- await Spectra.get("~nav-item-playground").click();
34
- } catch {}
35
- }
36
- async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
37
- await this.emailInput.type(email);
38
- await this.tokenInput.type(token);
39
- }
40
- }
41
-
42
- export default new PlaygroundPage();
1
+ class PlaygroundPage {
2
+ get visibleElement() { return Spectra.get("~playground-visible"); }
3
+ get hiddenElement() { return Spectra.get("~playground-hidden"); }
4
+ get existingElement() { return Spectra.get("~playground-existing"); }
5
+ get removedElement() { return Spectra.get("~playground-removable"); }
6
+ get enabledButton() { return Spectra.get("~enabled-button"); }
7
+ get disabledButton() { return Spectra.get("~pg-disabled-button"); }
8
+ get termsCheckbox() { return Spectra.get("~pg-terms-checkbox"); }
9
+ get modeRadio() { return Spectra.get("~pg-mode-radio"); }
10
+ get emailInput() { return Spectra.get("~pg-email-input"); }
11
+ get tokenInput() { return Spectra.get("~pg-token-input"); }
12
+ get exactText() { return Spectra.get("~exact-text-el"); }
13
+ get partialText() { return Spectra.get("~partial-text-el"); }
14
+ get activeTab() { return Spectra.get("~active-tab-el"); }
15
+ get navLink() { return Spectra.get("~nav-link-el"); }
16
+ get styledElement() { return Spectra.get("~playground-styled-element"); }
17
+ get focusInput() { return Spectra.get("~playground-focus-input"); }
18
+ get productItems() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
19
+ get emptyList() { return Spectra.getAll("~empty-list-el-item"); }
20
+
21
+ async open() {
22
+ try {
23
+ // See MatchersPage.open()'s equivalent comment: waits for the cold-start home screen, then
24
+ // for the drawer Modal to actually finish materializing before clicking a nav item inside
25
+ // it — both races that otherwise surface as an occasional ~10s stall on the next click.
26
+ await Spectra.get("~toggle-sidebar-btn").waitForElement(30000);
27
+
28
+ const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
29
+ if (!isDrawerOpen) {
30
+ await Spectra.get("~toggle-sidebar-btn").click();
31
+ await Spectra.get("~close-sidebar-btn").waitForElement(10000);
32
+ }
33
+ await Spectra.get("~nav-item-playground").click();
34
+ } catch {}
35
+ }
36
+ async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
37
+ await this.emailInput.type(email);
38
+ await this.tokenInput.type(token);
39
+ }
40
+ }
41
+
42
+ export default new PlaygroundPage();
@@ -1,31 +1,31 @@
1
- class PlaygroundPage {
2
- get visibleElement() { return Spectra.get("#demo-visible-el-pg"); }
3
- get hiddenElement() { return Spectra.get("#demo-hidden-el-pg"); }
4
- get existingElement() { return Spectra.get("#demo-existing-el-pg"); }
5
- get removedElement() { return Spectra.get("#demo-removed-el-pg"); }
6
- get enabledButton() { return Spectra.get("#demo-enabled-btn"); }
7
- get disabledButton() { return Spectra.get("#demo-disabled-btn-pg"); }
8
- get termsCheckbox() { return Spectra.get("#demo-terms-checkbox"); }
9
- get modeRadio() { return Spectra.get("#demo-mode-radio"); }
10
- get emailInput() { return Spectra.get("#demo-email-input-pg"); }
11
- get tokenInput() { return Spectra.get("#demo-token-input-pg"); }
12
- get exactText() { return Spectra.get("#demo-exact-text-pg"); }
13
- get partialText() { return Spectra.get("#demo-partial-text-pg"); }
14
- get activeTab() { return Spectra.get("#demo-active-tab-pg"); }
15
- get navLink() { return Spectra.get("#demo-nav-link-pg"); }
16
- get styledElement() { return Spectra.get("#demo-styled-el-pg"); }
17
- get focusInput() { return Spectra.get("#demo-focus-input-pg"); }
18
- get productItems() { return Spectra.getAll(".demo-product-item"); }
19
- get emptyList() { return Spectra.getAll("#demo-empty-list-pg > *"); }
20
-
21
- async open() {
22
- await Spectra.navigate("/#playground");
23
- }
24
-
25
- async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
26
- await this.emailInput.type(email);
27
- await this.tokenInput.type(token);
28
- }
29
- }
30
-
31
- export default new PlaygroundPage();
1
+ class PlaygroundPage {
2
+ get visibleElement() { return Spectra.get("#demo-visible-el-pg"); }
3
+ get hiddenElement() { return Spectra.get("#demo-hidden-el-pg"); }
4
+ get existingElement() { return Spectra.get("#demo-existing-el-pg"); }
5
+ get removedElement() { return Spectra.get("#demo-removed-el-pg"); }
6
+ get enabledButton() { return Spectra.get("#demo-enabled-btn"); }
7
+ get disabledButton() { return Spectra.get("#demo-disabled-btn-pg"); }
8
+ get termsCheckbox() { return Spectra.get("#demo-terms-checkbox"); }
9
+ get modeRadio() { return Spectra.get("#demo-mode-radio"); }
10
+ get emailInput() { return Spectra.get("#demo-email-input-pg"); }
11
+ get tokenInput() { return Spectra.get("#demo-token-input-pg"); }
12
+ get exactText() { return Spectra.get("#demo-exact-text-pg"); }
13
+ get partialText() { return Spectra.get("#demo-partial-text-pg"); }
14
+ get activeTab() { return Spectra.get("#demo-active-tab-pg"); }
15
+ get navLink() { return Spectra.get("#demo-nav-link-pg"); }
16
+ get styledElement() { return Spectra.get("#demo-styled-el-pg"); }
17
+ get focusInput() { return Spectra.get("#demo-focus-input-pg"); }
18
+ get productItems() { return Spectra.getAll(".demo-product-item"); }
19
+ get emptyList() { return Spectra.getAll("#demo-empty-list-pg > *"); }
20
+
21
+ async open() {
22
+ await Spectra.navigate("/#playground");
23
+ }
24
+
25
+ async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
26
+ await this.emailInput.type(email);
27
+ await this.tokenInput.type(token);
28
+ }
29
+ }
30
+
31
+ export default new PlaygroundPage();