automation_object 0.0.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/lib/automation_object.rb +14 -72
  3. data/lib/automation_object/blue_print.rb +37 -100
  4. data/lib/automation_object/blue_print/composite/automatic_onload_modal.rb +28 -0
  5. data/lib/automation_object/blue_print/composite/base.rb +18 -0
  6. data/lib/automation_object/blue_print/composite/custom_method.rb +23 -0
  7. data/lib/automation_object/blue_print/composite/element.rb +20 -0
  8. data/lib/automation_object/blue_print/composite/element_array.rb +21 -0
  9. data/lib/automation_object/blue_print/composite/element_hash.rb +26 -0
  10. data/lib/automation_object/blue_print/composite/helpers/element_helper.rb +33 -0
  11. data/lib/automation_object/blue_print/composite/helpers/multiple_elements_helper.rb +18 -0
  12. data/lib/automation_object/blue_print/composite/hook.rb +31 -0
  13. data/lib/automation_object/blue_print/composite/hook_action.rb +84 -0
  14. data/lib/automation_object/blue_print/composite/hook_element_requirements.rb +39 -0
  15. data/lib/automation_object/blue_print/composite/modal.rb +56 -0
  16. data/lib/automation_object/blue_print/composite/screen.rb +61 -0
  17. data/lib/automation_object/blue_print/composite/top.rb +51 -0
  18. data/lib/automation_object/blue_print/composite/view.rb +48 -0
  19. data/lib/automation_object/blue_print/hash_adapter.rb +17 -0
  20. data/lib/automation_object/blue_print/hash_adapter/automatic_onload_modal.rb +35 -0
  21. data/lib/automation_object/blue_print/hash_adapter/composite.rb +93 -0
  22. data/lib/automation_object/blue_print/hash_adapter/custom_method.rb +30 -0
  23. data/lib/automation_object/blue_print/hash_adapter/element.rb +34 -0
  24. data/lib/automation_object/blue_print/hash_adapter/element_array.rb +36 -0
  25. data/lib/automation_object/blue_print/hash_adapter/element_hash.rb +43 -0
  26. data/lib/automation_object/blue_print/hash_adapter/helpers/element_helper.rb +59 -0
  27. data/lib/automation_object/blue_print/hash_adapter/helpers/multiple_elements_helper.rb +35 -0
  28. data/lib/automation_object/blue_print/hash_adapter/helpers/validation_error.rb +26 -0
  29. data/lib/automation_object/blue_print/hash_adapter/helpers/validation_helper.rb +99 -0
  30. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate.rb +23 -0
  31. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_allowed_keys.rb +31 -0
  32. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_element_presence_of.rb +55 -0
  33. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_instance_of.rb +39 -0
  34. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_modal_presence_of.rb +54 -0
  35. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_presence_of.rb +36 -0
  36. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_screen_presence_of.rb +55 -0
  37. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_view_presence_of.rb +52 -0
  38. data/lib/automation_object/blue_print/hash_adapter/hook.rb +35 -0
  39. data/lib/automation_object/blue_print/hash_adapter/hook_action.rb +134 -0
  40. data/lib/automation_object/blue_print/hash_adapter/hook_element_requirements.rb +64 -0
  41. data/lib/automation_object/blue_print/hash_adapter/modal.rb +52 -0
  42. data/lib/automation_object/blue_print/hash_adapter/screen.rb +91 -0
  43. data/lib/automation_object/blue_print/hash_adapter/top.rb +63 -0
  44. data/lib/automation_object/blue_print/hash_adapter/view.rb +29 -0
  45. data/lib/automation_object/blue_print/helpers/file_helper.rb +38 -0
  46. data/lib/automation_object/blue_print/yaml_adapter.rb +50 -0
  47. data/lib/automation_object/driver.rb +44 -0
  48. data/lib/automation_object/driver/appium_adapter/driver.rb +150 -0
  49. data/lib/automation_object/driver/appium_adapter/element.rb +118 -0
  50. data/lib/automation_object/driver/base.rb +11 -0
  51. data/lib/automation_object/driver/driver.rb +69 -245
  52. data/lib/automation_object/driver/element.rb +51 -210
  53. data/lib/automation_object/driver/helpers/selenium_driver_helper.rb +41 -0
  54. data/lib/automation_object/driver/helpers/selenium_element_helper.rb +138 -0
  55. data/lib/automation_object/driver/nokogiri_adapter/backup/driver.rb +83 -0
  56. data/lib/automation_object/driver/nokogiri_adapter/backup/element.rb +66 -0
  57. data/lib/automation_object/driver/nokogiri_adapter/backup/form.rb +29 -0
  58. data/lib/automation_object/driver/nokogiri_adapter/backup/helpers/driver_element_helper.rb +52 -0
  59. data/lib/automation_object/driver/nokogiri_adapter/backup/session.rb +115 -0
  60. data/lib/automation_object/driver/nokogiri_adapter/driver.rb +104 -0
  61. data/lib/automation_object/driver/nokogiri_adapter/element.rb +85 -0
  62. data/lib/automation_object/driver/nokogiri_adapter/error.rb +17 -0
  63. data/lib/automation_object/driver/selenium_adapter/driver.rb +143 -0
  64. data/lib/automation_object/driver/selenium_adapter/element.rb +116 -0
  65. data/lib/automation_object/dsl.rb +33 -0
  66. data/lib/automation_object/dsl/blue_print_adapter.rb +16 -0
  67. data/lib/automation_object/dsl/blue_print_adapter/composite.rb +54 -0
  68. data/lib/automation_object/dsl/blue_print_adapter/element.rb +14 -0
  69. data/lib/automation_object/dsl/blue_print_adapter/element_array.rb +14 -0
  70. data/lib/automation_object/dsl/blue_print_adapter/element_hash.rb +14 -0
  71. data/lib/automation_object/dsl/blue_print_adapter/modal.rb +23 -0
  72. data/lib/automation_object/dsl/blue_print_adapter/screen.rb +26 -0
  73. data/lib/automation_object/dsl/blue_print_adapter/top.rb +19 -0
  74. data/lib/automation_object/dsl/models.rb +18 -0
  75. data/lib/automation_object/dsl/proxies/element.rb +16 -0
  76. data/lib/automation_object/dsl/proxies/element_array.rb +16 -0
  77. data/lib/automation_object/dsl/proxies/element_hash.rb +16 -0
  78. data/lib/automation_object/dsl/proxies/helpers/composite_helper.rb +74 -0
  79. data/lib/automation_object/dsl/proxies/modal.rb +17 -0
  80. data/lib/automation_object/dsl/proxies/screen.rb +17 -0
  81. data/lib/automation_object/dsl/proxies/top.rb +17 -0
  82. data/lib/automation_object/framework.rb +79 -386
  83. data/lib/automation_object/helpers/composite.rb +95 -0
  84. data/lib/automation_object/helpers/composite_hook.rb +46 -0
  85. data/lib/automation_object/helpers/hash.rb +15 -0
  86. data/lib/automation_object/helpers/reflection_helper.rb +28 -0
  87. data/lib/automation_object/helpers/string.rb +27 -0
  88. data/lib/automation_object/proxies/mutex_proxy.rb +63 -0
  89. data/lib/automation_object/proxies/proxy.rb +20 -0
  90. data/lib/automation_object/proxies/throttle_proxy.rb +57 -0
  91. data/lib/automation_object/state.rb +37 -0
  92. data/lib/automation_object/state/blue_print_adapter.rb +16 -0
  93. data/lib/automation_object/state/blue_print_adapter/composite.rb +65 -0
  94. data/lib/automation_object/state/blue_print_adapter/element.rb +20 -0
  95. data/lib/automation_object/state/blue_print_adapter/element_array.rb +25 -0
  96. data/lib/automation_object/state/blue_print_adapter/element_hash.rb +31 -0
  97. data/lib/automation_object/state/blue_print_adapter/element_proxy.rb +28 -0
  98. data/lib/automation_object/state/blue_print_adapter/helpers/element_helper.rb +31 -0
  99. data/lib/automation_object/state/blue_print_adapter/helpers/screen_manager.rb +137 -0
  100. data/lib/automation_object/state/blue_print_adapter/helpers/window.rb +39 -0
  101. data/lib/automation_object/state/blue_print_adapter/hook.rb +56 -0
  102. data/lib/automation_object/state/blue_print_adapter/hook_action.rb +33 -0
  103. data/lib/automation_object/state/blue_print_adapter/hook_actions/action_loop.rb +35 -0
  104. data/lib/automation_object/state/blue_print_adapter/hook_actions/change_screen.rb +26 -0
  105. data/lib/automation_object/state/blue_print_adapter/hook_actions/change_to_previous_screen.rb +21 -0
  106. data/lib/automation_object/state/blue_print_adapter/hook_actions/close_modal.rb +31 -0
  107. data/lib/automation_object/state/blue_print_adapter/hook_actions/close_screen.rb +19 -0
  108. data/lib/automation_object/state/blue_print_adapter/hook_actions/element_requirement.rb +34 -0
  109. data/lib/automation_object/state/blue_print_adapter/hook_actions/new_screen.rb +37 -0
  110. data/lib/automation_object/state/blue_print_adapter/hook_actions/possible_screen_changes.rb +21 -0
  111. data/lib/automation_object/state/blue_print_adapter/hook_actions/reset_screen.rb +18 -0
  112. data/lib/automation_object/state/blue_print_adapter/hook_actions/show_modal.rb +26 -0
  113. data/lib/automation_object/state/blue_print_adapter/hook_actions/sleep.rb +18 -0
  114. data/lib/automation_object/state/blue_print_adapter/hook_actions/wait_for_elements.rb +20 -0
  115. data/lib/automation_object/state/blue_print_adapter/modal.rb +26 -0
  116. data/lib/automation_object/state/blue_print_adapter/screen.rb +32 -0
  117. data/lib/automation_object/state/blue_print_adapter/top.rb +45 -0
  118. data/lib/automation_object/state/error.rb +24 -0
  119. data/lib/automation_object/state/session.rb +38 -0
  120. data/lib/automation_object/step_definitions.rb +14 -0
  121. data/lib/automation_object/step_definitions/action.rb +21 -0
  122. data/lib/automation_object/step_definitions/cache.rb +23 -0
  123. data/lib/automation_object/step_definitions/element/actions.rb +87 -0
  124. data/lib/automation_object/step_definitions/element/regex.rb +24 -0
  125. data/lib/automation_object/step_definitions/element/steps.rb +67 -0
  126. data/lib/automation_object/step_definitions/parse.rb +39 -0
  127. data/lib/automation_object/version.rb +1 -1
  128. metadata +194 -110
  129. data/lib/automation_object/blue_print_validation/base_validation.rb +0 -44
  130. data/lib/automation_object/blue_print_validation/common_methods.rb +0 -106
  131. data/lib/automation_object/blue_print_validation/element_validation.rb +0 -198
  132. data/lib/automation_object/blue_print_validation/formatted_errors.rb +0 -41
  133. data/lib/automation_object/blue_print_validation/hook_validation.rb +0 -393
  134. data/lib/automation_object/blue_print_validation/key_value_constants.rb +0 -75
  135. data/lib/automation_object/blue_print_validation/modal_validation.rb +0 -37
  136. data/lib/automation_object/blue_print_validation/screen_modal_common_methods.rb +0 -119
  137. data/lib/automation_object/blue_print_validation/screen_validation.rb +0 -21
  138. data/lib/automation_object/blue_print_validation/validation_object.rb +0 -32
  139. data/lib/automation_object/driver/anonymous.rb +0 -27
  140. data/lib/automation_object/element/element.rb +0 -145
  141. data/lib/automation_object/element/element_array.rb +0 -12
  142. data/lib/automation_object/element/element_cell.rb +0 -126
  143. data/lib/automation_object/element/element_group.rb +0 -33
  144. data/lib/automation_object/element/element_hash.rb +0 -25
  145. data/lib/automation_object/element/element_helpers.rb +0 -29
  146. data/lib/automation_object/element/element_methods.rb +0 -134
  147. data/lib/automation_object/element/elements_helpers.rb +0 -204
  148. data/lib/automation_object/framework/events.rb +0 -8
  149. data/lib/automation_object/framework/helpers.rb +0 -101
  150. data/lib/automation_object/framework/print_objects.rb +0 -67
  151. data/lib/automation_object/framework/screen_monitor.rb +0 -55
  152. data/lib/automation_object/framework/screen_routing.rb +0 -310
  153. data/lib/automation_object/framework/window_helpers.rb +0 -181
  154. data/lib/automation_object/hash.rb +0 -6
  155. data/lib/automation_object/hook_helpers.rb +0 -27
  156. data/lib/automation_object/logger.rb +0 -179
  157. data/lib/automation_object/object.rb +0 -22
  158. data/lib/automation_object/screen/modal.rb +0 -8
  159. data/lib/automation_object/screen/screen.rb +0 -209
  160. data/lib/automation_object/screen/screen_hook_helpers.rb +0 -319
  161. data/lib/automation_object/screen/screen_modal_helpers.rb +0 -101
  162. data/lib/automation_object/screen/screen_prompt_helpers.rb +0 -21
  163. data/lib/automation_object/screen/screen_window_helpers.rb +0 -149
@@ -0,0 +1,52 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'element'
6
+ require_relative 'element_array'
7
+ require_relative 'element_hash'
8
+ require_relative 'hook'
9
+
10
+ module AutomationObject
11
+ module BluePrint
12
+ module HashAdapter
13
+ #Modal-level composite, ActiveRecord style composite implementation inheriting from Composite
14
+ class Modal < Composite
15
+ #Relationships
16
+ has_one :load, interface: Hook
17
+
18
+ has_many :elements, interface: Element
19
+ has_many :element_arrays, interface: ElementArray
20
+ has_many :element_hashes, interface: ElementHash
21
+
22
+ #Validations
23
+ validates_keys allowed_keys: [:load, :elements, :element_arrays, :element_hashes]
24
+
25
+ validates :load, instance_of: Hash
26
+ validates :elements, instance_of: Hash
27
+ validates :element_arrays, instance_of: Hash
28
+ validates :element_hashes, instance_of: Hash
29
+
30
+ # @return [Array<Symbol>] array of views this can has
31
+ def included_views
32
+ included_views_array = self.hash[:included_views] ||= Array.new
33
+ included_views_array.map { |view| view.to_sym }
34
+ end
35
+
36
+ #Method to take views and merge into this composite
37
+ def merge_views
38
+ top_hash = self.top.hash
39
+
40
+ return unless top_hash.is_a?(Hash)
41
+ return unless top_hash[:views].is_a?(Hash)
42
+ top_view_hash = top_hash[:views]
43
+
44
+ self.included_views.each { |included_view|
45
+ next unless top_view_hash[included_view].is_a?(Hash)
46
+ self.hash = self.hash.deep_merge(top_view_hash[included_view])
47
+ }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,91 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'automatic_onload_modal'
6
+ require_relative 'element'
7
+ require_relative 'element_array'
8
+ require_relative 'element_hash'
9
+ require_relative 'hook'
10
+ require_relative 'modal'
11
+
12
+ module AutomationObject
13
+ module BluePrint
14
+ module HashAdapter
15
+ #Screen-level composite, ActiveRecord style composite implementation inheriting from Composite
16
+ class Screen < Composite
17
+ #Creation hooks
18
+ before_create :merge_views
19
+ before_create :automatic_onload_modals
20
+
21
+ #Relationships
22
+ has_one :load, interface: Hook
23
+ has_one :accept, interface: Hook
24
+ has_one :dismiss, interface: Hook
25
+
26
+ has_many :modals, interface: Modal
27
+ has_many :elements, interface: Element
28
+ has_many :element_arrays, interface: ElementArray
29
+ has_many :element_hashes, interface: ElementHash
30
+
31
+ #Validations
32
+ validates_keys allowed_keys: [:automatic_onload_modals, :automatic_screen_changes, :elements,
33
+ :element_arrays, :element_hashes, :included_views, :load, :modals]
34
+
35
+ validates :automatic_onload_modals, instance_of: Array, modal_presence_of: true
36
+ validates :automatic_screen_changes, instance_of: Array, screen_presence_of: true
37
+
38
+ validates :elements, instance_of: Hash
39
+ validates :element_arrays, instance_of: Hash
40
+ validates :element_hashes, instance_of: Hash
41
+
42
+ validates :included_views, instance_of: Array, view_presence_of: true
43
+
44
+ validates :load, instance_of: Hash
45
+ validates :accept, instance_of: Hash
46
+ validates :dismiss, instance_of: Hash
47
+
48
+ validates :modals, instance_of: Hash
49
+
50
+ # @return [Array<AutomaticOnloadModal>] array of AutomaticOnloadModal that are defined under the screen
51
+ def automatic_onload_modals
52
+ return @automatic_onload_modals if @automatic_onload_modals
53
+
54
+ children = self.hash[:automatic_onload_modals]
55
+ children = (children.is_a?(Array)) ? children : Array.new
56
+ @automatic_onload_modals = self.create_array_children(:automatic_onload_modals, children,
57
+ {interface: AutomaticOnloadModal,
58
+ location: self.location + '[automatic_onload_modals]'})
59
+
60
+ return @automatic_onload_modals
61
+ end
62
+
63
+ # @return [Array<Symbol>] array of screens where screen can automatically change to
64
+ def automatic_screen_changes
65
+ screen_array = self.hash[:automatic_screen_changes] ||= Array.new
66
+ screen_array.map { |screen| screen.to_sym }
67
+ end
68
+
69
+ # @return [Array<Symbol>] array of views this can has
70
+ def included_views
71
+ included_views_array = self.hash[:included_views] ||= Array.new
72
+ included_views_array.map { |view| view.to_sym }
73
+ end
74
+
75
+ #Method to take views and merge into this composite
76
+ def merge_views
77
+ top_hash = self.top.hash
78
+
79
+ return unless top_hash.is_a?(Hash)
80
+ return unless top_hash[:views].is_a?(Hash)
81
+ top_view_hash = top_hash[:views]
82
+
83
+ self.included_views.each { |included_view|
84
+ next unless top_view_hash[included_view].is_a?(Hash)
85
+ self.hash = self.hash.deep_merge(top_view_hash[included_view])
86
+ }
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,63 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'screen'
6
+ require_relative 'view'
7
+
8
+ module AutomationObject
9
+ module BluePrint
10
+ module HashAdapter
11
+ #Top composite
12
+ class Top < Composite
13
+ #Relationships
14
+ has_many :screens, interface: Screen
15
+ has_many :views, interface: View
16
+
17
+ #Validations
18
+ validates_keys allowed_keys: [:base_url, :default_screen, :screen_transition_sleep, :screens,
19
+ :throttle_driver_methods, :throttle_element_methods, :views]
20
+
21
+ validates :base_url, instance_of: String
22
+ validates :default_screen, instance_of: [Symbol, String], screen_presence_of: true
23
+ validates :screen_transition_sleep, instance_of: Numeric
24
+ validates :screens, instance_of: Hash
25
+ validates :throttle_driver_methods, instance_of: Hash
26
+ validates :throttle_element_methods, instance_of: Hash
27
+ validates :views, instance_of: Hash
28
+
29
+ # @return [String, nil] base url to navigate to upon framework creation
30
+ def base_url
31
+ self.hash[:base_url] ||= nil
32
+ end
33
+
34
+ # @return [Symbol, nil] default screen to be set when framework is created
35
+ def default_screen
36
+ default_screen = self.hash[:default_screen]
37
+
38
+ case default_screen
39
+ when Symbol, String
40
+ return default_screen.to_sym
41
+ else
42
+ return nil
43
+ end
44
+ end
45
+
46
+ # @return [Numeric] sleep when transitioning screens
47
+ def screen_transition_sleep
48
+ self.hash[:screen_transition_sleep] ||= 0
49
+ end
50
+
51
+ # @return [Hash] driver methods to throttle
52
+ def throttle_driver_methods
53
+ self.hash[:throttle_driver_methods] ||= Hash.new
54
+ end
55
+
56
+ # @return [Hash] element methods to throttle
57
+ def throttle_element_methods
58
+ self.hash[:throttle_element_methods] ||= Hash.new
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,29 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ module AutomationObject
5
+ module BluePrint
6
+ module HashAdapter
7
+ #View composite
8
+ class View < Composite
9
+ #Validations
10
+ validates_keys allowed_keys: [:automatic_onload_modals, :automatic_screen_changes, :elements, :element_arrays,
11
+ :element_groups, :element_hashes, :included_views, :load, :modals]
12
+
13
+ validates :automatic_onload_modals, instance_of: Array, modal_presence_of: true
14
+ validates :automatic_screen_changes, instance_of: Array, screen_presence_of: true
15
+
16
+ validates :elements, instance_of: Hash
17
+ validates :element_arrays, instance_of: Hash
18
+ validates :element_groups, instance_of: Hash
19
+ validates :element_hashes, instance_of: Hash
20
+
21
+ validates :included_views, instance_of: Array, view_presence_of: true
22
+
23
+ validates :load, instance_of: Hash
24
+
25
+ validates :modals, instance_of: Hash
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ module AutomationObject::BluePrint
2
+ #Collect files in directory recursively and return Array
3
+ module FileHelper
4
+ # @param path [String] specified directory path for getting files underneath
5
+ # @returns [Array] list of file paths that exist recursively underneath a directory
6
+ def collect_files(path)
7
+ unless File.exists?(path)
8
+ raise "Expecting path to exist, got #{path}"
9
+ end
10
+
11
+ if File.directory?(path)
12
+ @file_array = Array.new
13
+ self.recursive_collection(path)
14
+ else
15
+ @file_array = [path]
16
+ end
17
+
18
+ @file_array
19
+ end
20
+
21
+ protected
22
+
23
+ # Use for recursive collection of files
24
+ # @param path [String] specified directory path for getting files underneath
25
+ def recursive_collection(path)
26
+ Dir.foreach(path) do |item|
27
+ next if item == '.' or item == '..'
28
+
29
+ file_path = File.join(path, "#{item}")
30
+ if File.directory?(file_path)
31
+ self.recursive_collection(file_path)
32
+ else
33
+ @file_array.push(file_path)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,50 @@
1
+ require 'yaml'
2
+
3
+ require_relative '../blue_print'
4
+ require_relative 'hash_adapter'
5
+ require_relative 'helpers/file_helper'
6
+
7
+ module AutomationObject::BluePrint
8
+ #BluePrint YAML Adapter
9
+ module YamlAdapter
10
+ extend self
11
+ extend FileHelper
12
+
13
+ # @param path [String] path to YAML directory
14
+ # @return [AutomationObject::BluePrint::Composite::Top] Composite BluePrint Object
15
+ def build(path = '')
16
+ path = File.expand_path(path)
17
+
18
+ file_array = self.collect_files(path)
19
+ merged_yaml_hash = self.load_yaml_files(file_array)
20
+
21
+ return AutomationObject::BluePrint::HashAdapter.build(merged_yaml_hash)
22
+ end
23
+
24
+ # @param file_array [Array<String>] array of file paths to load
25
+ # @return [Hash] merged YAML Hash
26
+ def load_yaml_files(file_array)
27
+ merged_yaml_hash = Hash.new
28
+
29
+ file_array.each { |file_path|
30
+ next unless self.is_yaml_file?(file_path)
31
+
32
+ file_hash = YAML.load_file(file_path)
33
+
34
+ unless file_hash.is_a?(Hash)
35
+ raise "Expecting file #{file_path} to be a hash when loaded"
36
+ end
37
+
38
+ merged_yaml_hash = merged_yaml_hash.deep_merge(file_hash)
39
+ }
40
+
41
+ return merged_yaml_hash
42
+ end
43
+
44
+ # @param file_path [String] file path
45
+ # @return [Boolean] whether or not it is a YAML file
46
+ def is_yaml_file?(file_path)
47
+ return (file_path.match(/\.ya?ml$/)) ? true : false
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ require_relative 'helpers/string'
2
+
3
+ require_relative 'proxies/throttle_proxy'
4
+ require_relative 'proxies/mutex_proxy'
5
+
6
+ require_relative 'driver/driver'
7
+
8
+ #Adapters
9
+ require_relative 'driver/appium_adapter/driver'
10
+ require_relative 'driver/nokogiri_adapter/driver'
11
+ require_relative 'driver/selenium_adapter/driver'
12
+
13
+ module AutomationObject
14
+ #Driver Port
15
+ module Driver
16
+ extend self
17
+
18
+ def adapter
19
+ return @adapter if @adapter
20
+ self.adapter = :nokogiri
21
+ @adapter
22
+ end
23
+
24
+ # Sets adapter const will append _adapter if needed
25
+ # @param adapter_name [String] name of adapter wanted for composite creation
26
+ def adapter=(adapter_name)
27
+ adapter_name = adapter_name.to_s
28
+ adapter_name << '_adapter' unless adapter_name.match(/_adapter$/)
29
+ adapter_const = adapter_name.pascalize
30
+
31
+ @adapter = AutomationObject::Driver.const_get("#{adapter_const}")
32
+ end
33
+
34
+ # @param driver [Object] selenium or appium driver. default nil for Nokogiri
35
+ # @return [AutomationObject::Driver::Driver]
36
+ def new(driver = nil)
37
+ adapted_driver = Driver.new(self.adapter.new(driver))
38
+
39
+ #Add throttling and mutex proxies around adapter
40
+ return AutomationObject::Proxies::MutexProxy.new(
41
+ AutomationObject::Proxies::ThrottleProxy.new(adapted_driver))
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,150 @@
1
+ require 'appium_lib'
2
+
3
+ require_relative '../../proxies/proxy'
4
+ require_relative '../helpers/selenium_driver_helper'
5
+
6
+ require_relative '../element'
7
+ require_relative 'element'
8
+
9
+ module AutomationObject
10
+ module Driver
11
+ module AppiumAdapter
12
+ #Driver proxy for Appium
13
+ #Conform Appium driver interface to what's expected of the Driver Port
14
+ class Driver < AutomationObject::Proxies::Proxy
15
+ include AutomationObject::Driver::SeleniumDriverHelper
16
+
17
+ # @param driver [Appium::Driver] Appium Driver
18
+ def initialize(driver)
19
+ @subject = driver
20
+ end
21
+
22
+ # Navigates current window to a given url
23
+ # @param url [String] navigate to the following url
24
+ # @return [void]
25
+ def get(url)
26
+ @subject.get(url)
27
+ end
28
+
29
+ # @param script [String] JS to run
30
+ # @return [Object, nil]
31
+ def execute_script(script)
32
+ @subject.execute_script(script)
33
+ end
34
+
35
+ #Set timeout wait
36
+ # @param timeout [Integer] the timeout in seconds
37
+ # @return [void]
38
+ def set_wait(timeout = nil)
39
+ @subject.set_wait(timeout)
40
+ end
41
+
42
+ # @param selector_type [Symbol] selector type (:css, :xpath, etc...)
43
+ # @param selector_path [String] path to element
44
+ # @return [Boolean] exists or not
45
+ def exists?(selector_type, selector_path)
46
+ return @subject.exists { @subject.find_element(selector_type, selector_path) }
47
+ end
48
+
49
+ # @param selector_type [Symbol] selector type, :css, :xpath, etc...
50
+ # @param selector_path [String] path to element
51
+ # @return [AutomationObject::Driver::Element] element
52
+ def find_element(selector_type, selector_path)
53
+ element = @subject.find_element(selector_type, selector_path)
54
+ #Wrap element in the adapter interface
55
+ return AutomationObject::Driver::Element.new(Element.new(driver: self, element: element))
56
+ end
57
+
58
+ # @param selector_type [Symbol] selector type, :css, :xpath, etc...
59
+ # @param selector_path [String] path to element
60
+ # @return [Array<AutomationObject::Driver::Element>] element
61
+ def find_elements(selector_type, selector_path)
62
+ elements = @subject.find_elements(selector_type, selector_path)
63
+
64
+ elements.map { |element|
65
+ #Wrap element in the adapter interface
66
+ AutomationObject::Driver::Element.new(Element.new(driver: self, element: element))
67
+ }
68
+ end
69
+
70
+ # @return [void]
71
+ def accept_prompt
72
+ @subject.alert_accept
73
+ end
74
+
75
+ # @return [void]
76
+ def dismiss_prompt
77
+ @subject.alert_dismiss
78
+ end
79
+
80
+ # @return [Boolean] whether or not browser is being used
81
+ def is_browser?
82
+ return @is_browser unless @is_browser == nil
83
+ @is_browser = false
84
+
85
+ #Now we need to check Appium's contexts to see if WEBVIEW is in available_contexts
86
+ available_contexts = @subject.available_contexts
87
+ available_contexts.each { |context|
88
+ if context.match(/^WEBVIEW_\d+$/)
89
+ @is_browser = true
90
+ break
91
+ end
92
+ }
93
+
94
+ return @is_browser
95
+ end
96
+
97
+ #Window Handles Override
98
+ # @return [Array<String>] array of window handles
99
+ def window_handles
100
+ if @subject.device_is_android? and self.is_browser?
101
+ window_handles = @subject.window_handles
102
+ else
103
+ return @subject.available_contexts unless self.is_browser?
104
+
105
+ window_handles = []
106
+ @subject.available_contexts.each { |context|
107
+ window_handles.push(context) if context.match(/^WEBVIEW_\d+$/)
108
+ }
109
+ end
110
+
111
+ return window_handles
112
+ end
113
+
114
+ #Get window handle override
115
+ # @return [String] current window handle
116
+ def window_handle
117
+ return @subject.current_context unless self.is_browser?
118
+
119
+ if @subject.device_is_android?
120
+ return @subject.window_handle
121
+ else
122
+ return @subject.current_context
123
+ end
124
+ end
125
+
126
+ #Set window handle override
127
+ # @param handle_value [String] window handle value
128
+ # @return [void]
129
+ def window_handle=(handle_value)
130
+ if @subject.device_is_android?
131
+ @subject.switch_to.window(handle_value)
132
+ else
133
+ @subject.set_context(handle_value)
134
+ end
135
+ end
136
+
137
+ # @return [Boolean] document is complete
138
+ def document_complete?
139
+ return true unless self.is_browser? #Skip for non-browser Appium sessions
140
+ return @subject.execute_script('return document.readyState;') == 'complete'
141
+ end
142
+
143
+ # @return [void]
144
+ def quit
145
+ @subject.driver_quit
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end