automation_object 0.5.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/lib/automation_object.rb +22 -11
- data/lib/automation_object/blue_print.rb +13 -12
- data/lib/automation_object/blue_print/composite/automatic_onload_modal.rb +9 -8
- data/lib/automation_object/blue_print/composite/base.rb +5 -4
- data/lib/automation_object/blue_print/composite/custom_method.rb +8 -7
- data/lib/automation_object/blue_print/composite/element.rb +6 -5
- data/lib/automation_object/blue_print/composite/element_array.rb +6 -5
- data/lib/automation_object/blue_print/composite/element_hash.rb +7 -6
- data/lib/automation_object/blue_print/composite/helpers/element_helper.rb +7 -7
- data/lib/automation_object/blue_print/composite/helpers/multiple_elements_helper.rb +5 -4
- data/lib/automation_object/blue_print/composite/hook.rb +9 -11
- data/lib/automation_object/blue_print/composite/hook_action.rb +25 -24
- data/lib/automation_object/blue_print/composite/hook_element_requirements.rb +14 -13
- data/lib/automation_object/blue_print/composite/modal.rb +11 -21
- data/lib/automation_object/blue_print/composite/screen.rb +22 -16
- data/lib/automation_object/blue_print/composite/top.rb +13 -12
- data/lib/automation_object/blue_print/composite/view.rb +27 -16
- data/lib/automation_object/blue_print/hash_adapter.rb +15 -11
- data/lib/automation_object/blue_print/hash_adapter/automatic_onload_modal.rb +12 -11
- data/lib/automation_object/blue_print/hash_adapter/composite.rb +28 -25
- data/lib/automation_object/blue_print/hash_adapter/custom_method.rb +11 -10
- data/lib/automation_object/blue_print/hash_adapter/element.rb +10 -9
- data/lib/automation_object/blue_print/hash_adapter/element_array.rb +10 -9
- data/lib/automation_object/blue_print/hash_adapter/element_hash.rb +11 -10
- data/lib/automation_object/blue_print/hash_adapter/helpers/element_helper.rb +20 -25
- data/lib/automation_object/blue_print/hash_adapter/helpers/multiple_elements_helper.rb +15 -14
- data/lib/automation_object/blue_print/hash_adapter/helpers/validation_error.rb +9 -8
- data/lib/automation_object/blue_print/hash_adapter/helpers/validation_helper.rb +19 -24
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate.rb +8 -5
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_allowed_keys.rb +7 -8
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_element_presence_of.rb +28 -23
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_instance_of.rb +12 -13
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_modal_presence_of.rb +27 -23
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_presence_of.rb +9 -8
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_screen_presence_of.rb +27 -23
- data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_view_presence_of.rb +25 -21
- data/lib/automation_object/blue_print/hash_adapter/hook.rb +14 -11
- data/lib/automation_object/blue_print/hash_adapter/hook_action.rb +45 -47
- data/lib/automation_object/blue_print/hash_adapter/hook_element_requirements.rb +24 -28
- data/lib/automation_object/blue_print/hash_adapter/modal.rb +14 -13
- data/lib/automation_object/blue_print/hash_adapter/screen.rb +23 -22
- data/lib/automation_object/blue_print/hash_adapter/top.rb +16 -15
- data/lib/automation_object/blue_print/hash_adapter/view.rb +58 -4
- data/lib/automation_object/blue_print/yaml_adapter.rb +33 -34
- data/lib/automation_object/driver.rb +15 -13
- data/lib/automation_object/driver/appium_adapter/driver.rb +47 -46
- data/lib/automation_object/driver/appium_adapter/element.rb +29 -96
- data/lib/automation_object/driver/base.rb +4 -2
- data/lib/automation_object/driver/common_selenium/driver.rb +60 -0
- data/lib/automation_object/driver/common_selenium/element.rb +107 -0
- data/lib/automation_object/driver/common_selenium/element_geometry.rb +86 -0
- data/lib/automation_object/driver/driver.rb +60 -30
- data/lib/automation_object/driver/element.rb +70 -15
- data/lib/automation_object/driver/nokogiri_adapter/driver.rb +88 -34
- data/lib/automation_object/driver/nokogiri_adapter/element.rb +94 -16
- data/lib/automation_object/driver/nokogiri_adapter/error.rb +29 -8
- data/lib/automation_object/driver/nokogiri_adapter/{backup/form.rb → form.rb} +19 -6
- data/lib/automation_object/driver/nokogiri_adapter/request.rb +17 -0
- data/lib/automation_object/driver/nokogiri_adapter/session.rb +94 -0
- data/lib/automation_object/driver/nokogiri_adapter/window.rb +86 -0
- data/lib/automation_object/driver/selenium_adapter/driver.rb +36 -45
- data/lib/automation_object/driver/selenium_adapter/element.rb +15 -85
- data/lib/automation_object/dsl.rb +11 -28
- data/lib/automation_object/dsl/_base.rb +70 -0
- data/lib/automation_object/dsl/_proxy.rb +24 -0
- data/lib/automation_object/dsl/element.rb +34 -0
- data/lib/automation_object/dsl/element_array.rb +34 -0
- data/lib/automation_object/dsl/element_hash.rb +34 -0
- data/lib/automation_object/dsl/modal.rb +43 -0
- data/lib/automation_object/dsl/screen.rb +45 -0
- data/lib/automation_object/dsl/top.rb +25 -0
- data/lib/automation_object/framework.rb +28 -38
- data/lib/automation_object/helpers/composite.rb +30 -27
- data/lib/automation_object/helpers/composite_hook.rb +16 -15
- data/lib/automation_object/{blue_print/helpers/file_helper.rb → helpers/file.rb} +12 -12
- data/lib/automation_object/helpers/hash.rb +6 -5
- data/lib/automation_object/helpers/kernel.rb +11 -0
- data/lib/automation_object/helpers/{reflection_helper.rb → reflection.rb} +9 -8
- data/lib/automation_object/helpers/string.rb +25 -15
- data/lib/automation_object/{proxies → proxy}/mutex_proxy.rb +18 -21
- data/lib/automation_object/proxy/proxy.rb +23 -0
- data/lib/automation_object/proxy/throttle_proxy.rb +52 -0
- data/lib/automation_object/state.rb +11 -29
- data/lib/automation_object/state/{blue_print_adapter/composite.rb → composite/_base.rb} +35 -25
- data/lib/automation_object/state/{blue_print_adapter/helpers/element_helper.rb → composite/_common_element.rb} +11 -11
- data/lib/automation_object/state/composite/element.rb +22 -0
- data/lib/automation_object/state/composite/element_array.rb +27 -0
- data/lib/automation_object/state/composite/element_hash.rb +33 -0
- data/lib/automation_object/state/composite/element_proxy.rb +33 -0
- data/lib/automation_object/state/composite/helpers/window.rb +61 -0
- data/lib/automation_object/state/composite/helpers/window_manager.rb +60 -0
- data/lib/automation_object/state/composite/hook.rb +56 -0
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_action.rb +10 -8
- data/lib/automation_object/state/composite/hook_actions/action_loop.rb +36 -0
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/change_screen.rb +7 -5
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/change_to_previous_screen.rb +7 -5
- data/lib/automation_object/state/composite/hook_actions/close_modal.rb +29 -0
- data/lib/automation_object/state/composite/hook_actions/close_screen.rb +19 -0
- data/lib/automation_object/state/composite/hook_actions/element_requirement.rb +32 -0
- data/lib/automation_object/state/composite/hook_actions/new_screen.rb +35 -0
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/possible_screen_changes.rb +8 -7
- data/lib/automation_object/state/composite/hook_actions/reset_screen.rb +14 -0
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/show_modal.rb +7 -5
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/sleep.rb +4 -2
- data/lib/automation_object/state/{blue_print_adapter → composite}/hook_actions/wait_for_elements.rb +7 -5
- data/lib/automation_object/state/composite/modal.rb +45 -0
- data/lib/automation_object/state/composite/screen.rb +58 -0
- data/lib/automation_object/state/composite/top.rb +51 -0
- data/lib/automation_object/state/error.rb +45 -6
- data/lib/automation_object/state/session.rb +25 -23
- data/lib/automation_object/step_definitions.rb +5 -3
- data/lib/automation_object/step_definitions/element.rb +77 -0
- data/lib/automation_object/step_definitions/element_array.rb +135 -0
- data/lib/automation_object/step_definitions/element_hash.rb +126 -0
- data/lib/automation_object/step_definitions/screen.rb +62 -0
- data/lib/automation_object/step_definitions/{cache.rb → support/cache.rb} +8 -6
- data/lib/automation_object/step_definitions/support/element_array.rb +40 -0
- data/lib/automation_object/step_definitions/support/element_hash.rb +41 -0
- data/lib/automation_object/step_definitions/{parse.rb → support/parse.rb} +8 -6
- data/lib/automation_object/version.rb +2 -1
- metadata +203 -103
- data/lib/automation_object/driver/helpers/selenium_driver_helper.rb +0 -41
- data/lib/automation_object/driver/helpers/selenium_element_helper.rb +0 -138
- data/lib/automation_object/driver/nokogiri_adapter/backup/driver.rb +0 -83
- data/lib/automation_object/driver/nokogiri_adapter/backup/element.rb +0 -66
- data/lib/automation_object/driver/nokogiri_adapter/backup/helpers/driver_element_helper.rb +0 -52
- data/lib/automation_object/driver/nokogiri_adapter/backup/session.rb +0 -115
- data/lib/automation_object/dsl/blue_print_adapter.rb +0 -16
- data/lib/automation_object/dsl/blue_print_adapter/composite.rb +0 -54
- data/lib/automation_object/dsl/blue_print_adapter/element.rb +0 -14
- data/lib/automation_object/dsl/blue_print_adapter/element_array.rb +0 -14
- data/lib/automation_object/dsl/blue_print_adapter/element_hash.rb +0 -14
- data/lib/automation_object/dsl/blue_print_adapter/modal.rb +0 -23
- data/lib/automation_object/dsl/blue_print_adapter/screen.rb +0 -26
- data/lib/automation_object/dsl/blue_print_adapter/top.rb +0 -19
- data/lib/automation_object/dsl/models.rb +0 -18
- data/lib/automation_object/dsl/proxies/element.rb +0 -16
- data/lib/automation_object/dsl/proxies/element_array.rb +0 -16
- data/lib/automation_object/dsl/proxies/element_hash.rb +0 -16
- data/lib/automation_object/dsl/proxies/helpers/composite_helper.rb +0 -74
- data/lib/automation_object/dsl/proxies/modal.rb +0 -17
- data/lib/automation_object/dsl/proxies/screen.rb +0 -17
- data/lib/automation_object/dsl/proxies/top.rb +0 -17
- data/lib/automation_object/proxies/proxy.rb +0 -20
- data/lib/automation_object/proxies/throttle_proxy.rb +0 -57
- data/lib/automation_object/state/blue_print_adapter.rb +0 -16
- data/lib/automation_object/state/blue_print_adapter/element.rb +0 -20
- data/lib/automation_object/state/blue_print_adapter/element_array.rb +0 -25
- data/lib/automation_object/state/blue_print_adapter/element_hash.rb +0 -31
- data/lib/automation_object/state/blue_print_adapter/element_proxy.rb +0 -28
- data/lib/automation_object/state/blue_print_adapter/helpers/screen_manager.rb +0 -137
- data/lib/automation_object/state/blue_print_adapter/helpers/window.rb +0 -39
- data/lib/automation_object/state/blue_print_adapter/hook.rb +0 -56
- data/lib/automation_object/state/blue_print_adapter/hook_actions/action_loop.rb +0 -35
- data/lib/automation_object/state/blue_print_adapter/hook_actions/close_modal.rb +0 -31
- data/lib/automation_object/state/blue_print_adapter/hook_actions/close_screen.rb +0 -19
- data/lib/automation_object/state/blue_print_adapter/hook_actions/element_requirement.rb +0 -34
- data/lib/automation_object/state/blue_print_adapter/hook_actions/new_screen.rb +0 -37
- data/lib/automation_object/state/blue_print_adapter/hook_actions/reset_screen.rb +0 -18
- data/lib/automation_object/state/blue_print_adapter/modal.rb +0 -26
- data/lib/automation_object/state/blue_print_adapter/screen.rb +0 -32
- data/lib/automation_object/state/blue_print_adapter/top.rb +0 -45
- data/lib/automation_object/step_definitions/action.rb +0 -21
- data/lib/automation_object/step_definitions/element/actions.rb +0 -87
- data/lib/automation_object/step_definitions/element/regex.rb +0 -24
- data/lib/automation_object/step_definitions/element/steps.rb +0 -67
@@ -1,80 +1,17 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative '../common_selenium/element'
|
2
3
|
|
3
4
|
module AutomationObject
|
4
5
|
module Driver
|
5
6
|
module AppiumAdapter
|
6
|
-
#Element proxy for Appium
|
7
|
-
#Conform Appium element interface to what's expected of the Driver Port
|
8
|
-
class Element < AutomationObject::
|
9
|
-
include AutomationObject::Driver::
|
7
|
+
# Element proxy for Appium
|
8
|
+
# Conform Appium element interface to what's expected of the Driver Port
|
9
|
+
class Element < AutomationObject::Proxy::Proxy
|
10
|
+
include AutomationObject::Driver::CommonSelenium::Element
|
10
11
|
|
11
|
-
def initialize(
|
12
|
-
@driver =
|
13
|
-
@subject =
|
14
|
-
end
|
15
|
-
|
16
|
-
# Set or Get attribute
|
17
|
-
# @param key [String] key of element
|
18
|
-
# @param value [String, nil] set value or leave blank
|
19
|
-
# @return [String, nil]
|
20
|
-
def attribute(key, value = nil)
|
21
|
-
@subject.attribute(key, value)
|
22
|
-
end
|
23
|
-
|
24
|
-
# @return [String] id of element
|
25
|
-
def id
|
26
|
-
@subject.id
|
27
|
-
end
|
28
|
-
|
29
|
-
# @return [String] href of element
|
30
|
-
def href
|
31
|
-
@subject.attribute('href')
|
32
|
-
end
|
33
|
-
|
34
|
-
# Text of element
|
35
|
-
# @return [String, nil]
|
36
|
-
def text
|
37
|
-
@subject.text
|
38
|
-
end
|
39
|
-
|
40
|
-
# Type into an element
|
41
|
-
# @return [void]
|
42
|
-
def send_keys(string)
|
43
|
-
@subject.send_keys(string)
|
44
|
-
end
|
45
|
-
|
46
|
-
# Clear the element field
|
47
|
-
# @return [void]
|
48
|
-
def clear
|
49
|
-
@subject.clear
|
50
|
-
end
|
51
|
-
|
52
|
-
# @return [Boolean]
|
53
|
-
def visible?
|
54
|
-
@subject.displayed?
|
55
|
-
end
|
56
|
-
|
57
|
-
# @return [Boolean]
|
58
|
-
def invisible?
|
59
|
-
!@subject.displayed?
|
60
|
-
end
|
61
|
-
|
62
|
-
# Get the location
|
63
|
-
# @return [Point]
|
64
|
-
def location
|
65
|
-
@subject.location
|
66
|
-
end
|
67
|
-
|
68
|
-
# Get the size of an element
|
69
|
-
# @return [Dimension]
|
70
|
-
def size
|
71
|
-
@subject.size
|
72
|
-
end
|
73
|
-
|
74
|
-
# Perform a submit action on an element
|
75
|
-
# @return [void]
|
76
|
-
def submit
|
77
|
-
@subject.submit
|
12
|
+
def initialize(driver, element)
|
13
|
+
@driver = driver
|
14
|
+
@subject = element
|
78
15
|
end
|
79
16
|
|
80
17
|
# Scroll the element into view
|
@@ -82,37 +19,33 @@ module AutomationObject
|
|
82
19
|
def scroll_into_view
|
83
20
|
@subject.location_once_scrolled_into_view
|
84
21
|
|
85
|
-
#Only scroll better if this is a browser and not an app
|
86
|
-
return unless @driver.
|
22
|
+
# Only scroll better if this is a browser and not an app
|
23
|
+
return unless @driver.browser?
|
24
|
+
|
25
|
+
center = element_center
|
26
|
+
@driver.execute_script("window.scroll(#{center[:x]},#{ideal_y_position});")
|
27
|
+
# Just in case in close to the top or bottom bounds of the window
|
28
|
+
element_location = @subject.location_once_scrolled_into_view
|
29
|
+
|
30
|
+
return unless (element_location[:y]).negative?
|
87
31
|
|
88
|
-
element_center = self.element_center
|
89
|
-
window_height = self.inner_window_height
|
90
32
|
scroll_position = @driver.scroll_position
|
33
|
+
scroll_y_position = scroll_position[:y] + element_location[:y]
|
34
|
+
@driver.execute_script("window.scroll(#{element_location[:x]},#{scroll_y_position});")
|
35
|
+
end
|
91
36
|
|
92
|
-
|
93
|
-
ideal_y_position = (scroll_position[:y] + element_center[:y] - (window_height.to_f / 2.0)).abs
|
94
|
-
else
|
95
|
-
ideal_y_position = (scroll_position[:y] - element_center[:y] + (window_height.to_f / 2.0)).abs
|
96
|
-
end
|
37
|
+
private
|
97
38
|
|
98
|
-
|
99
|
-
|
100
|
-
|
39
|
+
def ideal_y_position
|
40
|
+
center = element_center
|
41
|
+
window_height = inner_window_height
|
42
|
+
scroll_position = @driver.scroll_position
|
101
43
|
|
102
|
-
if
|
103
|
-
scroll_position = @driver.scroll_position
|
104
|
-
scroll_y_position = scroll_position[:y] + element_location[:y]
|
105
|
-
@driver.execute_script("window.scroll(#{element_location[:x]},#{scroll_y_position});")
|
106
|
-
end
|
107
|
-
end
|
44
|
+
return (scroll_position[:y] + center[:y] - (window_height.to_f / 2.0)).abs if center[:y] < (window_height / 2)
|
108
45
|
|
109
|
-
|
110
|
-
# @return [void]
|
111
|
-
def click
|
112
|
-
self.scroll_into_view if @driver.is_browser?
|
113
|
-
@subject.click
|
46
|
+
(scroll_position[:y] - center[:y] + (window_height.to_f / 2.0)).abs
|
114
47
|
end
|
115
48
|
end
|
116
49
|
end
|
117
50
|
end
|
118
|
-
end
|
51
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module AutomationObject
|
2
3
|
module Driver
|
4
|
+
# Base class for driver and element adapter interface
|
3
5
|
class Base
|
4
6
|
attr_accessor :adapter
|
5
7
|
|
6
|
-
def initialize(adapter_object, *
|
8
|
+
def initialize(adapter_object, *_args)
|
7
9
|
self.adapter = adapter_object
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
11
|
-
end
|
13
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative '../driver'
|
3
|
+
|
4
|
+
module AutomationObject
|
5
|
+
module Driver
|
6
|
+
module CommonSelenium
|
7
|
+
# Common Selenium/AppiumMethods
|
8
|
+
module Driver
|
9
|
+
# Suspend timeout for block running
|
10
|
+
def suspend_timeout
|
11
|
+
original_timeout = @subject.manage.timeouts.implicit_wait
|
12
|
+
@subject.manage.timeouts.implicit_wait = 0
|
13
|
+
|
14
|
+
yield
|
15
|
+
|
16
|
+
@subject.manage.timeouts.implicit_wait = original_timeout
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Point] x,y scroll position
|
20
|
+
def scroll_position
|
21
|
+
position = Point.new
|
22
|
+
|
23
|
+
position.x = @subject.execute_script('var doc = document.documentElement; return (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);').to_f
|
24
|
+
position.y = @subject.execute_script('var doc = document.documentElement; return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);').to_f
|
25
|
+
|
26
|
+
position
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Float] inner window height
|
30
|
+
def inner_window_height
|
31
|
+
@subject.execute_script('return window.innerHeight;').to_f
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param script [String] JS to run
|
35
|
+
# @return [Object, nil]
|
36
|
+
def execute_script(script)
|
37
|
+
@subject.execute_script(script)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Go back
|
41
|
+
# @return [void]
|
42
|
+
def back
|
43
|
+
@subject.navigate.back
|
44
|
+
end
|
45
|
+
|
46
|
+
# Go forward
|
47
|
+
# @return [void]
|
48
|
+
def forward
|
49
|
+
@subject.navigate.forward
|
50
|
+
end
|
51
|
+
|
52
|
+
# Refresh window
|
53
|
+
# @return [void]
|
54
|
+
def refresh
|
55
|
+
@subject.navigate.refresh
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative '../driver'
|
3
|
+
require_relative 'element_geometry'
|
4
|
+
|
5
|
+
module AutomationObject
|
6
|
+
module Driver
|
7
|
+
module CommonSelenium
|
8
|
+
# Helper module for Selenium based elements
|
9
|
+
module Element
|
10
|
+
include ElementGeometry
|
11
|
+
|
12
|
+
# @return [Boolean] element visible
|
13
|
+
def visible?
|
14
|
+
@subject.displayed?
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Boolean] element invisible
|
18
|
+
def invisible?
|
19
|
+
@subject.displayed? ? false : true
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [String, nil] id of element
|
23
|
+
def id
|
24
|
+
@subject.attribute('id')
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [String, nil] href of element
|
28
|
+
def href
|
29
|
+
@subject.attribute('href')
|
30
|
+
end
|
31
|
+
|
32
|
+
# Text of element
|
33
|
+
# @return [String, nil]
|
34
|
+
def text
|
35
|
+
@subject.text
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String, nil] content of element
|
39
|
+
def content
|
40
|
+
@subject.attribute('content')
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param key [String] attribute key to get or set
|
44
|
+
# @param value [Object] optional value to set the key as
|
45
|
+
# @return [Object] value of attribute
|
46
|
+
def attribute(key, value = false)
|
47
|
+
if value
|
48
|
+
script = "return arguments[0].#{key} = '#{value}'"
|
49
|
+
@driver.execute_script(script, @subject)
|
50
|
+
end
|
51
|
+
|
52
|
+
@subject.attribute(key)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Type into an element
|
56
|
+
# @return [void]
|
57
|
+
def send_keys(string)
|
58
|
+
@subject.send_keys(string)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Clear the element field
|
62
|
+
# @return [void]
|
63
|
+
def clear
|
64
|
+
@subject.clear
|
65
|
+
end
|
66
|
+
|
67
|
+
# Perform a submit action on an element
|
68
|
+
# @return [void]
|
69
|
+
def submit
|
70
|
+
@subject.submit
|
71
|
+
end
|
72
|
+
|
73
|
+
# Perform a click action on the element
|
74
|
+
# @return [void]
|
75
|
+
def click
|
76
|
+
scroll_into_view if @driver.browser?
|
77
|
+
@subject.click
|
78
|
+
end
|
79
|
+
|
80
|
+
# Hover over element
|
81
|
+
def hover
|
82
|
+
scroll_into_view
|
83
|
+
@driver.action.move_to(@subject).perform
|
84
|
+
end
|
85
|
+
|
86
|
+
# Helper method to switch to this element's iframe
|
87
|
+
def switch_to_iframe
|
88
|
+
@driver.switch_to.frame(iframe_switch_value)
|
89
|
+
end
|
90
|
+
|
91
|
+
protected
|
92
|
+
|
93
|
+
# Helper method for getting the value to switch to
|
94
|
+
# If value doesn't exist then create one
|
95
|
+
# @return [String] iframe value to switch to
|
96
|
+
def iframe_switch_value
|
97
|
+
iframe_switch_value = attribute('id')
|
98
|
+
iframe_switch_value = attribute('name') if iframe_switch_value.length.zero?
|
99
|
+
|
100
|
+
iframe_switch_value = attribute('name', SecureRandom.hex(16)) unless iframe_switch_value
|
101
|
+
|
102
|
+
iframe_switch_value
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative '../driver'
|
3
|
+
|
4
|
+
module AutomationObject
|
5
|
+
module Driver
|
6
|
+
module CommonSelenium
|
7
|
+
# Helper module for Selenium based elements
|
8
|
+
module ElementGeometry
|
9
|
+
# @return [Numeric] x position of element
|
10
|
+
def x
|
11
|
+
@subject.location.x
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Numeric] y position of element
|
15
|
+
def y
|
16
|
+
@subject.location.y
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Numeric] width of element
|
20
|
+
def width
|
21
|
+
@subject.size.width
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Numeric] height of element
|
25
|
+
def height
|
26
|
+
@subject.size.height
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get the location
|
30
|
+
# @return [Point]
|
31
|
+
def location
|
32
|
+
@subject.location
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the size of an element
|
36
|
+
# @return [Dimension]
|
37
|
+
def size
|
38
|
+
@subject.size
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Hash] :x, :y coordinates
|
42
|
+
def element_center
|
43
|
+
element_location = @subject.location
|
44
|
+
element_size = @subject.size
|
45
|
+
|
46
|
+
center = Point.new
|
47
|
+
center.x = (element_location.x.to_f + element_size.width.to_f / 2).to_f
|
48
|
+
center.y = (element_location.y.to_f + element_size.height.to_f / 2).to_f
|
49
|
+
|
50
|
+
center
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [BoxCoordinates] :x1, :x2, :y1, :y2 coordinates of a box
|
54
|
+
def box_coordinates
|
55
|
+
element_location = @subject.location
|
56
|
+
element_size = @subject.size
|
57
|
+
|
58
|
+
box_coordinates = BoxCoordinates.new
|
59
|
+
box_coordinates.x1 = element_location.x.to_f
|
60
|
+
box_coordinates.y1 = element_location.y.to_f
|
61
|
+
box_coordinates.x2 = element_location.x.to_f + element_size.width.to_f
|
62
|
+
box_coordinates.y2 = element_location.y.to_f + element_size.height.to_f
|
63
|
+
|
64
|
+
box_coordinates
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param second_element_object [Object] element to compare to
|
68
|
+
# @param collision_tolerance [Numeric] pixel tolerance of collisions
|
69
|
+
# @return [Boolean] element collides with other
|
70
|
+
def collides_with_element?(second_element_object, collision_tolerance = 0)
|
71
|
+
box_one = box_coordinates
|
72
|
+
box_two = second_element_object.box_coordinates
|
73
|
+
|
74
|
+
if box_one.x2 > box_two.x1 && box_one.x1 < box_two.x2 && box_one.y2 > box_two.y1 && box_one.y1 < box_two.y2
|
75
|
+
if box_one.x2 > (box_two.x1 + collision_tolerance) && (box_one.x1 + collision_tolerance) < box_two.x2 &&
|
76
|
+
box_one.y2 > (box_two.y1 + collision_tolerance) && (box_one.y1 + collision_tolerance) < box_two.y2
|
77
|
+
return true
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
false
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require_relative 'base'
|
2
3
|
require_relative 'element'
|
3
4
|
|
@@ -5,101 +6,130 @@ module AutomationObject
|
|
5
6
|
module Driver
|
6
7
|
Point = Struct.new(:x, :y)
|
7
8
|
Dimension = Struct.new(:width, :height)
|
9
|
+
BoxCoordinates = Struct.new(:x1, :y1, :x2, :y2)
|
8
10
|
|
9
|
-
#Driver adapter interface
|
10
|
-
#Adapters should meet this interface standard
|
11
|
+
# Driver adapter interface
|
12
|
+
# Adapters should meet this interface standard
|
11
13
|
class Driver < Base
|
12
14
|
# Navigates current window to a given url
|
13
15
|
# @param url [String] navigate to the following url
|
14
16
|
# @return [void]
|
15
17
|
def get(url)
|
16
|
-
|
18
|
+
adapter.get(url)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Get the title of the document
|
22
|
+
# @return [String]
|
23
|
+
def title
|
24
|
+
adapter.title
|
25
|
+
end
|
26
|
+
|
27
|
+
# Refreshes current window
|
28
|
+
# @return [void]
|
29
|
+
def refresh
|
30
|
+
adapter.refresh
|
31
|
+
end
|
32
|
+
|
33
|
+
# Go forward
|
34
|
+
# @return [void]
|
35
|
+
def forward
|
36
|
+
adapter.forward
|
37
|
+
end
|
38
|
+
|
39
|
+
# Go back
|
40
|
+
# @return [void]
|
41
|
+
def back
|
42
|
+
adapter.back
|
17
43
|
end
|
18
44
|
|
19
45
|
# Set timeout wait
|
20
46
|
# @param timeout [Integer] the timeout in seconds
|
21
47
|
# @return [void]
|
22
|
-
def
|
23
|
-
|
48
|
+
def wait(timeout = nil)
|
49
|
+
adapter.wait(timeout)
|
24
50
|
end
|
25
51
|
|
26
52
|
# @param selector_type [Symbol] selector type (:css, :xpath, etc...)
|
27
53
|
# @param selector_path [String] path to element
|
28
54
|
# @return [Boolean] exists or not
|
29
55
|
def exists?(selector_type, selector_path)
|
30
|
-
|
56
|
+
adapter.exists?(selector_type, selector_path)
|
31
57
|
end
|
32
58
|
|
33
59
|
# @param selector_type [Symbol] selector type, :css, :xpath, etc...
|
34
60
|
# @param selector_path [String] path to element
|
35
61
|
# @return [AutomationObject::Driver::Element] element
|
36
62
|
def find_element(selector_type, selector_path)
|
37
|
-
|
63
|
+
adapter.find_element(selector_type, selector_path)
|
38
64
|
end
|
39
65
|
|
40
66
|
# @param selector_type [Symbol] selector type, :css, :xpath, etc...
|
41
67
|
# @param selector_path [String] path to element
|
42
68
|
# @return [Array<AutomationObject::Driver::Element>] elements
|
43
69
|
def find_elements(selector_type, selector_path)
|
44
|
-
|
70
|
+
adapter.find_elements(selector_type, selector_path)
|
45
71
|
end
|
46
72
|
|
47
|
-
#Accept prompt either in browser or mobile
|
73
|
+
# Accept prompt either in browser or mobile
|
48
74
|
def accept_prompt
|
49
|
-
|
75
|
+
adapter.accept_prompt
|
50
76
|
end
|
51
77
|
|
52
|
-
#Dismiss the prompt
|
78
|
+
# Dismiss the prompt
|
53
79
|
def dismiss_prompt
|
54
|
-
|
80
|
+
adapter.dismiss_prompt
|
55
81
|
end
|
56
82
|
|
57
83
|
# Check if browser, more useful for Appium but can be generic here
|
58
84
|
# @return [Boolean] whether or not browser is being used
|
59
|
-
def
|
60
|
-
|
85
|
+
def browser?
|
86
|
+
adapter.browser?
|
61
87
|
end
|
62
88
|
|
63
|
-
#Window Handles
|
89
|
+
# Window Handles
|
64
90
|
# @return [Array<String>] array of window handle ids
|
65
91
|
def window_handles
|
66
|
-
|
92
|
+
adapter.window_handles
|
67
93
|
end
|
68
94
|
|
69
|
-
#Current window handle
|
95
|
+
# Current window handle
|
70
96
|
# @return [String] handle id
|
71
97
|
def window_handle
|
72
|
-
|
98
|
+
adapter.window_handle
|
73
99
|
end
|
74
100
|
|
75
|
-
#Set current window handle to, will switch windows
|
101
|
+
# Set current window handle to, will switch windows
|
76
102
|
# @param handle_value [String] window handle value
|
77
103
|
def window_handle=(handle_value)
|
78
|
-
|
104
|
+
adapter.window_handle(handle_value)
|
79
105
|
end
|
80
106
|
|
81
107
|
# Run script in browser to check if document in JS is complete
|
82
108
|
# @return [Boolean] document is complete
|
83
109
|
def document_complete?
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
# Wait till the document is complete
|
88
|
-
# @return [void]
|
89
|
-
def document_complete_wait
|
90
|
-
self.adapter.document_complete_wait
|
110
|
+
adapter.document_complete?
|
91
111
|
end
|
92
112
|
|
93
113
|
# @param script [String] JS to run
|
94
114
|
# @return [Object, nil]
|
95
115
|
def execute_script(script)
|
96
|
-
|
116
|
+
adapter.execute_script(script)
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [Point] x,y scroll position
|
120
|
+
def scroll_position
|
121
|
+
adapter.scroll_position
|
122
|
+
end
|
123
|
+
|
124
|
+
# @return [Float] inner window height
|
125
|
+
def inner_window_height
|
126
|
+
adapter.inner_window_height
|
97
127
|
end
|
98
128
|
|
99
129
|
# Destroy the driver
|
100
130
|
def quit
|
101
|
-
|
131
|
+
adapter.quit
|
102
132
|
end
|
103
133
|
end
|
104
134
|
end
|
105
|
-
end
|
135
|
+
end
|