automation_object 0.6.0 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/lib/automation_object/blue_print/hash_adapter/hook_action.rb +1 -1
  3. data/lib/automation_object/driver/appium_adapter/driver.rb +17 -1
  4. data/lib/automation_object/driver/driver.rb +7 -1
  5. data/lib/automation_object/driver/nokogiri_adapter/driver.rb +6 -0
  6. data/lib/automation_object/driver/selenium_adapter/driver.rb +16 -1
  7. data/lib/automation_object/dsl/_base.rb +6 -3
  8. data/lib/automation_object/dsl/_proxy.rb +2 -2
  9. data/lib/automation_object/dsl/element.rb +9 -3
  10. data/lib/automation_object/dsl/element_array.rb +9 -3
  11. data/lib/automation_object/dsl/element_hash.rb +9 -3
  12. data/lib/automation_object/dsl/modal.rb +9 -6
  13. data/lib/automation_object/dsl/screen.rb +5 -7
  14. data/lib/automation_object/dsl/top.rb +7 -3
  15. data/lib/automation_object/state/_base.rb +72 -0
  16. data/lib/automation_object/state/_common_element.rb +44 -0
  17. data/lib/automation_object/state/{error.rb → _error.rb} +4 -0
  18. data/lib/automation_object/state/element.rb +23 -0
  19. data/lib/automation_object/state/element_array.rb +26 -0
  20. data/lib/automation_object/state/element_hash.rb +34 -0
  21. data/lib/automation_object/state/element_proxy.rb +31 -0
  22. data/lib/automation_object/state/hook.rb +51 -0
  23. data/lib/automation_object/state/{composite/hook_action.rb → hook_action.rb} +11 -13
  24. data/lib/automation_object/state/hook_actions/action_loop.rb +43 -0
  25. data/lib/automation_object/state/hook_actions/change_screen.rb +23 -0
  26. data/lib/automation_object/state/hook_actions/change_to_previous_screen.rb +23 -0
  27. data/lib/automation_object/state/hook_actions/close_modal.rb +21 -0
  28. data/lib/automation_object/state/hook_actions/close_screen.rb +20 -0
  29. data/lib/automation_object/state/hook_actions/element_requirement.rb +30 -0
  30. data/lib/automation_object/state/hook_actions/new_screen.rb +49 -0
  31. data/lib/automation_object/state/hook_actions/possible_screen_changes.rb +23 -0
  32. data/lib/automation_object/state/{composite/hook_actions → hook_actions}/reset_screen.rb +4 -5
  33. data/lib/automation_object/state/hook_actions/show_modal.rb +18 -0
  34. data/lib/automation_object/state/hook_actions/sleep.rb +13 -0
  35. data/lib/automation_object/state/hook_actions/wait_for_elements.rb +18 -0
  36. data/lib/automation_object/state/modal.rb +47 -0
  37. data/lib/automation_object/state/screen.rb +70 -0
  38. data/lib/automation_object/state/top.rb +43 -0
  39. data/lib/automation_object/state.rb +3 -3
  40. data/lib/automation_object/version.rb +1 -1
  41. metadata +40 -43
  42. data/lib/automation_object/state/composite/_base.rb +0 -81
  43. data/lib/automation_object/state/composite/_common_element.rb +0 -38
  44. data/lib/automation_object/state/composite/element.rb +0 -24
  45. data/lib/automation_object/state/composite/element_array.rb +0 -27
  46. data/lib/automation_object/state/composite/element_hash.rb +0 -35
  47. data/lib/automation_object/state/composite/element_proxy.rb +0 -33
  48. data/lib/automation_object/state/composite/helpers/window.rb +0 -79
  49. data/lib/automation_object/state/composite/helpers/window_manager.rb +0 -59
  50. data/lib/automation_object/state/composite/hook.rb +0 -55
  51. data/lib/automation_object/state/composite/hook_actions/action_loop.rb +0 -45
  52. data/lib/automation_object/state/composite/hook_actions/change_screen.rb +0 -23
  53. data/lib/automation_object/state/composite/hook_actions/change_to_previous_screen.rb +0 -23
  54. data/lib/automation_object/state/composite/hook_actions/close_modal.rb +0 -29
  55. data/lib/automation_object/state/composite/hook_actions/close_screen.rb +0 -19
  56. data/lib/automation_object/state/composite/hook_actions/element_requirement.rb +0 -32
  57. data/lib/automation_object/state/composite/hook_actions/new_screen.rb +0 -31
  58. data/lib/automation_object/state/composite/hook_actions/possible_screen_changes.rb +0 -22
  59. data/lib/automation_object/state/composite/hook_actions/show_modal.rb +0 -23
  60. data/lib/automation_object/state/composite/hook_actions/sleep.rb +0 -15
  61. data/lib/automation_object/state/composite/hook_actions/wait_for_elements.rb +0 -20
  62. data/lib/automation_object/state/composite/modal.rb +0 -45
  63. data/lib/automation_object/state/composite/screen.rb +0 -64
  64. data/lib/automation_object/state/composite/top.rb +0 -51
  65. data/lib/automation_object/state/session.rb +0 -54
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'hook'
3
-
4
- module AutomationObject
5
- module State
6
- module Composite
7
- # Helper module for Element composite classes
8
- module CommonElement
9
- attr_accessor :cache
10
-
11
- def reset
12
- self.cache = nil
13
- end
14
-
15
- def method_hook?(name)
16
- blue_prints.method_hooks.key?(name)
17
- end
18
-
19
- # @return [Hash<Hook>] array of Hook that are defined under the element
20
- def method_hooks
21
- return @method_hooks if @method_hooks
22
-
23
- @method_hooks = {}
24
- blue_prints.method_hooks.each do |key, blue_prints|
25
- @method_hooks[key] = Hook.new(session,
26
- driver,
27
- blue_prints,
28
- key,
29
- self,
30
- location + "[#{key}]")
31
- end
32
-
33
- @method_hooks
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '_base'
3
- require_relative '_common_element'
4
-
5
- require_relative 'element_proxy'
6
-
7
- module AutomationObject
8
- module State
9
- module Composite
10
- # Element composite for managing state
11
- class Element < Base
12
- include CommonElement
13
-
14
- # @return [AutomationObject::State::Composite::ElementProxy] Selenium proxy
15
- def load
16
- return cache if cache
17
-
18
- element = driver.find_element(*blue_prints.selector_params)
19
- self.cache = ElementProxy.new(self, element)
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '_base'
3
- require_relative '_common_element'
4
-
5
- require_relative 'element_proxy'
6
-
7
- module AutomationObject
8
- module State
9
- module Composite
10
- # Element array composite for managing state
11
- class ElementArray < Base
12
- include CommonElement
13
-
14
- # @return [Array<AutomationObject::State::Composite::ElementProxy>] Selenium proxy
15
- def load
16
- return cache if cache
17
-
18
- elements = driver.find_elements(*blue_prints.selector_params)
19
-
20
- self.cache = elements.map do |element|
21
- ElementProxy.new(self, element)
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '_base'
3
- require_relative '_common_element'
4
-
5
- require_relative 'element_proxy'
6
-
7
- module AutomationObject
8
- module State
9
- module Composite
10
- # Element hash composite for managing state
11
- class ElementHash < Base
12
- include CommonElement
13
-
14
- # @return [Hash<String, AutomationObject::State::Composite::ElementProxy>] Selenium proxy
15
- def load
16
- return cache if cache
17
-
18
- elements = driver.find_elements(*blue_prints.selector_params)
19
- self.cache = {}
20
-
21
- elements.each do |element|
22
- # Want to wrap element, before sending for method!
23
- # That will help us include custom methods, etc...
24
- wrapped_element = ElementProxy.new(self, element)
25
- hash_key = wrapped_element.send(blue_prints.define_elements_by) # Send to wrapped state proxy
26
-
27
- cache[hash_key] = wrapped_element
28
- end
29
-
30
- cache
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '../../proxy/proxy'
3
-
4
- module AutomationObject
5
- module State
6
- module Composite
7
- # Proxy class to allow for usage of hooks
8
- class ElementProxy < ::AutomationObject::Proxy::Proxy
9
- def initialize(composite, element)
10
- @composite = composite
11
- @subject = element
12
- end
13
-
14
- # Overiding base method to run possible hooks
15
- def method_missing(method_symbol, *args, &block)
16
- # Run before hook if needed
17
- @composite.method_hooks[method_symbol].before if @composite.method_hook?(method_symbol)
18
-
19
- subject_return = @subject.send(method_symbol, *args, &block)
20
-
21
- # Run after hook if needed
22
- @composite.method_hooks[method_symbol].after if @composite.method_hook?(method_symbol)
23
-
24
- subject_return
25
- end
26
-
27
- def respond_to_missing?(method, include_private = false)
28
- @subject.respond_to_missing?(method, include_private)
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '../../error'
3
-
4
- module AutomationObject
5
- module State
6
- module Composite
7
- # Window class
8
- class Window
9
- # @param window_manager [AutomationObject::State::Composite::WindowManager]
10
- # @param driver [AutomationObject::Driver::Driver]
11
- # @param handle [String]
12
- # @param screen [Symbol]
13
- def initialize(window_manager, driver, handle, screen)
14
- @window_manager = window_manager
15
- @driver = driver
16
- @handle = handle
17
-
18
- # Use to control history
19
- @position = 0
20
- @history = [screen]
21
- end
22
-
23
- # @return [Symbol,nil] previous screen name
24
- def previous
25
- return nil if @position < 1
26
- @history[@position - 1]
27
- end
28
-
29
- # @param name [Symbol] screen name
30
- # @return [void]
31
- def update(name)
32
- # Reset current screen
33
- @window_manager.screens[self.name].reset
34
-
35
- @position += 1
36
- @history << name
37
- end
38
-
39
- # @return [Symbol] current screen
40
- def name
41
- @history[@position]
42
- end
43
-
44
- # @return [void]
45
- def use
46
- return if @driver.window_handle == @handle
47
- @driver.window_handle = @handle
48
- end
49
-
50
- # @return [void]
51
- def back
52
- raise CannotNavigateBack if @position.zero?
53
-
54
- @driver.back
55
- @position -= 1
56
- end
57
-
58
- # @return [void]
59
- def forward
60
- raise CannotNavigateForward if @position >= @history.length
61
-
62
- @driver.forward
63
- @position += 1
64
- end
65
-
66
- # @return [Boolean]
67
- def closed?
68
- !@driver.window_handles.include?(window_handle)
69
- end
70
-
71
- # Close the window
72
- # @return [void]
73
- def close
74
- @driver.close
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'window'
3
- require_relative '../../error'
4
-
5
- module AutomationObject
6
- module State
7
- module Composite
8
- # Collection to manage Window objects
9
- module WindowManager
10
- # @param name [Symbol] name of window to use
11
- # @return [void]
12
- def use(name)
13
- raise AutomationObject::State::ScreenNotActiveError, name unless live_screens.include?(name)
14
-
15
- windows.each do |window|
16
- next if window.name != name
17
- return if window == self.window
18
-
19
- @window = window
20
- @window.use
21
- end
22
- end
23
-
24
- # @return [AutomationObject::State::Composite::Window]
25
- def window
26
- raise AutomationObject::State::Error::NoActiveWindows unless @window
27
- @window
28
- end
29
-
30
- # @return [Array<Window>]
31
- def windows
32
- @windows ||= []
33
- end
34
-
35
- # @return [Array<String>] list of stored window handles
36
- def window_handles
37
- windows.map(&:handle)
38
- end
39
-
40
- # @return [Array<String>] list of stored screen names
41
- def live_screens
42
- windows.map(&:name)
43
- end
44
-
45
- # @return [void]
46
- def new_window(name)
47
- driver_handles = driver.window_handles
48
- diff_handles = driver_handles - window_handles
49
-
50
- # Should only have one extra window
51
- raise UnexpectedExtraWindowError if diff_handles.length > 1
52
-
53
- @window = Window.new(self, driver, diff_handles.first, name)
54
- windows << @window
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative '_base'
3
-
4
- require_relative 'hook_action'
5
- require_relative 'hook_actions/element_requirement'
6
-
7
- module AutomationObject
8
- module State
9
- module Composite
10
- # Hook composite for managing state
11
- class Hook < Base
12
- # @return [Boolean, nil] return nil if no live? check, otherwise boolean
13
- def live?
14
- before
15
-
16
- return nil if blue_prints.live?.empty?
17
-
18
- blue_prints.live?.each do |element_requirement_blueprints|
19
- hook_element_requirement = ElementRequirement.new(self, driver, element_requirement_blueprints, 1)
20
- return false unless hook_element_requirement.run
21
- end
22
-
23
- after
24
-
25
- true
26
- end
27
-
28
- # Runs the before hook
29
- # @return [Boolean, nil] return nil unless there is a hook, otherwise boolean depending on success of hook
30
- def before
31
- return nil if blue_prints.before.empty?
32
-
33
- hook_action = HookAction.new(session,
34
- driver,
35
- blue_prints.before,
36
- :hook_action, self, location + '[hook_action]')
37
-
38
- hook_action.run
39
- end
40
-
41
- # Runs the after hook
42
- # @return [Boolean, nil] return nil unless there is a hook, otherwise boolean depending on success of hook
43
- def after
44
- return nil if blue_prints.after.empty?
45
-
46
- hook_action = HookAction.new(session,
47
- driver,
48
- blue_prints.after,
49
- :hook_action, self, location + '[hook_action]')
50
- hook_action.run
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
- module AutomationObject
3
- module State
4
- module Composite
5
- # Composite action loop base class
6
- class ActionLoop
7
- # @return [AutomationObject::State::Composite::Base]
8
- attr_accessor :composite
9
- # @return [AutomationObject::Driver::Driver]
10
- attr_accessor :driver
11
- # @return [AutomationObject::BluePrint::Composite::Base]
12
- attr_accessor :blue_prints
13
- # @return [Integer]
14
- attr_accessor :loops
15
-
16
- # @param composite [AutomationObject::State::Composite::Base]
17
- # @param driver [AutomationObject::Driver::Driver]
18
- # @param blue_prints [AutomationObject::BluePrint::Composite::Base]
19
- # @param loops [Integer]
20
- def initialize(composite, driver, blue_prints, loops = 30)
21
- self.composite = composite
22
- self.driver = driver
23
- self.blue_prints = blue_prints
24
- self.loops = loops
25
- end
26
-
27
- # @return [Boolean] run success or not
28
- def run
29
- loops.times do
30
- # Sub classes implement single run
31
- return true if single_run
32
- end
33
-
34
- false
35
- end
36
-
37
- # Abstract method, override
38
- # @return [Boolean] success or not
39
- def single_run
40
- raise NotImplementedError
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'action_loop'
3
-
4
- module AutomationObject
5
- module State
6
- module Composite
7
- # Change screen hook loop
8
- class ChangeScreen < ActionLoop
9
- def single_run
10
- return false unless driver.document_complete?
11
-
12
- new_screen = composite.top.screens[blue_prints]
13
- if new_screen.load.live? != false # Need strict
14
- composite.top.window.update(blue_prints)
15
- return true
16
- else
17
- return false
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'action_loop'
3
-
4
- module AutomationObject
5
- module State
6
- module Composite
7
- # Change to previous screen hook loop
8
- class ChangeToPreviousScreen < ActionLoop
9
- def single_run
10
- return false unless driver.document_complete?
11
-
12
- new_screen = composite.top.window.previous
13
- if new_screen.load.live? != false
14
- composite.top.window.update(new_screen)
15
- return true
16
- else
17
- return false
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end