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.
- checksums.yaml +4 -4
- data/lib/automation_object/blue_print/hash_adapter/hook_action.rb +1 -1
- data/lib/automation_object/driver/appium_adapter/driver.rb +17 -1
- data/lib/automation_object/driver/driver.rb +7 -1
- data/lib/automation_object/driver/nokogiri_adapter/driver.rb +6 -0
- data/lib/automation_object/driver/selenium_adapter/driver.rb +16 -1
- data/lib/automation_object/dsl/_base.rb +6 -3
- data/lib/automation_object/dsl/_proxy.rb +2 -2
- data/lib/automation_object/dsl/element.rb +9 -3
- data/lib/automation_object/dsl/element_array.rb +9 -3
- data/lib/automation_object/dsl/element_hash.rb +9 -3
- data/lib/automation_object/dsl/modal.rb +9 -6
- data/lib/automation_object/dsl/screen.rb +5 -7
- data/lib/automation_object/dsl/top.rb +7 -3
- data/lib/automation_object/state/_base.rb +72 -0
- data/lib/automation_object/state/_common_element.rb +44 -0
- data/lib/automation_object/state/{error.rb → _error.rb} +4 -0
- data/lib/automation_object/state/element.rb +23 -0
- data/lib/automation_object/state/element_array.rb +26 -0
- data/lib/automation_object/state/element_hash.rb +34 -0
- data/lib/automation_object/state/element_proxy.rb +31 -0
- data/lib/automation_object/state/hook.rb +51 -0
- data/lib/automation_object/state/{composite/hook_action.rb → hook_action.rb} +11 -13
- data/lib/automation_object/state/hook_actions/action_loop.rb +43 -0
- data/lib/automation_object/state/hook_actions/change_screen.rb +23 -0
- data/lib/automation_object/state/hook_actions/change_to_previous_screen.rb +23 -0
- data/lib/automation_object/state/hook_actions/close_modal.rb +21 -0
- data/lib/automation_object/state/hook_actions/close_screen.rb +20 -0
- data/lib/automation_object/state/hook_actions/element_requirement.rb +30 -0
- data/lib/automation_object/state/hook_actions/new_screen.rb +49 -0
- data/lib/automation_object/state/hook_actions/possible_screen_changes.rb +23 -0
- data/lib/automation_object/state/{composite/hook_actions → hook_actions}/reset_screen.rb +4 -5
- data/lib/automation_object/state/hook_actions/show_modal.rb +18 -0
- data/lib/automation_object/state/hook_actions/sleep.rb +13 -0
- data/lib/automation_object/state/hook_actions/wait_for_elements.rb +18 -0
- data/lib/automation_object/state/modal.rb +47 -0
- data/lib/automation_object/state/screen.rb +70 -0
- data/lib/automation_object/state/top.rb +43 -0
- data/lib/automation_object/state.rb +3 -3
- data/lib/automation_object/version.rb +1 -1
- metadata +40 -43
- data/lib/automation_object/state/composite/_base.rb +0 -81
- data/lib/automation_object/state/composite/_common_element.rb +0 -38
- data/lib/automation_object/state/composite/element.rb +0 -24
- data/lib/automation_object/state/composite/element_array.rb +0 -27
- data/lib/automation_object/state/composite/element_hash.rb +0 -35
- data/lib/automation_object/state/composite/element_proxy.rb +0 -33
- data/lib/automation_object/state/composite/helpers/window.rb +0 -79
- data/lib/automation_object/state/composite/helpers/window_manager.rb +0 -59
- data/lib/automation_object/state/composite/hook.rb +0 -55
- data/lib/automation_object/state/composite/hook_actions/action_loop.rb +0 -45
- data/lib/automation_object/state/composite/hook_actions/change_screen.rb +0 -23
- data/lib/automation_object/state/composite/hook_actions/change_to_previous_screen.rb +0 -23
- data/lib/automation_object/state/composite/hook_actions/close_modal.rb +0 -29
- data/lib/automation_object/state/composite/hook_actions/close_screen.rb +0 -19
- data/lib/automation_object/state/composite/hook_actions/element_requirement.rb +0 -32
- data/lib/automation_object/state/composite/hook_actions/new_screen.rb +0 -31
- data/lib/automation_object/state/composite/hook_actions/possible_screen_changes.rb +0 -22
- data/lib/automation_object/state/composite/hook_actions/show_modal.rb +0 -23
- data/lib/automation_object/state/composite/hook_actions/sleep.rb +0 -15
- data/lib/automation_object/state/composite/hook_actions/wait_for_elements.rb +0 -20
- data/lib/automation_object/state/composite/modal.rb +0 -45
- data/lib/automation_object/state/composite/screen.rb +0 -64
- data/lib/automation_object/state/composite/top.rb +0 -51
- 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
|