ruby_raider 3.13.0 → 4.0.0

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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/runtime.yml +38 -0
  3. data/.github/workflows/system_tests.yml +1 -23
  4. data/.reek.yml +1 -0
  5. data/.rspec +1 -0
  6. data/Gemfile +2 -0
  7. data/README.md +16 -49
  8. data/RELEASE.md +22 -0
  9. data/bin/raider +5 -0
  10. data/lib/commands/scaffolding_commands.rb +2 -25
  11. data/lib/commands/utility_commands.rb +23 -3
  12. data/lib/generators/automation/automation_generator.rb +0 -5
  13. data/lib/generators/automation/templates/component.tt +1 -0
  14. data/lib/generators/automation/templates/home.tt +2 -2
  15. data/lib/generators/automation/templates/login.tt +6 -26
  16. data/lib/generators/automation/templates/page.tt +23 -18
  17. data/lib/generators/automation/templates/partials/home_page_selector.tt +1 -2
  18. data/lib/generators/automation/templates/partials/initialize_selector.tt +0 -8
  19. data/lib/generators/automation/templates/partials/pdp_page_selector.tt +1 -2
  20. data/lib/generators/automation/templates/partials/url_methods.tt +8 -2
  21. data/lib/generators/automation/templates/partials/visit_method.tt +0 -5
  22. data/lib/generators/automation/templates/pdp.tt +1 -9
  23. data/lib/generators/common_generator.rb +0 -2
  24. data/lib/generators/generator.rb +12 -19
  25. data/lib/generators/helper_generator.rb +21 -19
  26. data/lib/generators/infrastructure/templates/azure_pipelines.tt +1 -1
  27. data/lib/generators/infrastructure/templates/github.tt +2 -3
  28. data/lib/generators/infrastructure/templates/github_appium.tt +0 -8
  29. data/lib/generators/invoke_generators.rb +4 -23
  30. data/lib/generators/menu_generator.rb +1 -9
  31. data/lib/generators/rspec/templates/accessibility_spec.tt +1 -9
  32. data/lib/generators/rspec/templates/spec.tt +8 -24
  33. data/lib/generators/template_renderer/partial_cache.rb +3 -1
  34. data/lib/generators/template_renderer.rb +1 -1
  35. data/lib/generators/templates/common/gemfile.tt +3 -10
  36. data/lib/generators/templates/common/git_ignore.tt +0 -5
  37. data/lib/generators/templates/common/partials/mobile_config.tt +3 -1
  38. data/lib/generators/templates/common/partials/web_config.tt +10 -1
  39. data/lib/generators/templates/common/rakefile.tt +0 -15
  40. data/lib/generators/templates/common/read_me.tt +357 -250
  41. data/lib/generators/templates/common/rubocop.tt +0 -2
  42. data/lib/generators/templates/helpers/driver_helper.tt +8 -0
  43. data/lib/generators/templates/helpers/gesture_helper.tt +78 -0
  44. data/lib/generators/templates/helpers/network_helper.tt +521 -0
  45. data/lib/generators/templates/helpers/partials/quit_driver.tt +0 -2
  46. data/lib/generators/templates/helpers/partials/screenshot.tt +0 -2
  47. data/lib/generators/templates/helpers/partials/selenium_driver.tt +5 -2
  48. data/lib/generators/templates/helpers/screenshot_helper.tt +490 -0
  49. data/lib/generators/templates/helpers/spec_helper.tt +39 -29
  50. data/lib/generators/templates/helpers/trace_helper.tt +240 -95
  51. data/lib/generators/templates/helpers/video_helper.tt +3 -8
  52. data/lib/ruby_raider/runtime/actionability.rb +129 -0
  53. data/lib/ruby_raider/runtime/actionable.rb +49 -0
  54. data/lib/ruby_raider/runtime/by_role.rb +55 -0
  55. data/lib/ruby_raider/runtime/config.rb +79 -0
  56. data/lib/ruby_raider/runtime/context.rb +38 -0
  57. data/lib/ruby_raider/runtime/errors.rb +69 -0
  58. data/lib/ruby_raider/runtime/finders.rb +73 -0
  59. data/lib/ruby_raider/runtime/js/actionability.js +134 -0
  60. data/lib/ruby_raider/runtime/js/role_engine.js +315 -0
  61. data/lib/ruby_raider/runtime/locator_converter.rb +72 -0
  62. data/lib/ruby_raider/runtime/matchers/base.rb +222 -0
  63. data/lib/ruby_raider/runtime/matchers/element.rb +183 -0
  64. data/lib/ruby_raider/runtime/matchers/page.rb +71 -0
  65. data/lib/ruby_raider/runtime/matchers/presence.rb +41 -0
  66. data/lib/ruby_raider/runtime/matchers/retrying_block.rb +104 -0
  67. data/lib/ruby_raider/runtime/observer.rb +170 -0
  68. data/lib/ruby_raider/runtime/role_finder.rb +83 -0
  69. data/lib/ruby_raider/runtime/rspec.rb +78 -0
  70. data/lib/ruby_raider/runtime/selectors.rb +60 -0
  71. data/lib/ruby_raider/runtime/strict.rb +142 -0
  72. data/lib/ruby_raider/runtime/wait.rb +84 -0
  73. data/lib/ruby_raider/runtime.rb +20 -0
  74. data/lib/scaffolding/name_normalizer.rb +1 -1
  75. data/lib/scaffolding/project_detector.rb +2 -28
  76. data/lib/scaffolding/scaffolding.rb +0 -20
  77. data/lib/scaffolding/templates/component.tt +0 -14
  78. data/lib/scaffolding/templates/page_object.tt +2 -14
  79. data/lib/scaffolding/templates/spec.tt +1 -9
  80. data/lib/utilities/utilities.rb +10 -8
  81. data/lib/version +1 -1
  82. data/ruby_raider.gemspec +2 -1
  83. data/sig/commands/scaffolding_commands.rbs +0 -2
  84. data/sig/commands/utility_commands.rbs +6 -0
  85. data/sig/generators/generator.rbs +0 -4
  86. data/sig/generators/helper_generator.rbs +0 -1
  87. data/sig/generators/menu_generator.rbs +0 -1
  88. data/sig/ruby_raider/runtime/actionability.rbs +25 -0
  89. data/sig/ruby_raider/runtime/actionable.rbs +13 -0
  90. data/sig/ruby_raider/runtime/by_role.rbs +15 -0
  91. data/sig/ruby_raider/runtime/config.rbs +26 -0
  92. data/sig/ruby_raider/runtime/context.rbs +12 -0
  93. data/sig/ruby_raider/runtime/errors.rbs +36 -0
  94. data/sig/ruby_raider/runtime/finders.rbs +26 -0
  95. data/sig/ruby_raider/runtime/locator_converter.rbs +21 -0
  96. data/sig/ruby_raider/runtime/matchers/base.rbs +64 -0
  97. data/sig/ruby_raider/runtime/matchers/element.rbs +78 -0
  98. data/sig/ruby_raider/runtime/matchers/page.rbs +38 -0
  99. data/sig/ruby_raider/runtime/matchers/presence.rbs +21 -0
  100. data/sig/ruby_raider/runtime/matchers/retrying_block.rbs +27 -0
  101. data/sig/ruby_raider/runtime/observer.rbs +46 -0
  102. data/sig/ruby_raider/runtime/role_finder.rbs +18 -0
  103. data/sig/ruby_raider/runtime/selectors.rbs +21 -0
  104. data/sig/ruby_raider/runtime/strict.rbs +35 -0
  105. data/sig/ruby_raider/runtime/wait.rbs +17 -0
  106. data/sig/ruby_raider/runtime.rbs +2 -0
  107. data/sig/scaffolding/project_detector.rbs +0 -4
  108. data/sig/scaffolding/scaffolding.rbs +0 -5
  109. data/sig/utilities/utilities.rbs +2 -1
  110. data/sig/vendor/selenium_webdriver.rbs +71 -0
  111. data/spec/commands/raider_commands_spec.rb +38 -3
  112. data/spec/commands/scaffolding_commands_spec.rb +27 -0
  113. data/spec/commands/utility_commands_spec.rb +53 -0
  114. data/spec/generators/gesture_helper_spec.rb +123 -0
  115. data/spec/generators/network_helper_spec.rb +634 -0
  116. data/spec/generators/screenshot_helper_spec.rb +776 -0
  117. data/spec/generators/template_renderer_spec.rb +0 -4
  118. data/spec/generators/trace_helper_spec.rb +489 -97
  119. data/spec/generators/video_helper_spec.rb +0 -9
  120. data/spec/integration/commands/browser_update_after_creation_spec.rb +0 -8
  121. data/spec/integration/commands/scaffolding_commands_spec.rb +12 -70
  122. data/spec/integration/commands/utility_commands_spec.rb +19 -41
  123. data/spec/integration/content/azure_content_spec.rb +2 -6
  124. data/spec/integration/content/ci_content_spec.rb +1 -55
  125. data/spec/integration/content/common_content_spec.rb +1 -118
  126. data/spec/integration/content/config_content_spec.rb +34 -31
  127. data/spec/integration/content/gemfile_content_spec.rb +7 -72
  128. data/spec/integration/content/helper_content_spec.rb +105 -99
  129. data/spec/integration/content/page_content_spec.rb +85 -87
  130. data/spec/integration/content/readme_content_spec.rb +134 -75
  131. data/spec/integration/content/rspec_reporter_content_spec.rb +2 -2
  132. data/spec/integration/content/rubocop_content_spec.rb +1 -1
  133. data/spec/integration/content/syntax_validation_spec.rb +2 -2
  134. data/spec/integration/content/test_content_spec.rb +23 -147
  135. data/spec/integration/end_to_end_features_spec.rb +1 -43
  136. data/spec/integration/end_to_end_spec.rb +319 -326
  137. data/spec/integration/generators/automation_generator_spec.rb +3 -37
  138. data/spec/integration/generators/axe_addon_spec.rb +2 -35
  139. data/spec/integration/generators/azure_generator_spec.rb +1 -1
  140. data/spec/integration/generators/common_generator_spec.rb +1 -40
  141. data/spec/integration/generators/config_features_spec.rb +1 -24
  142. data/spec/integration/generators/github_generator_spec.rb +0 -12
  143. data/spec/integration/generators/helpers_generator_spec.rb +74 -80
  144. data/spec/integration/generators/invoke_generators_spec.rb +54 -45
  145. data/spec/integration/generators/rspec_generator_spec.rb +0 -6
  146. data/spec/integration/scaffolding_e2e_spec.rb +17 -179
  147. data/spec/integration/spec_helper.rb +4 -6
  148. data/spec/integration/trace_format_checker.rb +11 -2
  149. data/spec/integration/trace_page_server.rb +72 -5
  150. data/spec/menus/menu_generator_spec.rb +14 -39
  151. data/spec/runtime/actionability_spec.rb +207 -0
  152. data/spec/runtime/actionable_spec.rb +125 -0
  153. data/spec/runtime/browser/actionability_script_browser_spec.rb +150 -0
  154. data/spec/runtime/browser/actionable_browser_spec.rb +98 -0
  155. data/spec/runtime/browser/finders_browser_spec.rb +148 -0
  156. data/spec/runtime/browser/matchers_browser_spec.rb +67 -0
  157. data/spec/runtime/browser/retrying_block_browser_spec.rb +37 -0
  158. data/spec/runtime/browser/role_engine_browser_spec.rb +184 -0
  159. data/spec/runtime/browser/strict_browser_spec.rb +38 -0
  160. data/spec/runtime/by_role_spec.rb +52 -0
  161. data/spec/runtime/config_spec.rb +79 -0
  162. data/spec/runtime/context_spec.rb +73 -0
  163. data/spec/runtime/errors_spec.rb +89 -0
  164. data/spec/runtime/finders_spec.rb +165 -0
  165. data/spec/runtime/fixtures/actionability.html +70 -0
  166. data/spec/runtime/fixtures/locators.html +46 -0
  167. data/spec/runtime/fixtures/matchers.html +33 -0
  168. data/spec/runtime/fixtures/roles.html +162 -0
  169. data/spec/runtime/matchers/base_spec.rb +165 -0
  170. data/spec/runtime/matchers/element_spec.rb +277 -0
  171. data/spec/runtime/matchers/page_spec.rb +102 -0
  172. data/spec/runtime/matchers/presence_spec.rb +59 -0
  173. data/spec/runtime/matchers/retrying_block_spec.rb +165 -0
  174. data/spec/runtime/observer_spec.rb +341 -0
  175. data/spec/runtime/role_finder_spec.rb +156 -0
  176. data/spec/runtime/role_query_spec.rb +75 -0
  177. data/spec/runtime/selectors_spec.rb +135 -0
  178. data/spec/runtime/strict_spec.rb +257 -0
  179. data/spec/runtime/support/browser.rb +48 -0
  180. data/spec/runtime/support/fake_bridge.rb +117 -0
  181. data/spec/runtime/wait_spec.rb +71 -0
  182. data/spec/scaffolding/name_normalizer_spec.rb +3 -2
  183. data/spec/scaffolding/scaffold_project_detector_spec.rb +4 -43
  184. data/spec/system/selenium_spec.rb +1 -5
  185. data/spec/system/support/system_test_helper.rb +2 -5
  186. data/spec/utilities/headless_config_spec.rb +0 -7
  187. data/spec/utilities/utilities_spec.rb +24 -0
  188. metadata +113 -48
  189. data/lib/generators/automation/templates/header.tt +0 -9
  190. data/lib/generators/cucumber/cucumber_generator.rb +0 -58
  191. data/lib/generators/cucumber/templates/accessibility_feature.tt +0 -5
  192. data/lib/generators/cucumber/templates/accessibility_steps.tt +0 -17
  193. data/lib/generators/cucumber/templates/cucumber.tt +0 -1
  194. data/lib/generators/cucumber/templates/env.tt +0 -7
  195. data/lib/generators/cucumber/templates/feature.tt +0 -21
  196. data/lib/generators/cucumber/templates/partials/appium_env.tt +0 -26
  197. data/lib/generators/cucumber/templates/partials/driver_world.tt +0 -18
  198. data/lib/generators/cucumber/templates/partials/mobile_steps.tt +0 -20
  199. data/lib/generators/cucumber/templates/partials/selenium_env.tt +0 -120
  200. data/lib/generators/cucumber/templates/partials/watir_env.tt +0 -48
  201. data/lib/generators/cucumber/templates/partials/watir_world.tt +0 -4
  202. data/lib/generators/cucumber/templates/partials/web_steps.tt +0 -28
  203. data/lib/generators/cucumber/templates/steps.tt +0 -5
  204. data/lib/generators/cucumber/templates/user_factory.tt +0 -15
  205. data/lib/generators/cucumber/templates/world.tt +0 -7
  206. data/lib/generators/templates/helpers/browser_helper.tt +0 -31
  207. data/lib/generators/templates/helpers/raider_element.tt +0 -159
  208. data/lib/generators/templates/helpers/wait_helper.tt +0 -611
  209. data/lib/scaffolding/templates/feature.tt +0 -6
  210. data/lib/scaffolding/templates/steps.tt +0 -19
  211. data/sig/generators/cucumber/cucumber_generator.rbs +0 -12
  212. data/spec/fixtures/watir_master/cucumber_watir/Readme.md.snapshot +0 -175
  213. data/spec/fixtures/watir_master/cucumber_watir/features/step_definitions/login_steps.rb.snapshot +0 -24
  214. data/spec/fixtures/watir_master/cucumber_watir/page_objects/abstract/page.rb.snapshot +0 -37
  215. data/spec/fixtures/watir_master/cucumber_watir/page_objects/pages/login.rb.snapshot +0 -33
  216. data/spec/fixtures/watir_master/rspec_watir/Readme.md.snapshot +0 -174
  217. data/spec/fixtures/watir_master/rspec_watir/page_objects/abstract/page.rb.snapshot +0 -37
  218. data/spec/fixtures/watir_master/rspec_watir/page_objects/pages/login.rb.snapshot +0 -33
  219. data/spec/fixtures/watir_master/rspec_watir/spec/login_page_spec.rb.snapshot +0 -49
  220. data/spec/integration/content/cucumber_reporter_content_spec.rb +0 -161
  221. data/spec/integration/generators/cucumber_generator_spec.rb +0 -100
  222. data/spec/integration/helpers/wait_helper_mobile_spec.rb +0 -281
  223. data/spec/integration/helpers/wait_helper_spec.rb +0 -679
  224. data/spec/integration/helpers/wait_helper_support.rb +0 -183
  225. data/spec/system/watir_spec.rb +0 -38
@@ -8,18 +8,14 @@ class Generator < Thor::Group
8
8
  def self.template_cache_stats: () -> Hash[Symbol, untyped]
9
9
 
10
10
  # Predicate methods for framework/automation detection
11
- def cucumber?: () -> bool
12
11
  def cross_platform?: () -> bool
13
12
  def mobile?: () -> bool
14
13
  def single_platform?: () -> bool
15
14
  def ios?: () -> bool
16
15
  def android?: () -> bool
17
- def rspec?: () -> bool
18
16
  def azure?: () -> bool
19
17
  def github_ci?: () -> bool
20
18
  def selenium?: () -> bool
21
- def watir?: () -> bool
22
- def wait_helper?: () -> bool
23
19
  def trace_helper?: () -> bool
24
20
  def examples?: () -> bool
25
21
  def web?: () -> bool
@@ -4,7 +4,6 @@ class HelpersGenerator < Generator
4
4
 
5
5
  private
6
6
 
7
- def generate_browser_helper: () -> void
8
7
  def generate_spec_helper: () -> void
9
8
  def generate_driver_helper: () -> void
10
9
  def generate_appium_helper: () -> void
@@ -14,7 +14,6 @@ class MenuGenerator
14
14
  private
15
15
 
16
16
  def offer_desktop_download: () -> void
17
- def select_test_framework: (String automation) -> void
18
17
  def create_framework_options: (Hash[Symbol, untyped] params) -> untyped
19
18
  def select_accessibility: (String framework, String automation_type) -> void
20
19
  def mobile_automation?: (String automation_type) -> bool
@@ -0,0 +1,25 @@
1
+ module Raider
2
+ module Actionability
3
+ CHECKS: Hash[Symbol, Array[String]]
4
+ NATIVE_CHECKS: Hash[Symbol, Array[String]]
5
+ PHRASES: Hash[String, String]
6
+ SCRIPT: String
7
+ FIRST_POLL: Hash[String, untyped]
8
+ NOTICE: String
9
+
10
+ def self.ensure: (untyped element, Symbol action, force: bool) -> Integer
11
+ def self.check: (untyped element, Symbol action) -> Hash[String, untyped]?
12
+ def self.reset_notice: () -> void
13
+
14
+ # private singleton helpers
15
+ def self.attached: (untyped element, bool web) -> Integer
16
+ def self.poll: (untyped element) { () -> Hash[String, untyped]? } -> Integer
17
+ def self.native_failure: (untyped element, Symbol action) -> Hash[String, String]?
18
+ def self.polled: (untyped element, Symbol action) -> Hash[String, untyped]?
19
+ def self.native_ready?: (untyped element, String name) -> bool
20
+ def self.clock: () -> Float
21
+ def self.not_actionable: (untyped element, Hash[String, untyped]? last, Float waited, Integer retries) -> NotActionable
22
+ def self.covering: (Hash[String, untyped] last) -> Hash[Symbol, untyped]?
23
+ def self.announce: () -> void
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Raider
2
+ module Actionable
3
+ def click: (?force: bool) -> untyped
4
+ def send_keys: (*untyped keys, ?force: bool) -> untyped
5
+ alias send_key send_keys
6
+ def clear: (?force: bool) -> untyped
7
+ def submit: (?force: bool) -> untyped
8
+
9
+ private
10
+
11
+ def raider_gate: (Observer::Run? run, Symbol action, bool force) -> untyped
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Raider
2
+ ROLES: Array[String]
3
+
4
+ module RoleLocator
5
+ def self.build: (String | Symbol role, String? name, bool exact, bool include_hidden, ?Integer? level) -> Hash[Symbol, Array[untyped]]
6
+ def self.validated_level: (String token, Integer? level) -> void
7
+ def self.validated_role: (String | Symbol role) -> String
8
+ end
9
+
10
+ def self.by_role: (String | Symbol role, ?name: String?, ?exact: bool, ?include_hidden: bool, ?level: Integer?) -> Hash[Symbol, Array[untyped]]
11
+
12
+ module Helpers
13
+ def by_role: (String | Symbol role, ?name: String?, ?exact: bool, ?include_hidden: bool, ?level: Integer?) -> Hash[Symbol, Array[untyped]]
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ module Raider
2
+ CONFIG_FILE: String
3
+ FALSY: Array[String]
4
+
5
+ class Error < StandardError
6
+ end
7
+
8
+ def self.strict: () -> bool
9
+ def self.actionability: () -> bool
10
+ def self.timeout: () -> Numeric
11
+ def self.test_id_attribute: () -> String
12
+ def self.strict=: (bool?) -> bool?
13
+ def self.actionability=: (bool?) -> bool?
14
+ def self.timeout=: (Numeric?) -> Numeric?
15
+ def self.test_id_attribute=: (String?) -> String?
16
+ def self.observer: () -> untyped
17
+ def self.observer=: (untyped) -> untyped
18
+ def self.reset: () -> void
19
+
20
+ # private singleton helpers
21
+ def self.resolve: (Symbol key, String env_name, untyped default) { (untyped) -> untyped } -> untyped
22
+ def self.file_config: () -> Hash[String, untyped]
23
+ def self.load_file: () -> Hash[String, untyped]
24
+ def self.truthy?: (untyped value) -> bool
25
+ def self.number: (untyped value) -> Numeric
26
+ end
@@ -0,0 +1,12 @@
1
+ module Raider
2
+ module Context
3
+ NATIVE: String
4
+
5
+ def self.web?: (untyped bridge) -> bool
6
+ def self.web_for?: (untyped search_context) -> bool
7
+
8
+ # private singleton helper
9
+ def self.contextual?: (untyped bridge) -> bool
10
+ def self.event_firing?: (untyped bridge) -> bool
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ module Raider
2
+ module Describe
3
+ TEXT_LIMIT: Integer
4
+ CLASS_LIMIT: Integer
5
+
6
+ def self.seconds: (Numeric value) -> Numeric
7
+ def self.element: (Selenium::WebDriver::Element element) -> String
8
+ def self.attribute_part: (String name, String value) -> String
9
+
10
+ def seconds: (Numeric value) -> Numeric
11
+ def element: (Selenium::WebDriver::Element element) -> String
12
+ def attribute_part: (String name, String value) -> String
13
+ end
14
+
15
+ class AmbiguousMatch < Selenium::WebDriver::Error::WebDriverError
16
+ SHOWN: Integer
17
+
18
+ attr_reader elements: Array[Selenium::WebDriver::Element]
19
+
20
+ def initialize: (String locator_description, Array[Selenium::WebDriver::Element] elements) -> void
21
+ end
22
+
23
+ class NotActionable < Selenium::WebDriver::Error::ElementNotInteractableError
24
+ attr_reader check: String
25
+ attr_reader covering: Hash[Symbol, untyped]?
26
+ attr_reader retries: Integer
27
+
28
+ def initialize: (String element_description, String check, ?covering: Hash[Symbol, untyped]?, ?waited: Numeric, ?retries: Integer) -> void
29
+ end
30
+
31
+ class NotSupported < Selenium::WebDriver::Error::UnsupportedOperationError
32
+ end
33
+
34
+ class TimeoutError < Selenium::WebDriver::Error::TimeoutError
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module Raider
2
+ FINDERS: Hash[Symbol, String]
3
+
4
+ module Finders
5
+ BRIDGE: String
6
+ SEARCH_CONTEXT: String
7
+ SELENIUM_BRIDGES: Array[String]
8
+ APPIUM_BRIDGES: Array[String]
9
+
10
+ def self.register: () -> void
11
+ def self.ensure_registered: () -> void
12
+ def self.install_converter: (untyped bridge_class) -> void
13
+ def self.install: () -> void
14
+ def self.install_appium_converters: () -> void
15
+ def self.check_api: () -> void
16
+ def self.guard: () -> void
17
+
18
+ def register: () -> void
19
+ def ensure_registered: () -> void
20
+ def install_converter: (untyped bridge_class) -> void
21
+ def install: () -> void
22
+ def install_appium_converters: () -> void
23
+ def check_api: () -> void
24
+ def guard: () -> void
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ module Raider
2
+ class LocatorConverter
3
+ XPATH: Hash[String, Symbol]
4
+ ATTRIBUTES: Hash[String, String]
5
+ TEST_ID: String
6
+ ROLE: String
7
+
8
+ attr_reader inner: untyped
9
+
10
+ def initialize: (untyped inner) -> void
11
+ def convert: (String | Symbol how, untyped what) -> [String, untyped]
12
+
13
+ private
14
+
15
+ def owns?: (String key) -> bool
16
+ def translate: (String key, untyped value, bool exact) -> [String, String]
17
+ def split: (String key, untyped what) -> [untyped, bool]
18
+ def valid_pair?: (untyped pair) -> bool
19
+ def label_for: (String key) -> String
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ module Raider
2
+ module Matchers
3
+ class Base
4
+ module Chaining
5
+ def and: (untyped other) -> untyped
6
+ def or: (untyped other) -> untyped
7
+ def &: (untyped other) -> untyped
8
+ def |: (untyped other) -> untyped
9
+ end
10
+
11
+ STALE_HINT: String
12
+
13
+ class StaleActual < StandardError
14
+ end
15
+
16
+ NOT_FOUND: Object
17
+
18
+ class Poll < Struct[untyped]
19
+ attr_accessor actual: untyped
20
+ attr_accessor subject: untyped
21
+ attr_accessor value: untyped
22
+ attr_accessor waited: Numeric
23
+ attr_accessor elapsed: Numeric
24
+ attr_accessor stale: bool
25
+ end
26
+
27
+ attr_reader expected: untyped
28
+
29
+ def initialize: (untyped expected, ?wait: Numeric?, **untyped options) -> void
30
+ def matches?: (untyped actual) -> bool
31
+ def does_not_match?: (untyped actual) -> bool
32
+ def failure_message: () -> String
33
+ def failure_message_when_negated: () -> String
34
+ def supports_block_expectations?: () -> bool
35
+ def description: () -> String
36
+ def absent_passes?: () -> bool
37
+ def resolve: (untyped actual) -> untyped
38
+ def read_with_zero_wait: (untyped subject, Symbol method, *untyped args) -> untyped
39
+ def verb: () -> String
40
+ def read: (untyped subject) -> untyped
41
+ def pass?: (untyped value) -> bool
42
+
43
+ private
44
+
45
+ def option: (Symbol key) -> untyped
46
+
47
+ def polled_actual: () -> untyped
48
+ def wait_for: (untyped actual) -> Numeric
49
+ def poll: (untyped actual, negated: bool) -> bool
50
+ def clock: () -> Float
51
+ def settled?: (bool negated) -> bool
52
+ def gone: (Exception error, bool negated) -> bool
53
+ def negated_absent_passes?: () -> bool
54
+ def raw_element?: () -> bool
55
+ def raise_stale: () -> bot
56
+ def retried_errors: () -> Array[untyped]
57
+ def accepts_timeout?: (untyped subject, Symbol method) -> bool
58
+ def message: (String polarity) -> String
59
+ def target: () -> String
60
+ def last_seen: () -> String
61
+ def show: (untyped value) -> String
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,78 @@
1
+ module Raider
2
+ module Matchers
3
+ module Element
4
+ def self.normalise: (untyped text) -> String
5
+
6
+ class HaveText < Base
7
+ def initialize: (String | Regexp text, ?exact: bool, ?wait: Numeric?) -> void
8
+ def verb: () -> String
9
+ def read: (untyped subject) -> untyped
10
+ def pass?: (untyped value) -> bool
11
+ end
12
+
13
+ class HaveValue < Base
14
+ def verb: () -> String
15
+ def read: (untyped subject) -> untyped
16
+ def pass?: (untyped value) -> bool
17
+ end
18
+
19
+ class HaveAttribute < Base
20
+ PRESENT: Symbol
21
+
22
+ def initialize: (String name, ?untyped value, ?wait: Numeric?) -> void
23
+ def verb: () -> String
24
+ def read: (untyped subject) -> untyped
25
+ def pass?: (untyped value) -> bool
26
+ end
27
+
28
+ class State < Base
29
+ LABELS: Array[String]
30
+
31
+ def initialize: (?wait: Numeric?) -> void
32
+ def pass?: (untyped value) -> bool
33
+
34
+ private
35
+
36
+ def show: (untyped value) -> String
37
+ end
38
+
39
+ class BeVisible < State
40
+ def verb: () -> String
41
+ def read: (untyped subject) -> untyped
42
+
43
+ private
44
+
45
+ def negated_absent_passes?: () -> bool
46
+ end
47
+
48
+ class BeHidden < State
49
+ def verb: () -> String
50
+ def read: (untyped subject) -> bool
51
+ end
52
+
53
+ class BeEnabled < State
54
+ def verb: () -> String
55
+ def read: (untyped subject) -> untyped
56
+ end
57
+
58
+ class BeDisabled < State
59
+ def verb: () -> String
60
+ def read: (untyped subject) -> bool
61
+ end
62
+
63
+ class BeChecked < State
64
+ def verb: () -> String
65
+ def read: (untyped subject) -> untyped
66
+ end
67
+ end
68
+
69
+ def have_text: (String | Regexp text, ?exact: bool, ?wait: Numeric?) -> Element::HaveText
70
+ def have_value: (String | Regexp value, ?wait: Numeric?) -> Element::HaveValue
71
+ def have_attribute: (String name, ?untyped value, ?wait: Numeric?) -> Element::HaveAttribute
72
+ def be_visible: (?wait: Numeric?) -> Element::BeVisible
73
+ def be_hidden: (?wait: Numeric?) -> Element::BeHidden
74
+ def be_enabled: (?wait: Numeric?) -> Element::BeEnabled
75
+ def be_disabled: (?wait: Numeric?) -> Element::BeDisabled
76
+ def be_checked: (?wait: Numeric?) -> Element::BeChecked
77
+ end
78
+ end
@@ -0,0 +1,38 @@
1
+ module Raider
2
+ module Matchers
3
+ module Page
4
+ class HaveCount < Base
5
+ def verb: () -> String
6
+ def read: (untyped subject) -> Integer
7
+ def pass?: (untyped value) -> bool
8
+
9
+ private
10
+
11
+ def wait_for: (untyped actual) -> Numeric
12
+ def target: () -> String
13
+ end
14
+
15
+ class Driver < Base
16
+ def pass?: (untyped value) -> bool
17
+
18
+ private
19
+
20
+ def target: () -> String
21
+ end
22
+
23
+ class HaveTitle < Driver
24
+ def verb: () -> String
25
+ def read: (untyped subject) -> untyped
26
+ end
27
+
28
+ class HaveUrl < Driver
29
+ def verb: () -> String
30
+ def read: (untyped subject) -> untyped
31
+ end
32
+ end
33
+
34
+ def have_count: (Integer count, ?wait: Numeric?) -> Page::HaveCount
35
+ def have_title: (String | Regexp expected, ?wait: Numeric?) -> Page::HaveTitle
36
+ def have_url: (String | Regexp expected, ?wait: Numeric?) -> Page::HaveUrl
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ module Raider
2
+ module Matchers
3
+ module Presence
4
+ class HaveElement < Base
5
+ def verb: () -> String
6
+ def read: (untyped subject) -> Array[untyped]
7
+ def pass?: (untyped value) -> bool
8
+ def description: () -> String
9
+
10
+ private
11
+
12
+ def target: () -> String
13
+ def show: (untyped value) -> Integer
14
+ end
15
+ end
16
+
17
+ def have_element: (?Hash[Symbol, untyped]? locator, ?wait: Numeric?, **untyped by) -> Presence::HaveElement
18
+ def have_css: (String selector, ?wait: Numeric?) -> Presence::HaveElement
19
+ def have_xpath: (String selector, ?wait: Numeric?) -> Presence::HaveElement
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module Raider
2
+ module Matchers
3
+ module RetryingBlock
4
+ LOOKUP_ERRORS: Array[Class]
5
+
6
+ class Attempt
7
+ attr_reader value: untyped
8
+ attr_reader error: StandardError?
9
+
10
+ def initialize: (Proc block, ^(untyped) -> bool check) -> void
11
+ def read?: () -> bool
12
+ def pass?: () -> bool
13
+ end
14
+
15
+ def to: (?untyped matcher, ?(String | ^() -> String)? message) ?{ () -> untyped } -> untyped
16
+ def not_to: (?untyped matcher, ?(String | ^() -> String)? message) ?{ () -> untyped } -> untyped
17
+ def to_not: (?untyped matcher, ?(String | ^() -> String)? message) ?{ () -> untyped } -> untyped
18
+
19
+ private
20
+
21
+ def check: (untyped matcher, bool negated) -> (^(untyped) -> bool | Method)
22
+ def stock?: (untyped matcher) -> bool
23
+ def settle: (untyped matcher, (String | ^() -> String)? message, Symbol polarity, bool negated) ?{ () -> untyped } -> true
24
+ def give_up: (Attempt attempt, Array[untyped] arguments, Symbol polarity, Float waited) ?{ () -> untyped } -> untyped
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ module Raider
2
+ def self.report: (Symbol hook, *untyped args, **untyped details) ?{ () -> Hash[Symbol, untyped] } -> untyped
3
+
4
+ module Observer
5
+ LIB_DIR: String
6
+ GUARD_KEY: Symbol
7
+ MESSAGE_LIMIT: Integer
8
+ STRATEGIES: Hash[String, String]
9
+
10
+ class Run
11
+ @element: untyped
12
+ @action: Symbol
13
+ @args: Array[untyped]?
14
+ @retries: Integer
15
+ @started: Float
16
+ @token: untyped
17
+
18
+ def initialize: (untyped element, Symbol action, Array[untyped]? args) -> void
19
+ def ready: (Integer retries) -> untyped
20
+ def finish: (Exception? error) -> untyped
21
+
22
+ private
23
+
24
+ def finished: (Exception? error) -> Hash[Symbol, untyped]
25
+ end
26
+
27
+ def self.emit_action: (untyped element, Symbol action, ?Array[untyped]? args) { (Run?) -> untyped } -> untyped
28
+ def self.started: (untyped element, Symbol action, Array[untyped]? args) -> Hash[Symbol, untyped]
29
+ def self.locator_of: (untyped element) -> Hash[Symbol, untyped]?
30
+ def self.stamp: (untyped element, Array[untyped] args, untyped parent) -> untyped
31
+ def self.stamp_all: (Array[untyped] elements, Array[untyped] args, untyped parent) -> Array[untyped]
32
+ def self.guarded: () { () -> untyped } -> untyped
33
+ def self.stop: (untyped watcher, Exception error) -> nil
34
+ def self.millis: (Float started) -> Integer
35
+ def self.clock: () -> Float
36
+
37
+ # private singleton helpers
38
+ def self.attach: (untyped element, Hash[Symbol, untyped] stamp) -> untyped
39
+ def self.frozen_stamp: (Array[untyped] args, untyped parent) -> Hash[Symbol, untyped]
40
+ def self.summary: (Exception error) -> String
41
+ def self.describe: (Array[untyped] args, untyped parent) -> Hash[Symbol, untyped]
42
+ def self.selector: (String strategy, untyped what, Array[untyped] args) -> String
43
+ def self.role_text: (Array[untyped] args) -> String
44
+ def self.chain: (untyped parent) -> Array[Hash[Symbol, untyped]]
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ module Raider
2
+ module RoleFinder
3
+ ENGINE: String
4
+ QUERY: String
5
+ NATIVE_MESSAGE: String
6
+
7
+ def find_elements: (*untyped args) -> Array[untyped]
8
+ def find_element: (*untyped args) -> untyped
9
+ def self.role_args?: (Array[untyped] args) -> bool
10
+ def self.validated: (untyped role) -> String
11
+ def self.parse: (Array[untyped] args) -> [String, Hash[Symbol, untyped]]?
12
+ end
13
+
14
+ module RoleQuery
15
+ def self.run: (untyped bridge, untyped scope, String role, Hash[Symbol, untyped] options) -> Array[untyped]
16
+ def self.options_js: (Hash[Symbol, untyped] options) -> Hash[String, untyped]
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ module Raider
2
+ module Selectors
3
+ ATTRIBUTE_NAME: Regexp
4
+ LABEL_CONTROLS: String
5
+ EXCLUDED_TEXT: String
6
+
7
+ def self.xpath_literal: (untyped string) -> String
8
+ def self.label: (untyped value, exact: bool) -> String
9
+ def self.text: (untyped value, exact: bool) -> String
10
+ def self.attribute_css: (String name, untyped value, exact: bool) -> String
11
+ def self.test_id: (untyped value) -> String
12
+ def self.match: (String expression, String literal, bool exact) -> String
13
+
14
+ def xpath_literal: (untyped string) -> String
15
+ def label: (untyped value, exact: bool) -> String
16
+ def text: (untyped value, exact: bool) -> String
17
+ def attribute_css: (String name, untyped value, exact: bool) -> String
18
+ def test_id: (untyped value) -> String
19
+ def match: (String expression, String literal, bool exact) -> String
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ module Raider
2
+ module Locator
3
+ def self.describe: (Array[untyped] args) -> String
4
+ def self.from_hash: (Hash[untyped, untyped] hash) -> String
5
+ def self.role_arguments: (untyped value) -> String
6
+ def self.plain_arguments: (untyped value) -> String
7
+ def self.render_options: (untyped options) -> Array[String]
8
+
9
+ def describe: (Array[untyped] args) -> String
10
+ def from_hash: (Hash[untyped, untyped] hash) -> String
11
+ def role_arguments: (untyped value) -> String
12
+ def plain_arguments: (untyped value) -> String
13
+ def render_options: (untyped options) -> Array[String]
14
+ end
15
+
16
+ module StrictFinder
17
+ def find_element: (*untyped) -> Selenium::WebDriver::Element
18
+ def find_elements: (*untyped) -> Array[Selenium::WebDriver::Element]
19
+
20
+ private
21
+
22
+ def await_element: (Array[untyped] args, ^() -> Selenium::WebDriver::Element?) -> Selenium::WebDriver::Element?
23
+ def element_attempt: (Array[untyped] args) { () -> untyped } -> ^() -> Selenium::WebDriver::Element?
24
+ def elements_attempt: (Array[untyped] args) { () -> untyped } -> ^() -> Array[Selenium::WebDriver::Element]
25
+ def role_attempt: (Array[untyped] args) -> ^() -> Array[Selenium::WebDriver::Element]
26
+ def sole: (Array[untyped] args, Array[Selenium::WebDriver::Element] found, bool? strict) -> Selenium::WebDriver::Element?
27
+ def native_or_nil: () { () -> untyped } -> untyped
28
+ def not_found: (Array[untyped] args) -> String
29
+ def clock: () -> Float
30
+ end
31
+
32
+ module StrictFirst
33
+ def first: (*untyped) -> Selenium::WebDriver::Element
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ module Raider
2
+ module Wait
3
+ DEADLINE_KEY: Symbol
4
+ IMMEDIATE_KEY: Symbol
5
+
6
+ def self.deadline: () -> Float?
7
+ def self.immediately: [T] () { () -> T } -> T
8
+ def self.immediate?: () -> bool
9
+ def self.until: (?timeout: Numeric?, ?interval: Numeric) { () -> untyped } -> untyped
10
+
11
+ # private singleton helpers
12
+ def self.limits: (Numeric? timeout) -> [Float, Float]
13
+ def self.within: [T] (Float limit) { () -> T } -> T
14
+ def self.pause: (Float limit, Numeric interval) -> void
15
+ def self.now: () -> Float
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ module Raider
2
+ end
@@ -1,14 +1,10 @@
1
1
  # Type definitions for ScaffoldProjectDetector
2
2
  module ScaffoldProjectDetector
3
3
  AUTOMATION_GEMS: Hash[String, String]
4
- FRAMEWORK_GEMS: Hash[String, String]
5
4
 
6
5
  def self?.detect: () -> Hash[Symbol, String | bool | nil]
7
6
  def self?.detect_automation: (?String? gemfile) -> String
8
- def self?.detect_framework: (?String? gemfile) -> String
9
7
  def self?.read_gemfile: () -> String
10
8
  def self?.selenium?: () -> bool
11
- def self?.watir?: () -> bool
12
- def self?.wait_helper?: () -> bool
13
9
  def self?.config: () -> Hash[String, untyped]
14
10
  end
@@ -6,10 +6,8 @@ class Scaffolding < Thor::Group
6
6
 
7
7
  # Generation methods
8
8
  def generate_page: () -> void
9
- def generate_feature: () -> void
10
9
  def generate_spec: () -> void
11
10
  def generate_helper: () -> void
12
- def generate_steps: () -> void
13
11
  def generate_component: () -> void
14
12
  def generate_config: () -> void
15
13
 
@@ -21,10 +19,7 @@ class Scaffolding < Thor::Group
21
19
  def module_parts: () -> Array[String]
22
20
  def leaf_name: () -> String
23
21
  def automation_type: () -> String
24
- def framework_type: () -> String
25
22
  def project_config: () -> Hash[String, untyped]
26
23
  def selenium?: () -> bool
27
- def watir?: () -> bool
28
- def wait_helper?: () -> bool
29
24
  def default_path: (String standard_path, String file_type) -> String
30
25
  end
@@ -5,7 +5,6 @@ module Utilities
5
5
  def self?.browser=: (String browser) -> void
6
6
  def self?.page_path=: (String path) -> void
7
7
  def self?.spec_path=: (String path) -> void
8
- def self?.feature_path=: (String path) -> void
9
8
  def self?.helper_path=: (String path) -> void
10
9
  def self?.url=: (String url) -> void
11
10
  def self?.timeout=: (String | Integer seconds) -> void
@@ -13,6 +12,8 @@ module Utilities
13
12
  def self?.platform=: (String platform) -> void
14
13
  def self?.browser_options=: (Array[String] opts) -> void
15
14
  def self?.delete_browser_options: () -> void
15
+ def self?.strict=: (bool enabled) -> void
16
+ def self?.actionability=: (bool enabled) -> void
16
17
  def self?.video_enabled=: (bool enabled) -> void
17
18
  def self?.trace_enabled=: (bool enabled) -> void
18
19
  def self?.batch_update: (**untyped settings) -> void