automation_object 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/automation_object/blue_print.rb +9 -2
  3. data/lib/automation_object/blue_print/composite/helpers/container_helper.rb +2 -7
  4. data/lib/automation_object/blue_print/composite/modal.rb +0 -25
  5. data/lib/automation_object/blue_print/composite/screen.rb +0 -20
  6. data/lib/automation_object/blue_print/hash_adapter.rb +1 -1
  7. data/lib/automation_object/blue_print/hash_adapter/element.rb +0 -1
  8. data/lib/automation_object/blue_print/page_object_adapter.rb +55 -0
  9. data/lib/automation_object/blue_print/page_object_adapter/automatic_modal_change.rb +34 -0
  10. data/lib/automation_object/blue_print/page_object_adapter/composite.rb +93 -0
  11. data/lib/automation_object/blue_print/page_object_adapter/custom_method.rb +27 -0
  12. data/lib/automation_object/blue_print/page_object_adapter/element.rb +16 -0
  13. data/lib/automation_object/blue_print/page_object_adapter/element_array.rb +18 -0
  14. data/lib/automation_object/blue_print/page_object_adapter/element_hash.rb +25 -0
  15. data/lib/automation_object/blue_print/page_object_adapter/helpers/element_helper.rb +62 -0
  16. data/lib/automation_object/blue_print/page_object_adapter/helpers/multiple_elements_helper.rb +37 -0
  17. data/lib/automation_object/blue_print/page_object_adapter/hook.rb +27 -0
  18. data/lib/automation_object/blue_print/page_object_adapter/hook_action.rb +112 -0
  19. data/lib/automation_object/blue_print/page_object_adapter/hook_element_requirements.rb +56 -0
  20. data/lib/automation_object/blue_print/page_object_adapter/modal.rb +27 -0
  21. data/lib/automation_object/blue_print/page_object_adapter/screen.rb +34 -0
  22. data/lib/automation_object/blue_print/page_object_adapter/top.rb +52 -0
  23. data/lib/automation_object/dsl/_error.rb +0 -27
  24. data/lib/automation_object/dsl/modal.rb +2 -2
  25. data/lib/automation_object/dsl/screen.rb +7 -6
  26. data/lib/automation_object/framework.rb +1 -8
  27. data/lib/automation_object/helpers/composite.rb +4 -4
  28. data/lib/automation_object/page_object.rb +15 -0
  29. data/lib/automation_object/page_object/base.rb +22 -0
  30. data/lib/automation_object/page_object/configuration.rb +35 -0
  31. data/lib/automation_object/page_object/element.rb +10 -0
  32. data/lib/automation_object/page_object/element_array.rb +10 -0
  33. data/lib/automation_object/page_object/element_hash.rb +10 -0
  34. data/lib/automation_object/page_object/modal.rb +10 -0
  35. data/lib/automation_object/page_object/screen.rb +10 -0
  36. data/lib/automation_object/step_definitions/element.rb +24 -18
  37. data/lib/automation_object/step_definitions/element_array.rb +28 -21
  38. data/lib/automation_object/step_definitions/element_hash.rb +28 -21
  39. data/lib/automation_object/step_definitions/support/element_array.rb +2 -2
  40. data/lib/automation_object/step_definitions/support/element_hash.rb +2 -2
  41. data/lib/automation_object/version.rb +1 -1
  42. metadata +30 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b00fa7d1b91d8a50f85fa6cd641d9f77eb2dbd40
4
- data.tar.gz: b760483a7adc8d77a0099dd2c935982d64e1b611
3
+ metadata.gz: 948c2e3cbdbda291e87ce5d000bad8871ffd9e03
4
+ data.tar.gz: f2bb2fed5cce0206a3380adf874f96ee07091241
5
5
  SHA512:
6
- metadata.gz: 5fd8bca116e06c3a059d96454f2fb9d1be23911ebb1c5a4da32779cf6d93460915bdd8655b5f3cfb6fe28fa7bc88cdd9dd58adc4ac88a5895f46a3bdb25f0e2d
7
- data.tar.gz: ce4f20355199641b260f17d5cebdea9211d12ae4ece0e06a1305e4c22d21409351c3e6522c7f178f4a9d5f56d599dda4ef850349dac6ce35803d23af48631586
6
+ metadata.gz: 9ef1f75d16980edba5bccd0324a633b4d55961f3d2a30727dec03c241ce399686f7f61db23448fd61bfd45ebf6b78415b05452c1aa1f1822fae4870909fec191
7
+ data.tar.gz: 06a21cd5eac5ccc6855c055ab78affb5315d0e3aa721d076c347e68c13ca6bfdcc16e9b000a3131ee45e85448efc6260ac29d7325e27b3b8c92b36ea3937e3a2
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'blue_print/hash_adapter'
4
4
  require_relative 'blue_print/yaml_adapter'
5
+ require_relative 'blue_print/page_object_adapter'
5
6
 
6
7
  module AutomationObject
7
8
  # BluePrint Port, encapsulation of code required to parse and build composite data structure representing UI
@@ -12,7 +13,7 @@ module AutomationObject
12
13
 
13
14
  # Get method for BluePrint adapter const for composite BluePrint build
14
15
  # Each adapter will implement common BluePrint interface
15
- # @return [AutomationObject::BluePrint::YamlAdapter, AutomationObject::BluePrint::HashAdapter]
16
+ # @return [AutomationObject::BluePrint::YamlAdapter, AutomationObject::BluePrint::HashAdapter, AutomationObject::BluePrint::PageObjectAdapter]
16
17
  def adapter
17
18
  return @adapter if @adapter
18
19
  self.adapter = :hash
@@ -34,7 +35,13 @@ module AutomationObject
34
35
  def create(blueprint_arg)
35
36
  case blueprint_arg
36
37
  when String
37
- self.adapter = :yaml
38
+ path = File.expand_path(blueprint_arg)
39
+
40
+ self.adapter = if !Dir[File.join(path, '/**/*.rb')].empty?
41
+ :page_object
42
+ else
43
+ :yaml
44
+ end
38
45
  when Hash
39
46
  self.adapter = :hash
40
47
  end
@@ -6,14 +6,9 @@ module AutomationObject
6
6
  module Composite
7
7
  # Screen composite class
8
8
  module ContainerHelper
9
- # @return [Array<AutomationObject::BluePrint::Composite::AutomaticModalChange>]
10
- def automatic_modal_changes
11
- adapter.automatic_modal_changes
12
- end
13
-
14
9
  # @return [Array<Symbol>]
15
- def automatic_screen_changes
16
- adapter.automatic_screen_changes
10
+ def included_views
11
+ adapter.included_views
17
12
  end
18
13
 
19
14
  # @return [AutomationObject::BluePrint::Composite::Hook]
@@ -18,31 +18,6 @@ module AutomationObject
18
18
  # Modal composite class
19
19
  class Modal < Base
20
20
  include ContainerHelper
21
-
22
- # @return [Array<Symbol>]
23
- def included_views
24
- adapter.included_views
25
- end
26
-
27
- # @return [AutomationObject::BluePrint::Composite::Hook]
28
- def load
29
- adapter.load
30
- end
31
-
32
- # @return [Hash<AutomationObject::BluePrint::Composite::Element>]
33
- def elements
34
- adapter.elements
35
- end
36
-
37
- # @return [Hash<AutomationObject::BluePrint::Composite::ElementArray>]
38
- def element_arrays
39
- adapter.element_arrays
40
- end
41
-
42
- # @return [Hash<AutomationObject::BluePrint::Composite::ElementHash>]
43
- def element_hashes
44
- adapter.element_hashes
45
- end
46
21
  end
47
22
  end
48
23
  end
@@ -40,30 +40,10 @@ module AutomationObject
40
40
  adapter.dismiss
41
41
  end
42
42
 
43
- # @return [AutomationObject::BluePrint::Composite::Hook]
44
- def load
45
- adapter.load
46
- end
47
-
48
43
  # @return [Hash<AutomationObject::BluePrint::Composite::Modal>]
49
44
  def modals
50
45
  adapter.modals
51
46
  end
52
-
53
- # @return [Hash<AutomationObject::BluePrint::Composite::Element>]
54
- def elements
55
- adapter.elements
56
- end
57
-
58
- # @return [Hash<AutomationObject::BluePrint::Composite::ElementArray>]
59
- def element_arrays
60
- adapter.element_arrays
61
- end
62
-
63
- # @return [Hash<AutomationObject::BluePrint::Composite::ElementHash>]
64
- def element_hashes
65
- adapter.element_hashes
66
- end
67
47
  end
68
48
  end
69
49
  end
@@ -14,7 +14,7 @@ module AutomationObject
14
14
  def build(hash = {})
15
15
  hash.symbolize_keys_deep!
16
16
 
17
- top_hash = AutomationObject::BluePrint::HashAdapter::Top.new(hash)
17
+ top_hash = self::Top.new(hash)
18
18
  AutomationObject::BluePrint::Composite::Top.new(top_hash)
19
19
  end
20
20
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Require parent class
4
3
  require_relative 'composite'
5
4
 
6
5
  # Require child classes
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ require 'securerandom'
3
+
4
+ require_relative 'composite/top'
5
+ require_relative 'page_object_adapter/top'
6
+
7
+ require_relative '../page_object'
8
+
9
+ # PageObject adapter
10
+ module AutomationObject
11
+ module BluePrint
12
+ # BluePrint PageObject Adapter
13
+ # Using classes to define page objects
14
+ module PageObjectAdapter
15
+ module_function
16
+
17
+ # @param path [String] path to PageObject classes
18
+ # @return [AutomationObject::BluePrint::Composite::Top] Composite BluePrint Object
19
+ def build(path = '')
20
+ # Require ruby files in that path into a module namespace
21
+ path = File.expand_path(path)
22
+
23
+ defined_module = define_random_module()
24
+
25
+ # Remove any defined classes in UserDefined namespace
26
+ defined_module.constants.select do |constant|
27
+ defined_module.const_get(constant).is_a? Class
28
+ defined_module.remove_const(constant)
29
+ end
30
+
31
+ # Add classes defined into UserDefined module
32
+ Dir[File.join(path, '**/*.rb')].each do |file|
33
+ defined_module.module_eval(File.read(file))
34
+ end
35
+
36
+ # Will look for classes defined
37
+ adapter_top = self::Top.new(defined_module)
38
+ AutomationObject::BluePrint::Composite::Top.new(adapter_top)
39
+ end
40
+
41
+ def define_random_module
42
+ random_module_name = [*('A'..'Z')].sample(20).join
43
+ random_module_symbol = random_module_name.to_sym
44
+
45
+ AutomationObject::BluePrint::PageObjectAdapter.module_eval %Q?
46
+ module #{random_module_name}
47
+
48
+ end
49
+ ?
50
+
51
+ const_get(random_module_symbol)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'composite'
4
+
5
+ module AutomationObject
6
+ module BluePrint
7
+ module PageObjectAdapter
8
+ # Modal composite
9
+ class AutomaticModalChange < Composite
10
+ # @return [Symbol, nil]
11
+ def modal_name
12
+ modal_name = get_property(:modal_name)
13
+
14
+ case modal_name
15
+ when Symbol, String
16
+ return modal_name.to_sym
17
+ else
18
+ return nil
19
+ end
20
+ end
21
+
22
+ # @return [Integer]
23
+ def number_of_checks
24
+ get_property(:number_of_checks) || 1
25
+ end
26
+
27
+ # @return [Boolean]
28
+ def close
29
+ get_property(:close) || false
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../helpers/composite'
4
+ require_relative '../../helpers/string'
5
+
6
+ require_relative '../../page_object'
7
+
8
+ module AutomationObject
9
+ module BluePrint
10
+ module PageObjectAdapter
11
+ # Base composite for PageObject adapter
12
+ class Composite < AutomationObject::Composite
13
+ # @return [Module]
14
+ attr_accessor :user_defined_module
15
+
16
+ # @return [AutomationObject::PageObject::Base]
17
+ attr_accessor :constant
18
+
19
+ # @param user_defined_module [Module] runtime defined module for loaded page objects
20
+ # @param constant [Class] class to build composite off of
21
+ # @param name [Symbol] name of composite element
22
+ # @param parent [Object, nil] parent composite object
23
+ # @param location [String] string location for error/debugging purposes
24
+ def initialize(user_defined_module, constant = nil, name = :top, parent = nil, location = 'top')
25
+ self.user_defined_module = user_defined_module
26
+ self.constant = constant.is_a?(Class) ? constant : nil
27
+
28
+ super(name, parent, location)
29
+ end
30
+
31
+ # Get child of composite
32
+ # @param name [Symbol] name of child
33
+ # @param options [Hash] options for child
34
+ # @return child [Object, nil] return child composite object
35
+ def get_child(name, options)
36
+ self.constant.constants.each { |constant_symbol|
37
+ constant = self.constant.const_get(constant_symbol)
38
+
39
+ # Check to see if constant is a child class of the public PageObject interface
40
+ next unless constant < get_page_object(options[:interface])
41
+
42
+ name = constant.name.split('::').last.to_underscore.to_sym
43
+ return create_composite(constant, options[:interface], name)
44
+ }
45
+
46
+ nil
47
+ end
48
+
49
+ # Get children of composite
50
+ # @param name [Symbol] name of child
51
+ # @param options [Hash] options for child
52
+ # @return [Hash] return children and names
53
+ def get_children(name, options)
54
+ new_children = {}
55
+
56
+ self.constant.constants.each { |constant_symbol|
57
+ constant = self.constant.const_get(constant_symbol)
58
+
59
+ # Check to see if constant is a child class of the public PageObject interface
60
+ next unless constant < get_page_object(options[:interface])
61
+
62
+ name = constant.name.split('::').last.to_underscore.to_sym
63
+ new_children[name] = create_composite(constant, options[:interface], name)
64
+ }
65
+
66
+ new_children
67
+ end
68
+
69
+ def create_composite(constant, interface, name)
70
+ # Get the Composite Class that corresponds with the PageObjectAdapter Class
71
+ class_name = interface.name.split('::').last
72
+ child_location = location + "[#{name}]"
73
+
74
+ require_relative "../composite/#{class_name.to_underscore}"
75
+ composite_class = AutomationObject::BluePrint::Composite.const_get(class_name)
76
+
77
+ composite_class.new(interface.new(user_defined_module, constant, name, self, child_location))
78
+ end
79
+
80
+ def get_page_object(adapter_interface)
81
+ name = adapter_interface.name.split('::').last.to_sym
82
+ AutomationObject::PageObject.const_get(name)
83
+ end
84
+
85
+ # @param name [Symbol]
86
+ # @return [Object]
87
+ def get_property(name)
88
+ self.constant.get_property(name)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'composite'
4
+
5
+ module AutomationObject
6
+ module BluePrint
7
+ module PageObjectAdapter
8
+ # CustomMethod composite
9
+ class CustomMethod < Composite
10
+ def element_method
11
+ element_method = get_property(:element_method)
12
+
13
+ case element_method
14
+ when Symbol, String
15
+ return element_method.to_sym
16
+ else
17
+ return nil
18
+ end
19
+ end
20
+
21
+ def evaluate
22
+ get_property(:evaluate) || nil
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'composite'
4
+
5
+ require_relative 'helpers/element_helper'
6
+
7
+ module AutomationObject
8
+ module BluePrint
9
+ module PageObjectAdapter
10
+ # Element composite
11
+ class Element < Composite
12
+ include ElementHelper
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'composite'
4
+
5
+ require_relative 'helpers/element_helper'
6
+ require_relative 'helpers/multiple_elements_helper'
7
+
8
+ module AutomationObject
9
+ module BluePrint
10
+ module PageObjectAdapter
11
+ # ElementArray composite
12
+ class ElementArray < Composite
13
+ include ElementHelper
14
+ include MultipleElementsHelper
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'composite'
4
+
5
+ require_relative 'helpers/element_helper'
6
+ require_relative 'helpers/multiple_elements_helper'
7
+
8
+ module AutomationObject
9
+ module BluePrint
10
+ module PageObjectAdapter
11
+ # ElementHash composite
12
+ class ElementHash < Composite
13
+ include ElementHelper
14
+ include MultipleElementsHelper
15
+
16
+ # @return [Symbol, nil] element method to define element keys by
17
+ def define_elements_by
18
+ return nil unless get_property(:define_elements_by)
19
+
20
+ get_property(:define_elements_by).to_sym
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../hook'
4
+
5
+ module AutomationObject
6
+ module BluePrint
7
+ module PageObjectAdapter
8
+ # Helper module for Element composite classes
9
+ module ElementHelper
10
+ # @return [String, nil] text input for automatic screen/modal change if needed
11
+ def default_input
12
+ get_property(:default_input)
13
+ end
14
+
15
+ # @return [Array<Symbol, String>, nil] params as an array for driver find_element args
16
+ def selector_params
17
+ if hash[:xpath].is_a?(String)
18
+ [:xpath, hash[:xpath]]
19
+ elsif hash[:css].is_a?(String)
20
+ [:css, hash[:css]]
21
+ end
22
+ end
23
+
24
+ # @return [Symbol, nil] element name of iframe element is in or nil if not
25
+ def in_iframe
26
+ case hash[:in_iframe]
27
+ when Symbol, String
28
+ hash[:in_iframe].to_sym
29
+ end
30
+ end
31
+
32
+ # @return [Boolean] whether or not element is in iframe
33
+ def in_iframe?
34
+ in_iframe ? true : false
35
+ end
36
+
37
+ def method_hook?(name)
38
+ method_hooks.key?(name)
39
+ end
40
+
41
+ # @return [Hash<Hook>] hash of Hook that are defined under the element
42
+ def method_hooks
43
+ return @method_hooks if defined? @method_hooks
44
+
45
+ children = {}
46
+ hash.each do |key, value|
47
+ # Skip possible keys that elements can have
48
+ # Otherwise should be a method hook
49
+ next if %i[load custom_methods in_iframe css xpath define_elements_by custom_range].include?(key)
50
+ children[key] = value
51
+ end
52
+
53
+ @method_hooks = create_hash_children(children,
54
+ interface: Hook,
55
+ location: location + '[hook]')
56
+
57
+ @method_hooks
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end