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
@@ -1,242 +1,83 @@
1
- #Thread Safe Execution Purposes
1
+ require_relative 'base'
2
+ require_relative 'driver'
3
+
2
4
  module AutomationObject
3
5
  module Driver
4
- class Element
5
- @@throttle_methods = {
6
- 'click' => 2, #Slow down, browser given back before navigation is finished
7
- #'location_once_scrolled_into_view' => 0.5 #Appeared where Firefox was failing, add a little more time
8
- }
9
- @@minimum_speed = 0 #0.01
10
-
11
- @@scroll_into_view_methods = [:click, :tap, :hover, :send_keys]
12
-
13
- def self.throttle_methods
14
- @@throttle_methods
15
- end
16
-
17
- def self.throttle_methods=(value)
18
- @@throttle_methods = value
19
- end
20
-
21
- def self.minimum_speed
22
- @@minimum_speed
23
- end
24
-
25
- def self.minimum_speed=(value)
26
- @@minimum_speed = value
27
- end
28
-
29
- def initialize(driver_object, element_object)
30
- @driver_object = driver_object
31
- @element_object = element_object
32
- end
33
-
34
- def respond_to?(method_symbol, include_private = false)
35
- return true if super
36
- return @element_object.respond_to?(method_symbol, include_private)
37
- end
38
-
39
- def method_missing(method_symbol, *arguments, &block)
40
- if @@scroll_into_view_methods.include?(method_symbol)
41
- self.scroll_into_view
42
- end
43
-
44
- @driver_object.mutex_object.synchronize do
45
- start_time = Time.new.to_f
46
- element_object_return = @element_object.send(method_symbol, *arguments, &block)
47
-
48
- self.throttle_speed(method_symbol, start_time)
49
-
50
- total_time_taken = (Time.new.to_f-start_time)
51
- AutomationObject::Logger::add_driver_element_message(total_time_taken, caller_locations, method_symbol, *arguments, &block)
52
-
53
- return element_object_return
54
- end
55
- end
56
-
57
- def throttle_speed(method_symbol, start_time)
58
- method_string = method_symbol.to_s
59
-
60
- throttle_time_minimum = @@minimum_speed
61
- if @@throttle_methods.is_a?(Hash)
62
- if @@throttle_methods.has_key?(method_string)
63
- throttle_time_minimum = @@throttle_methods[method_string].to_f
64
- end
65
- end
66
-
67
- time_difference = Time.new.to_f - start_time
68
-
69
- if time_difference < throttle_time_minimum
70
- sleep((throttle_time_minimum-time_difference))
71
- end
72
- end
73
-
74
- def collides_with_element?(second_element_object, collision_tolerance = false)
75
- box_one = self.get_box_coordinates
76
- box_two = second_element_object.get_box_coordinates
77
-
78
- collision_tolerance = 0 unless collision_tolerance.is_a?(Numeric)
79
-
80
- if box_one[:x2] > box_two[:x1] and box_one[:x1] < box_two[:x2] and box_one[:y2] > box_two[:y1] and box_one[:y1] < box_two[:y2]
81
- if box_one[:x2] > (box_two[:x1] + collision_tolerance) and (box_one[:x1] + collision_tolerance) < box_two[:x2] and
82
- box_one[:y2] > (box_two[:y1] + collision_tolerance) and (box_one[:y1] + collision_tolerance) < box_two[:y2]
83
- return true
84
- else
85
- return false
86
- end
87
- else
88
- return false
89
- end
90
- end
91
-
92
- def get_box_coordinates
93
- element_location = self.location
94
- element_size = self.size
95
-
96
- box_coordinates = Hash.new
97
- box_coordinates[:x1] = element_location.x.to_f
98
- box_coordinates[:y1] = element_location.y.to_f
99
- box_coordinates[:x2] = element_location.x.to_f + element_size.width.to_f
100
- box_coordinates[:y2] = element_location.y.to_f + element_size.height.to_f
101
-
102
- return box_coordinates
103
- end
104
-
105
- def attribute(key, value = false)
106
- @driver_object.mutex_object.synchronize do
107
- return @element_object.attribute(key) unless value
108
- end
109
-
110
- script = "return arguments[0].#{key} = '#{value}'"
111
- @driver_object.execute_script(script, @element_object)
112
-
113
- @driver_object.mutex_object.synchronize do
114
- return @element_object.attribute(key)
115
- end
116
- end
117
-
118
- def switch_to_iframe
119
- @driver_object.switch_to.frame(self.get_iframe_switch_value)
120
- end
121
-
122
- def get_iframe_switch_value
123
- iframe_switch_value = self.attribute('id')
124
- if iframe_switch_value.length == 0
125
- iframe_switch_value = self.attribute('name')
126
- end
127
-
128
- unless iframe_switch_value
129
- iframe_switch_value = self.attribute('name', SecureRandom.hex(16))
130
- end
131
-
132
- return iframe_switch_value
133
- end
134
-
135
- def get_element_center
136
- element_location = self.location
137
- element_size = self.size
138
-
139
- center = Hash.new
140
- center[:x] = (element_location.x.to_f + element_size.width.to_f/2).to_f
141
- center[:y] = (element_location.y.to_f + element_size.height.to_f/2).to_f
142
-
143
- return center
6
+ class Element < Base
7
+ # Set or Get attribute
8
+ # @param key [String] key of element
9
+ # @param value [String, nil] set value or leave blank
10
+ # @return [String, nil]
11
+ def attribute(key, value = nil)
12
+ self.adapter.attribute(key, value)
144
13
  end
145
14
 
146
- def x
147
- return self.location.x
15
+ # @return [String] id of element
16
+ def id
17
+ self.adapter.id
148
18
  end
149
19
 
150
- def y
151
- return self.location.y
20
+ # @return [String] href of element
21
+ def href
22
+ self.adapter.href
152
23
  end
153
24
 
154
- def width
155
- return self.size.width
25
+ # Text of element
26
+ # @return [String, nil]
27
+ def text
28
+ self.adapter.text
156
29
  end
157
30
 
158
- def height
159
- return self.size.height
31
+ # Type into an element
32
+ # @return [void]
33
+ def send_keys(string)
34
+ self.adapter.send_keys(string)
160
35
  end
161
36
 
162
- def hover
163
- self.scroll_into_view
164
- @driver_object.action.move_to(@element_object).perform
37
+ # Clear the element field
38
+ # @return [void]
39
+ def clear
40
+ self.adapter.clear
165
41
  end
166
42
 
43
+ # @return [Boolean]
167
44
  def visible?
168
- return self.displayed?
45
+ self.adapter.visible?
169
46
  end
170
47
 
48
+ # @return [Boolean]
171
49
  def invisible?
172
- return self.displayed? ? false : true
50
+ self.adapter.invisible?
173
51
  end
174
52
 
175
- def id
176
- return self.attribute('id').to_s
53
+ # Get the location
54
+ # @return [Point]
55
+ def location
56
+ self.adapter.location
177
57
  end
178
58
 
179
- def href
180
- return self.attribute('href').to_s
59
+ # Get the size of an element
60
+ # @return [Dimension]
61
+ def size
62
+ self.adapter.size
181
63
  end
182
64
 
183
- def content
184
- return self.attribute('content').to_s
65
+ # Perform a submit action on an element
66
+ # @return [void]
67
+ def submit
68
+ self.adapter.submit
185
69
  end
186
70
 
71
+ # Scroll the element into view
72
+ # @return [void]
187
73
  def scroll_into_view
188
- return self.scroll_to_view
74
+ self.adapter.scroll_into_view
189
75
  end
190
76
 
191
- def scroll_to_view
192
- self.location_once_scrolled_into_view
193
-
194
- if @driver_object.is_mobile?
195
- return unless @driver_object.is_browser?
196
-
197
- element_center = self.get_element_center
198
- window_height = @driver_object.execute_script('return window.innerHeight;').to_f
199
- current_y_position = @driver_object.execute_script('var doc = document.documentElement; return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);').to_f
200
-
201
- if element_center[:y] < (window_height/2)
202
- ideal_y_position = (current_y_position + element_center[:y] - (window_height.to_f / 2.0)).abs
203
- else
204
- ideal_y_position = (current_y_position - element_center[:y] + (window_height.to_f / 2.0)).abs
205
- end
206
-
207
- @driver_object.execute_script("window.scroll(#{element_center[:x].to_f},#{ideal_y_position});")
208
- #Just in case in close to the top or bottom bounds of the window
209
- element_location = self.location_once_scrolled_into_view
210
-
211
- if element_location[:y] < 0
212
- current_y_position = @driver_object.execute_script('var doc = document.documentElement; return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);').to_f
213
- scroll_y_position = current_y_position + element_location[:y]
214
- @driver_object.execute_script("window.scroll(#{element_location[:x].to_f},#{scroll_y_position});")
215
- end
216
- else
217
- element_location = self.location
218
-
219
- window_height = @driver_object.execute_script('return window.innerHeight;').to_f
220
- current_scroll_position = @driver_object.execute_script('var doc = document.documentElement; return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);').to_f
221
-
222
- middle_y_bounds = current_scroll_position + window_height/2
223
-
224
- if middle_y_bounds > element_location.y
225
- #Add
226
- y_difference = middle_y_bounds - element_location.y
227
- scroll_y_position = current_scroll_position - y_difference
228
- else
229
- #Subtract
230
- y_difference = element_location.y - middle_y_bounds
231
- scroll_y_position = current_scroll_position + y_difference
232
- end
233
-
234
- #Get the element to halfway
235
- scroll_x_position = element_location.x.to_f
236
-
237
- javascript_string = "return window.scroll(#{scroll_x_position}, #{scroll_y_position});"
238
- @driver_object.execute_script(javascript_string)
239
- end
77
+ # Perform a click action on the element
78
+ # @return [void]
79
+ def click
80
+ self.adapter.click
240
81
  end
241
82
  end
242
83
  end
@@ -0,0 +1,41 @@
1
+ module AutomationObject
2
+ module Driver
3
+ #Helper module for Selenium based drivers
4
+ #for use by SeleniumAdapter::Driver and AppiumAdapter::Driver
5
+ module SeleniumDriverHelper
6
+ # @return [Float] inner window height
7
+ def inner_window_height
8
+ @subject.execute_script('return window.innerHeight;').to_f
9
+ end
10
+
11
+ # @return [Hash] x,y scroll position
12
+ def scroll_position
13
+ position = OpenStruct.new
14
+
15
+ position.x = @subject.execute_script('var doc = document.documentElement; return (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);').to_f
16
+ position.y = @subject.execute_script('var doc = document.documentElement; return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);').to_f
17
+
18
+ return position
19
+ end
20
+
21
+ def scroll_position=(position)
22
+ @subject.execute_script("window.scroll(#{position[:x]},#{position[:y]});")
23
+ end
24
+
25
+ # @param window_dimension [Hash] :width, :height of window
26
+ def window_size=(window_dimension)
27
+ @subject.manage.window.resize_to(window_dimension[:width], window_dimension[:height])
28
+ end
29
+
30
+ # @return [Hash] :width, :height of window
31
+ def window_size
32
+ @subject.manage.window.size
33
+ end
34
+
35
+ #Maximize the current window
36
+ def maximize_window
37
+ @subject.manage.window.maximize
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,138 @@
1
+ module AutomationObject
2
+ module Driver
3
+ #Helper module for Selenium based elements
4
+ #for use by SeleniumAdapter::Element and AppiumAdapter::Element
5
+ module SeleniumElementHelper
6
+ # @return [Numeric] x position of element
7
+ def x
8
+ @subject.location.x
9
+ end
10
+
11
+ # @return [Numeric] y position of element
12
+ def y
13
+ @subject.location.y
14
+ end
15
+
16
+ # @return [Numeric] width of element
17
+ def width
18
+ @subject.size.width
19
+ end
20
+
21
+ # @return [Numeric] height of element
22
+ def height
23
+ @subject.size.height
24
+ end
25
+
26
+ # @return [Boolean] element visible
27
+ def visible?
28
+ @subject.displayed?
29
+ end
30
+
31
+ # @return [Boolean] element invisible
32
+ def invisible?
33
+ @subject.displayed? ? false : true
34
+ end
35
+
36
+ # @return [String] id of element
37
+ def id
38
+ @subject.attribute('id').to_s
39
+ end
40
+
41
+ # @return [String] href of element
42
+ def href
43
+ @subject.attribute('href').to_s
44
+ end
45
+
46
+ # @return [Boolean] content of element
47
+ def content
48
+ @subject.attribute('content').to_s
49
+ end
50
+
51
+ # @param key [String] attribute key to get or set
52
+ # @param value [Object] optional value to set the key as
53
+ # @return [Object] value of attribute
54
+ def attribute(key, value = false)
55
+ if value
56
+ script = "return arguments[0].#{key} = '#{value}'"
57
+ @driver.execute_script(script, @subject)
58
+ end
59
+
60
+ @subject.attribute(key)
61
+ end
62
+
63
+ # @return [Hash] :x, :y coordinates
64
+ def element_center
65
+ element_location = @subject.location
66
+ element_size = @subject.size
67
+
68
+ center = OpenStruct.new
69
+ center.x = (element_location.x.to_f + element_size.width.to_f/2).to_f
70
+ center.y = (element_location.y.to_f + element_size.height.to_f/2).to_f
71
+
72
+ return center
73
+ end
74
+
75
+ # @return [Hash] :x1, :x2, :y1, :y2 coordinates of a box
76
+ def box_coordinates
77
+ element_location = @subject.location
78
+ element_size = @subject.size
79
+
80
+ box_coordinates = OpenStruct.new
81
+ box_coordinates.x1 = element_location.x.to_f
82
+ box_coordinates.y1 = element_location.y.to_f
83
+ box_coordinates.x2 = element_location.x.to_f + element_size.width.to_f
84
+ box_coordinates.y2 = element_location.y.to_f + element_size.height.to_f
85
+
86
+ return box_coordinates
87
+ end
88
+
89
+ # @param second_element_object [Object] element to compare to
90
+ # @param collision_tolerance [Numeric] pixel tolerance of collisions
91
+ # @return [Boolean] element collides with other
92
+ def collides_with_element?(second_element_object, collision_tolerance = false)
93
+ box_one = self.box_coordinates
94
+ box_two = second_element_object.box_coordinates
95
+
96
+ collision_tolerance = 0 unless collision_tolerance.is_a?(Numeric)
97
+
98
+ if box_one.x2 > box_two.x1 and box_one.x1 < box_two.x2 and box_one.y2 > box_two.y1 and box_one.y1 < box_two.y2
99
+ if box_one.x2 > (box_two.x1 + collision_tolerance) and (box_one.x1 + collision_tolerance) < box_two.x2 and
100
+ box_one.y2 > (box_two.y1 + collision_tolerance) and (box_one.y1 + collision_tolerance) < box_two.y2
101
+ return true
102
+ else
103
+ return false
104
+ end
105
+ else
106
+ return false
107
+ end
108
+ end
109
+
110
+ #Hover over element
111
+ def hover
112
+ self.scroll_into_view
113
+ @driver.action.move_to(@subject).perform
114
+ end
115
+
116
+ #Helper method to switch to this element's iframe
117
+ def switch_to_iframe
118
+ @driver.switch_to.frame(self.iframe_switch_value)
119
+ end
120
+
121
+ #Helper method for getting the value to switch to
122
+ #If value doesn't exist then create one
123
+ # @return [String] iframe value to switch to
124
+ def iframe_switch_value
125
+ iframe_switch_value = self.attribute('id')
126
+ if iframe_switch_value.length == 0
127
+ iframe_switch_value = self.attribute('name')
128
+ end
129
+
130
+ unless iframe_switch_value
131
+ iframe_switch_value = self.attribute('name', SecureRandom.hex(16))
132
+ end
133
+
134
+ return iframe_switch_value
135
+ end
136
+ end
137
+ end
138
+ end