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,75 +0,0 @@
1
- module AutomationObject
2
- module BluePrintValidation
3
- module KeyValueConstants
4
- ELEMENT_KEYS = ['length', 'exists?', 'click', 'visible?', 'invisible?',
5
- 'id', 'href', 'scroll_to_view', 'x', 'y', 'width', 'height', 'drag_to_element',
6
- 'get_element_center', 'name', 'value', 'type', 'clear', 'tag_name', 'text',
7
- 'size', 'location', 'rel_location', 'send_keys', 'set_value', 'displayed?', 'selected?',
8
- 'attribute', 'clear', 'attribute', 'click', 'css_value', 'displayed?', 'enabled?',
9
- 'location', 'location_once_scrolled_into_view', 'ref', 'selected?', 'send_keys',
10
- 'size', 'submit', 'tag_name', 'text', 'content']
11
-
12
- HOOK_KEYS = ['live?', 'before_load', 'accept', 'dismiss', 'scroll_up', 'scroll_down', 'scroll_right', 'scroll_left']
13
-
14
- BASE_PAIR_TYPES = {
15
- 'base_url' => String,
16
- 'default_screen' => String,
17
- 'throttle_element_interactions' => Hash,
18
- 'throttle_element_methods' => Hash,
19
- 'throttle_driver_methods' => Hash,
20
- 'screen_transition_sleep' => Numeric,
21
- 'views' => Hash,
22
- 'screens' => Hash
23
- }
24
-
25
- THROTTLE_ELEMENT_PAIR_TYPES = Hash[*ELEMENT_KEYS.collect { |v| [v, Numeric] }.flatten]
26
-
27
- SCREEN_PAIR_TYPES = {
28
- 'modals' => Hash,
29
- 'included_views' => Array,
30
- 'automatic_screen_changes' => Array,
31
- 'elements' => Hash,
32
- 'element_groups' => Hash
33
- }.merge(Hash[*HOOK_KEYS.collect { |v| [v, Hash] }.flatten])
34
-
35
- MODAL_PAIR_TYPES = SCREEN_PAIR_TYPES
36
-
37
- ELEMENT_PAIR_TYPES = {
38
- 'in_iframe' => String,
39
- 'css' => String,
40
- 'xpath' => String,
41
- 'multiple' => TrueClass,
42
- 'multiple_ios_fix' => TrueClass,
43
- 'define_elements_by' => String,
44
- 'custom_methods' => Hash,
45
- 'custom_range' => Hash,
46
- 'remove_duplicates' => String
47
- }.merge(Hash[*ELEMENT_KEYS.collect { |v| [v, Hash] }.flatten])
48
-
49
- ELEMENT_CUSTOM_METHOD_PAIR_TYPES = {
50
- 'element_method' => String,
51
- 'evaluate' => String
52
- }
53
-
54
- HOOK_PAIR_TYPES = {
55
- 'before' => Hash,
56
- 'after' => Hash,
57
- 'elements' => Array
58
- }
59
-
60
- HOOK_ACTION_PAIR_TYPES = {
61
- 'wait_for_new_window' => TrueClass,
62
- 'show_modal' => String,
63
- 'close_window' => TrueClass,
64
- 'change_screen' => String,
65
- 'sleep' => Numeric,
66
- 'wait_for_elements' => Array,
67
- 'change_to_previous_screen' => TrueClass,
68
- 'close_modal' => TrueClass,
69
- 'automatic_onload_modals' => Array,
70
- 'reset_screen' => TrueClass,
71
- 'possible_screen_changes' => Array
72
- }
73
- end
74
- end
75
- end
@@ -1,37 +0,0 @@
1
- module AutomationObject
2
- module BluePrintValidation
3
- module ModalValidation
4
- include ScreenModalCommonMethods
5
-
6
- def validate_modals
7
- error_messages = Array.new
8
-
9
- self.get_all_modals.each { |modal|
10
- error_messages += self.validate_screen_modal(modal[:screen_name], modal[:modal_name], modal[:configuration])
11
- }
12
-
13
- return error_messages
14
- end
15
-
16
- def get_all_modals
17
- modals = Array.new
18
- return modals unless self.has_key?('screens')
19
- return modals unless self['screens'].class == Hash
20
-
21
- self['screens'].each { |screen_name, screen_configuration|
22
- next unless screen_configuration.class == Hash
23
- next unless screen_configuration.has_key?('modals')
24
- next unless screen_configuration['modals'].class == Hash
25
-
26
- screen_configuration['modals'].each { |modal_name, modal_configuration|
27
- next if modal_configuration == nil
28
- modal = {:screen_name => screen_name, :modal_name => modal_name, :configuration => modal_configuration}
29
- modals.push(modal)
30
- }
31
- }
32
-
33
- return modals
34
- end
35
- end
36
- end
37
- end
@@ -1,119 +0,0 @@
1
- module AutomationObject
2
- module BluePrintValidation
3
- module ScreenModalCommonMethods
4
- def validate_screen_modal(screen_name, modal_name = false, configuration)
5
- error_messages = Array.new
6
-
7
- if modal_name == false #Skip multiple errors
8
- unless screen_name.is_a?(String)
9
- error_message = "(screens) level key (#{screen_name}) is an invalid key type, expecting: ("
10
- error_message << String.to_s
11
- error_message << "), got: (#{screen_name.class.to_s})"
12
- error_messages.push(FormattedErrors::format_message(error_message))
13
- end
14
- else
15
- unless modal_name.is_a?(String)
16
- error_message = "(screens/#{screen_name}/modals) level key (#{modal_name}) is an invalid key type, expecting: ("
17
- error_message << String.to_s
18
- error_message << "), got: (#{modal_name.class.to_s})"
19
- error_messages.push(FormattedErrors::format_message(error_message))
20
- end
21
- end
22
-
23
- return error_messages if configuration == nil
24
-
25
- unless configuration.is_a?(Hash)
26
- if modal_name == false
27
- error_message = "(screens) level key (#{screen_name}) has an invalid value type, expecting: ("
28
- else
29
- error_message = "(screens/#{screen_name}/modals) level key (#{modal_name}) has an invalid value type, expecting: ("
30
- end
31
-
32
- error_message << Hash.to_s
33
- error_message << "), got: (#{configuration.class.to_s})"
34
- error_messages.push(FormattedErrors::format_message(error_message))
35
-
36
- return error_messages
37
- end
38
-
39
- configuration.each { |sub_screen_key, sub_screen_value|
40
- #Check if valid screen keys
41
- unless KeyValueConstants::SCREEN_PAIR_TYPES.keys.include?(sub_screen_key)
42
- if modal_name == false
43
- error_message = "(screens) level key (#{screen_name}) sub key (#{sub_screen_key}) "
44
- else
45
- error_message = "(screens/#{screen_name}/modals) level key (#{modal_name}) sub key (#{sub_screen_key}) "
46
- end
47
-
48
- error_message << 'is not a valid key, available (screens) sub level keys ('
49
- error_message << KeyValueConstants::SCREEN_PAIR_TYPES.keys.join(', ').to_s + ')'
50
- error_messages.push(FormattedErrors::format_message(error_message))
51
-
52
- next #skip if not a valid key since we are not going to check value
53
- end
54
-
55
- #Skip checking if nil, being nice
56
- next if sub_screen_value == nil
57
-
58
- #Check sub screen value
59
- unless sub_screen_value.is_a?(KeyValueConstants::SCREEN_PAIR_TYPES[sub_screen_key])
60
- if modal_name == false
61
- error_message = "(screens) level key (#{screen_name}) sub key (#{sub_screen_key}) "
62
- else
63
- error_message = "(screens/#{screen_name}/modals) level key (#{screen_name}) sub key (#{sub_screen_key}) "
64
- end
65
-
66
- error_message << 'has an invalid value type, expected: ('
67
- error_message << KeyValueConstants::SCREEN_PAIR_TYPES[sub_screen_key].to_s
68
- error_message << "), got: (#{sub_screen_value.class.to_s})"
69
- error_messages.push(FormattedErrors::format_message(error_message))
70
-
71
- next #Skip any additional validation on this
72
- end
73
-
74
- #More complex validation
75
- case sub_screen_key
76
- when 'included_views'
77
- sub_screen_value.each { |included_view|
78
- unless self.view_exists?(included_view)
79
- if modal_name == false
80
- error_message = "(screens) level key (#{screen_name}) sub key (#{sub_screen_key}) "
81
- else
82
- error_message = "(screens/#{screen_name}/modals) level key (#{screen_name}) sub key (#{sub_screen_key}) "
83
- end
84
-
85
- error_message << "included_view (#{included_view}) does not exist. Available views ("
86
- error_message << self.get_views.join(', ')
87
- error_message << ')'
88
- error_messages.push(FormattedErrors::format_message(error_message))
89
- end
90
- }
91
- when 'automatic_screen_changes'
92
- sub_screen_value.each { |automatic_screen_change|
93
- unless self.screen_exists?(automatic_screen_change)
94
- error_message = "(screens) level key (#{screen_name}) sub key (#{sub_screen_key}) "
95
- error_message << "screen (#{automatic_screen_change}) does not exist. Available screens ("
96
- error_message << self.get_screens.join(', ')
97
- error_message << ')'
98
- error_messages.push(FormattedErrors::format_message(error_message))
99
-
100
- next
101
- end
102
-
103
- unless self.screen_has_live?(automatic_screen_change)
104
- error_message = "(screens) level key (#{screen_name}) sub key (#{sub_screen_key}) "
105
- error_message << "screen (#{automatic_screen_change}) does not have live? configuration. "
106
- error_message << 'Automatic screen changes need to have associated live? configurations.'
107
- error_messages.push(FormattedErrors::format_message(error_message))
108
-
109
- next
110
- end
111
- }
112
- end
113
- }
114
-
115
- return error_messages
116
- end
117
- end
118
- end
119
- end
@@ -1,21 +0,0 @@
1
- module AutomationObject
2
- module BluePrintValidation
3
- module ScreenValidation
4
- include ScreenModalCommonMethods
5
-
6
- def validate_screens
7
- error_messages = Array.new
8
- return error_messages unless self.has_key?('screens')
9
- return error_messages unless self['screens'].class == Hash
10
-
11
- error_messages = Array.new
12
-
13
- self['screens'].each { |screen_name, screen_configuration|
14
- error_messages += self.validate_screen_modal(screen_name, screen_configuration)
15
- }
16
-
17
- return error_messages
18
- end
19
- end
20
- end
21
- end
@@ -1,32 +0,0 @@
1
- module AutomationObject
2
- module BluePrintValidation
3
- class ValidationObject < Hash
4
- include CommonMethods
5
- include BaseValidation
6
- include ScreenValidation
7
- include ModalValidation
8
- include ElementValidation
9
- include HookValidation
10
-
11
- def initialize(blue_print_object)
12
- #Figured on cloning the Hash Object, probably not needed
13
- blue_print_object_cloned = blue_print_object.clone
14
-
15
- blue_print_object_cloned.each { |key, value|
16
- self[key] = value
17
- }
18
-
19
- error_messages = Array.new
20
- error_messages += self.validate_base #BaseValidation Module
21
- error_messages += self.validate_screens #ScreenValidation Module
22
- error_messages += self.validate_modals
23
- error_messages += self.validate_elements
24
- error_messages += self.validate_hooks
25
-
26
- if error_messages.length > 0
27
- raise FormattedErrors::array_to_message(error_messages)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,27 +0,0 @@
1
- module AutomationObject
2
- module Driver
3
- class Anonymous
4
- def initialize(driver_object, object)
5
- @driver_object = driver_object
6
- @object = object
7
- end
8
-
9
- def respond_to?(method_symbol, include_private = false)
10
- @driver_object.mutex_object.synchronize do
11
- return @object.respond_to?(method_symbol, include_private)
12
- end
13
- end
14
-
15
- def method_missing(method_symbol, *arguments, &block)
16
- start_time = Time.new.to_f
17
-
18
- @driver_object.mutex_object.synchronize do
19
- object_return = @object.send(method_symbol, *arguments, &block)
20
-
21
- total_time_taken = (Time.new.to_f-start_time)
22
- return object_return
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,145 +0,0 @@
1
- module AutomationObject
2
- class Element
3
- include EventEmitter
4
- include AutomationObject::ElementHelpers
5
-
6
- WINDOW_CHECK_ON_METHOD = [:click, :drag_to_element]
7
- SCROLL_TO_VIEW_ON_METHOD = [:click, :drag_to_element, :send_keys]
8
-
9
- attr_accessor :framework_object, :driver_object,
10
- :framework_location,
11
- :screen_object, :element_object,
12
- :screen_name, :element_name,
13
- :element_methods_object
14
-
15
- attr_accessor :configuration
16
-
17
- def initialize(params)
18
- #Set params to properties
19
- self.framework_object = params[:framework_object] || raise(ArgumentError, 'framework_object is required in params')
20
-
21
- self.screen_object = params[:screen_object] || raise(ArgumentError, 'screen_object is required in params')
22
- self.driver_object = params[:driver_object] || raise(ArgumentError, 'driver_object is required in params')
23
- #Clone configuration, this will allow edit/deletes on different levels
24
- self.configuration = params[:blue_prints].clone || raise(ArgumentError, 'configuration is required in params')
25
-
26
- self.screen_name = params[:screen_name] || raise(ArgumentError, 'screen_name is required in params')
27
- self.element_name = params[:element_name] || raise(ArgumentError, 'elements_name is required in params')
28
-
29
- #Set element object if requested
30
- self.element_object = params[:element_object] if params[:element_object]
31
-
32
- #Validate properties
33
- raise ArgumentError, 'framework_object should be an Automation Object' unless self.framework_object.is_a? Framework
34
- raise ArgumentError, 'screen_object should be an Screen Object' unless self.screen_object.is_a? Screen
35
- raise ArgumentError, 'configuration should be a Hash Object' unless self.configuration.is_a? Hash
36
- raise ArgumentError, 'screen_name should be a String Object' unless self.screen_name.is_a? String
37
- raise ArgumentError, 'elements_name should be a String Object' unless self.element_name.is_a? String
38
-
39
- #This can stay alive, will reset object internally when issued to this class
40
- #ElementMethod Object will have the available methods for elements, while
41
- #allowing for thread locking on this level
42
- #Pass self into it, so it can hit above levels without much issue
43
- self.element_methods_object = ElementMethods.new(self)
44
-
45
- self.framework_location = self.screen_object.framework_location + ".#{self.element_name}"
46
- end
47
-
48
- def respond_to?(method_symbol, include_private = false)
49
- #If this Element class has the method then return true
50
- return true if super
51
-
52
- #Check ElementMethods respond_to?, need to wrap in driver mutex object
53
- return self.element_methods_object.respond_to?(method_symbol, include_private)
54
- end
55
-
56
- #Avoid deadlocking on resets
57
- def reset_element
58
- self.element_methods_object.reset_element
59
- end
60
-
61
- def check_new_window?(method_symbol)
62
- return false unless self.framework_object.is_browser?
63
- WINDOW_CHECK_ON_METHOD.include?(method_symbol)
64
- end
65
-
66
- def scroll_to_view?(method_symbol)
67
- return false unless self.framework_object.is_browser?
68
- SCROLL_TO_VIEW_ON_METHOD.include?(method_symbol)
69
- end
70
-
71
- def method_missing(method_symbol, *arguments, &block)
72
- method_string = method_symbol.to_s
73
- created_window_handle = false
74
- em_object_return = nil
75
-
76
- AutomationObject::Logger::add("Calling method #{method_symbol} on element", [self.framework_location])
77
-
78
- #Run any before hooks
79
- self.hook(method_string, 'before')
80
-
81
- #Deal with iFrames
82
- if self.framework_object.is_browser?
83
- if self.in_iframe?
84
- self.screen_object.switch_to_iframe(self.element_name)
85
- end
86
- end
87
-
88
- #Check for difference in window handles if needed
89
- if self.check_new_window?(method_symbol)
90
- before_window_handles = self.framework_object.get_window_handles
91
- end
92
-
93
-
94
- begin
95
- #Use automation object level mutex object which will lock any element operations will complete
96
- begin
97
- AutomationObject::Logger::add("Executing method #{method_symbol} on element", [self.framework_location])
98
- em_object_return = self.element_methods_object.send(method_symbol, *arguments, &block)
99
- rescue Selenium::WebDriver::Error::ElementNotVisibleError, Selenium::WebDriver::Error::UnknownError => e
100
- raise e
101
- rescue Selenium::WebDriver::Error::StaleElementReferenceError
102
- sleep(2)
103
- AutomationObject::Logger::add("Stale element error, retrying method #{method_symbol} on element", [self.framework_location])
104
- em_object_return = self.element_methods_object.send(method_symbol, *arguments, &block)
105
- rescue Selenium::WebDriver::Error::InvalidElementStateError
106
- sleep(2)
107
- AutomationObject::Logger::add("Invalid element state error, retrying method #{method_symbol} on element", [self.framework_location])
108
- self.element_methods_object.find_element
109
- em_object_return = self.element_methods_object.send(method_symbol, *arguments, &block)
110
- end
111
- rescue
112
- raise $!, "#{self.framework_location} #{$!}", $!.backtrace
113
- end
114
-
115
- if self.check_new_window?(method_symbol)
116
- after_window_handles = self.framework_object.get_window_handles
117
- window_handle_difference = after_window_handles - before_window_handles
118
- if window_handle_difference.length > 1
119
- raise "Click on element (#{self.element_name}) in screen (#{self.screen_name}) has opened more than one window."
120
- end
121
- created_window_handle = window_handle_difference.shift
122
- end
123
-
124
- self.hook(method_string, 'after', created_window_handle)
125
- return em_object_return
126
- end
127
-
128
- def hook(action, timing, created_window_handle = false)
129
- self.before_mutex_lock if action == 'before'
130
-
131
- #Return out if it doesn't meet the given requirements
132
- return unless self.configuration.class == Hash
133
- return unless self.configuration[action].class == Hash
134
- return unless self.configuration[action][timing].class == Hash
135
-
136
- hook_configuration = self.configuration[action][timing].clone
137
- self.emit :hook, {
138
- :configuration => hook_configuration,
139
- :created_window_handle => created_window_handle
140
- }
141
-
142
- self.after_mutex_lock if action == 'after'
143
- end
144
- end
145
- end