page_magic 1.2.8 → 2.0.2
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 +5 -5
- data/.rubocop.yml +23 -4
- data/.simplecov +5 -3
- data/.zsh_config +6 -0
- data/Dockerfile +11 -0
- data/Gemfile +13 -13
- data/Gemfile.lock +136 -148
- data/Makefile +17 -0
- data/README.md +26 -5
- data/Rakefile +12 -2
- data/VERSION +1 -1
- data/circle.yml +3 -1
- data/lib/active_support/core_ext/object/to_query.rb +84 -0
- data/lib/page_magic.rb +31 -24
- data/lib/page_magic/class_methods.rb +5 -2
- data/lib/page_magic/comparator.rb +37 -0
- data/lib/page_magic/comparator/fuzzy.rb +23 -0
- data/lib/page_magic/comparator/literal.rb +22 -0
- data/lib/page_magic/comparator/null.rb +26 -0
- data/lib/page_magic/comparator/parameter_map.rb +52 -0
- data/lib/page_magic/driver.rb +3 -0
- data/lib/page_magic/drivers.rb +6 -5
- data/lib/page_magic/drivers/poltergeist.rb +2 -0
- data/lib/page_magic/drivers/rack_test.rb +3 -1
- data/lib/page_magic/drivers/selenium.rb +4 -2
- data/lib/page_magic/element.rb +35 -15
- data/lib/page_magic/element/locators.rb +8 -5
- data/lib/page_magic/element/not_found.rb +38 -0
- data/lib/page_magic/element/query.rb +21 -20
- data/lib/page_magic/element/query/multiple_results.rb +21 -0
- data/lib/page_magic/element/query/prefetched_result.rb +26 -0
- data/lib/page_magic/element/query/single_result.rb +20 -0
- data/lib/page_magic/element/selector.rb +41 -16
- data/lib/page_magic/element/selector/methods.rb +18 -0
- data/lib/page_magic/element/selector/model.rb +21 -0
- data/lib/page_magic/element_context.rb +7 -21
- data/lib/page_magic/element_definition_builder.rb +20 -24
- data/lib/page_magic/elements.rb +65 -69
- data/lib/page_magic/elements/config.rb +103 -0
- data/lib/page_magic/elements/inheritance_hooks.rb +15 -0
- data/lib/page_magic/elements/types.rb +25 -0
- data/lib/page_magic/exceptions.rb +6 -1
- data/lib/page_magic/instance_methods.rb +8 -3
- data/lib/page_magic/mapping.rb +79 -0
- data/lib/page_magic/session.rb +15 -35
- data/lib/page_magic/session_methods.rb +3 -1
- data/lib/page_magic/transitions.rb +49 -0
- data/lib/page_magic/utils/string.rb +18 -0
- data/lib/page_magic/utils/url.rb +20 -0
- data/lib/page_magic/wait_methods.rb +3 -0
- data/lib/page_magic/watcher.rb +12 -17
- data/lib/page_magic/watchers.rb +31 -15
- data/page_magic.gemspec +15 -11
- data/spec/lib/active_support/core_ext/object/to_query_test.rb +78 -0
- data/spec/page_magic/class_methods_spec.rb +66 -37
- data/spec/page_magic/comparator/fuzzy_spec.rb +44 -0
- data/spec/page_magic/comparator/literal_spec.rb +41 -0
- data/spec/page_magic/comparator/null_spec.rb +35 -0
- data/spec/page_magic/comparator/parameter_map_spec.rb +75 -0
- data/spec/page_magic/driver_spec.rb +26 -28
- data/spec/page_magic/drivers/poltergeist_spec.rb +6 -7
- data/spec/page_magic/drivers/rack_test_spec.rb +6 -9
- data/spec/page_magic/drivers/selenium_spec.rb +11 -12
- data/spec/page_magic/drivers_spec.rb +38 -29
- data/spec/page_magic/element/locators_spec.rb +28 -25
- data/spec/page_magic/element/not_found_spec.rb +24 -0
- data/spec/page_magic/element/query/multiple_results_spec.rb +14 -0
- data/spec/page_magic/element/query/single_result_spec.rb +21 -0
- data/spec/page_magic/element/query_spec.rb +26 -45
- data/spec/page_magic/element/selector_spec.rb +120 -110
- data/spec/page_magic/element_context_spec.rb +47 -87
- data/spec/page_magic/element_definition_builder_spec.rb +14 -71
- data/spec/page_magic/element_spec.rb +256 -0
- data/spec/page_magic/elements/config_spec.rb +203 -0
- data/spec/page_magic/elements_spec.rb +90 -134
- data/spec/page_magic/instance_methods_spec.rb +65 -63
- data/spec/page_magic/mapping_spec.rb +181 -0
- data/spec/page_magic/session_methods_spec.rb +29 -25
- data/spec/page_magic/session_spec.rb +109 -199
- data/spec/page_magic/transitions_spec.rb +43 -0
- data/spec/page_magic/utils/string_spec.rb +29 -0
- data/spec/page_magic/utils/url_spec.rb +9 -0
- data/spec/page_magic/wait_methods_spec.rb +16 -22
- data/spec/page_magic/watcher_spec.rb +22 -0
- data/spec/page_magic/watchers_spec.rb +58 -62
- data/spec/page_magic_spec.rb +37 -29
- data/spec/spec_helper.rb +9 -2
- data/spec/support/shared_contexts.rb +3 -1
- data/spec/support/shared_examples.rb +17 -17
- metadata +101 -48
- data/lib/page_magic/element/query_builder.rb +0 -48
- data/lib/page_magic/element/selector_methods.rb +0 -13
- data/lib/page_magic/matcher.rb +0 -121
- data/spec/element_spec.rb +0 -249
- data/spec/page_magic/element/query_builder_spec.rb +0 -108
- data/spec/page_magic/matcher_spec.rb +0 -336
- data/spec/support/shared_contexts/files_context.rb +0 -7
- data/spec/support/shared_contexts/nested_elements_html_context.rb +0 -16
- data/spec/support/shared_contexts/rack_application_context.rb +0 -9
- data/spec/support/shared_contexts/webapp_fixture_context.rb +0 -39
- data/spec/watcher_spec.rb +0 -61
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PageMagic
|
|
4
|
+
module Elements
|
|
5
|
+
# hooks for objects that inherit classes that include the Elements module
|
|
6
|
+
module InheritanceHooks
|
|
7
|
+
# Copies parent element definitions on to subclass
|
|
8
|
+
# @param [Class] clazz - inheriting class
|
|
9
|
+
def inherited(clazz)
|
|
10
|
+
super
|
|
11
|
+
clazz.element_definitions.merge!(element_definitions)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PageMagic
|
|
4
|
+
module Elements
|
|
5
|
+
TYPES = %i[field
|
|
6
|
+
fieldset
|
|
7
|
+
file_field
|
|
8
|
+
fillable_field
|
|
9
|
+
frame
|
|
10
|
+
link_or_button
|
|
11
|
+
option
|
|
12
|
+
radio_button
|
|
13
|
+
select
|
|
14
|
+
table
|
|
15
|
+
table_row
|
|
16
|
+
text_field
|
|
17
|
+
button
|
|
18
|
+
link
|
|
19
|
+
checkbox
|
|
20
|
+
select_list
|
|
21
|
+
radio
|
|
22
|
+
textarea
|
|
23
|
+
label].freeze
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PageMagic
|
|
2
4
|
class ElementMissingException < RuntimeError
|
|
3
5
|
end
|
|
@@ -20,7 +22,7 @@ module PageMagic
|
|
|
20
22
|
class TimeoutException < RuntimeError
|
|
21
23
|
end
|
|
22
24
|
|
|
23
|
-
class
|
|
25
|
+
class UnsupportedBrowserException < RuntimeError
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
class UnsupportedCriteriaException < RuntimeError
|
|
@@ -34,4 +36,7 @@ module PageMagic
|
|
|
34
36
|
|
|
35
37
|
class NotSupportedException < RuntimeError
|
|
36
38
|
end
|
|
39
|
+
|
|
40
|
+
class InvalidConfigurationException < StandardError
|
|
41
|
+
end
|
|
37
42
|
end
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PageMagic
|
|
2
4
|
# module InstanceMethods - provides instance level methods for page objects
|
|
3
5
|
module InstanceMethods
|
|
4
6
|
attr_reader :browser, :session, :browser_element
|
|
5
7
|
|
|
6
|
-
include
|
|
8
|
+
include Element::Locators
|
|
9
|
+
include WaitMethods
|
|
10
|
+
include SessionMethods
|
|
11
|
+
include Watchers
|
|
7
12
|
|
|
8
13
|
# Creates a new instance
|
|
9
14
|
# @param [Session] session session that provides gateway to the browser throw the users chosen browser
|
|
@@ -14,7 +19,7 @@ module PageMagic
|
|
|
14
19
|
@browser_element = browser
|
|
15
20
|
end
|
|
16
21
|
|
|
17
|
-
# @return [Array] class level defined element definitions
|
|
22
|
+
# @return [Array<ElementDefinitionBuilder>] class level defined element definitions
|
|
18
23
|
def element_definitions
|
|
19
24
|
self.class.element_definitions
|
|
20
25
|
end
|
|
@@ -32,7 +37,7 @@ module PageMagic
|
|
|
32
37
|
element_context.send(method, *args)
|
|
33
38
|
end
|
|
34
39
|
|
|
35
|
-
def
|
|
40
|
+
def respond_to_missing?(*args)
|
|
36
41
|
contains_element?(args.first) || super
|
|
37
42
|
end
|
|
38
43
|
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../active_support/core_ext/object/to_query'
|
|
4
|
+
require_relative 'comparator'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module PageMagic
|
|
8
|
+
# models mapping used to relate pages to uris
|
|
9
|
+
class Mapping
|
|
10
|
+
attr_reader :path, :parameters, :fragment
|
|
11
|
+
|
|
12
|
+
# @param [Object] path String or Regular expression to match with
|
|
13
|
+
# @param [Hash] parameters mapping of parameter name to literal or regex to match with
|
|
14
|
+
# @param [Object] fragment String or Regular expression to match with
|
|
15
|
+
# @raise [MatcherInvalidException] if at least one component is not specified
|
|
16
|
+
def initialize(path = nil, parameters: {}, fragment: nil)
|
|
17
|
+
raise MatcherInvalidException unless path || parameters || fragment
|
|
18
|
+
|
|
19
|
+
@path = Comparator.for(path)
|
|
20
|
+
@parameters = Comparator.for(parameters)
|
|
21
|
+
@fragment = Comparator.for(fragment)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Boolean] true if no component contains a Regexp
|
|
25
|
+
def can_compute_uri?
|
|
26
|
+
!fragment.fuzzy? && !path.fuzzy? && !parameters.fuzzy?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [String] uri represented by this mapping
|
|
30
|
+
def compute_uri
|
|
31
|
+
path.to_s.dup.tap do |uri|
|
|
32
|
+
uri << "?#{parameters.comparator.to_query}" unless parameters.empty?
|
|
33
|
+
uri << "##{fragment}" if fragment.present?
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [Fixnum] hash for instance
|
|
38
|
+
def hash
|
|
39
|
+
[path, parameters, fragment].hash
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @param [String] uri
|
|
43
|
+
# @return [Boolean] returns true if the uri is matched against this matcher
|
|
44
|
+
def match?(uri)
|
|
45
|
+
uri = URI(uri)
|
|
46
|
+
path.match?(uri.path) && parameters.match?(parameters_hash(uri.query)) && fragment.match?(uri.fragment)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# compare this matcher against another
|
|
50
|
+
# @param [Mapping] other
|
|
51
|
+
# @return [Fixnum] -1 = smaller, 0 = equal to, 1 = greater than
|
|
52
|
+
def <=>(other)
|
|
53
|
+
path_comparison = path <=> other.path
|
|
54
|
+
return path_comparison unless path_comparison.zero?
|
|
55
|
+
|
|
56
|
+
parameter_comparison = parameters <=> other.parameters
|
|
57
|
+
return parameter_comparison unless parameter_comparison.zero?
|
|
58
|
+
|
|
59
|
+
fragment <=> other.fragment
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# check equality
|
|
63
|
+
# @param [Mapping] other
|
|
64
|
+
# @return [Boolean]
|
|
65
|
+
def ==(other)
|
|
66
|
+
return false unless other.is_a?(Mapping)
|
|
67
|
+
|
|
68
|
+
path == other.path && parameters == other.parameters && fragment == other.fragment
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
alias eql? ==
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def parameters_hash(string)
|
|
76
|
+
CGI.parse(string.to_s.downcase).collect { |key, value| [key.downcase, value.first] }.to_h
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/lib/page_magic/session.rb
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'forwardable'
|
|
2
|
-
|
|
4
|
+
require_relative 'transitions'
|
|
5
|
+
|
|
3
6
|
module PageMagic
|
|
4
7
|
# class Session - coordinates access to the browser though page objects.
|
|
5
8
|
class Session
|
|
6
|
-
URL_MISSING_MSG = 'a path must be mapped or a url supplied'
|
|
7
|
-
|
|
8
|
-
INVALID_MAPPING_MSG = 'mapping must be a string or regexp'
|
|
9
|
-
UNSUPPORTED_OPERATION_MSG = 'execute_script not supported by driver'
|
|
9
|
+
URL_MISSING_MSG = 'a path must be mapped or a url supplied'
|
|
10
|
+
|
|
11
|
+
INVALID_MAPPING_MSG = 'mapping must be a string or regexp'
|
|
12
|
+
UNSUPPORTED_OPERATION_MSG = 'execute_script not supported by driver'
|
|
10
13
|
|
|
11
14
|
extend Forwardable
|
|
12
15
|
|
|
@@ -18,14 +21,13 @@ module PageMagic
|
|
|
18
21
|
def initialize(capybara_session, base_url = nil)
|
|
19
22
|
@raw_session = capybara_session
|
|
20
23
|
@base_url = base_url
|
|
21
|
-
|
|
22
|
-
@transitions = {}
|
|
24
|
+
define_page_mappings({})
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
# @return [Object] returns page object representing the currently loaded page on the browser. If no mapping
|
|
26
28
|
# is found then nil returned
|
|
27
29
|
def current_page
|
|
28
|
-
mapping =
|
|
30
|
+
mapping = transitions.mapped_page(current_url)
|
|
29
31
|
@current_page = initialize_page(mapping) if mapping
|
|
30
32
|
@current_page
|
|
31
33
|
end
|
|
@@ -49,10 +51,7 @@ module PageMagic
|
|
|
49
51
|
# @option transitions [String] path as literal
|
|
50
52
|
# @option transitions [Regexp] path as a regexp for dynamic matching.
|
|
51
53
|
def define_page_mappings(transitions)
|
|
52
|
-
@transitions = transitions
|
|
53
|
-
key = key.is_a?(Matcher) ? key : Matcher.new(key)
|
|
54
|
-
[key, value]
|
|
55
|
-
end.to_h
|
|
54
|
+
@transitions = Transitions.new(transitions)
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
# execute javascript on the browser
|
|
@@ -73,7 +72,7 @@ module PageMagic
|
|
|
73
72
|
|
|
74
73
|
# @param args see {::Object#respond_to?}
|
|
75
74
|
# @return [Boolean] true if self or the current page object responds to the give method name
|
|
76
|
-
def
|
|
75
|
+
def respond_to_missing?(*args)
|
|
77
76
|
super || current_page.respond_to?(*args)
|
|
78
77
|
end
|
|
79
78
|
|
|
@@ -91,38 +90,19 @@ module PageMagic
|
|
|
91
90
|
# @raise [InvalidURLException] if neither a page or url are supplied
|
|
92
91
|
# @raise [InvalidURLException] if the mapped path for a page is a Regexp
|
|
93
92
|
def visit(page = nil, url: nil)
|
|
94
|
-
|
|
95
|
-
if (mapping = transitions.key(page))
|
|
96
|
-
raise InvalidURLException, REGEXP_MAPPING_MSG unless mapping.can_compute_uri?
|
|
97
|
-
url(base_url, mapping.compute_uri)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
93
|
+
url ||= transitions.url_for(page, base_url: base_url)
|
|
100
94
|
|
|
101
|
-
raise InvalidURLException, URL_MISSING_MSG unless
|
|
95
|
+
raise InvalidURLException, URL_MISSING_MSG unless url
|
|
102
96
|
|
|
103
|
-
raw_session.visit(
|
|
97
|
+
raw_session.visit(url)
|
|
104
98
|
@current_page = initialize_page(page) if page
|
|
105
99
|
self
|
|
106
100
|
end
|
|
107
101
|
|
|
108
102
|
private
|
|
109
103
|
|
|
110
|
-
def find_mapped_page(url)
|
|
111
|
-
matches(url).first
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def matches(url)
|
|
115
|
-
transitions.keys.find_all { |matcher| matcher.match?(url) }.sort.collect { |match| transitions[match] }
|
|
116
|
-
end
|
|
117
|
-
|
|
118
104
|
def initialize_page(page_class)
|
|
119
105
|
page_class.new(self).execute_on_load
|
|
120
106
|
end
|
|
121
|
-
|
|
122
|
-
def url(base_url, path)
|
|
123
|
-
path = path.sub(%r{^/}, '')
|
|
124
|
-
base_url = base_url.sub(%r{/$}, '')
|
|
125
|
-
"#{base_url}/#{path}"
|
|
126
|
-
end
|
|
127
107
|
end
|
|
128
108
|
end
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'forwardable'
|
|
2
4
|
module PageMagic
|
|
3
5
|
# module SessionMethods - contains methods for interacting with the {Session}
|
|
4
6
|
module SessionMethods
|
|
5
7
|
extend Forwardable
|
|
6
8
|
|
|
7
|
-
# @!method execute_script
|
|
9
|
+
# @!method execute_script(script)
|
|
8
10
|
# execute javascript on the browser
|
|
9
11
|
# @param [String] script the script to be executed
|
|
10
12
|
# @return [Object] object returned by the {Session#execute_script}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'utils/url'
|
|
4
|
+
require_relative 'mapping'
|
|
5
|
+
|
|
6
|
+
module PageMagic
|
|
7
|
+
# class Transitions - used for registering the page classes that should be used against particular paths
|
|
8
|
+
class Transitions < Hash
|
|
9
|
+
REGEXP_MAPPING_MSG = 'URL could not be derived because mapping contains Regexps'
|
|
10
|
+
|
|
11
|
+
# Create a new transitions object.
|
|
12
|
+
# @param [Hash{String,PageMagic::Mapping => PageMagic}] transitions a map of paths to pages
|
|
13
|
+
# @example
|
|
14
|
+
# Transitions.new('/path1' => Page1, Matcher.new('/another_*') => AnotherPageClass )
|
|
15
|
+
def initialize(transitions)
|
|
16
|
+
super
|
|
17
|
+
transitions.each do |key, value|
|
|
18
|
+
key = key.is_a?(Mapping) ? key : Mapping.new(key)
|
|
19
|
+
self[key] = value
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# get the url to be used when visiting the path mapped against the given page
|
|
24
|
+
# @param [PageMagic] page - the page class to get the mapped path from
|
|
25
|
+
# @param [String] base_url - the base url of the site to be joined to the mapped path
|
|
26
|
+
# @return String
|
|
27
|
+
# @raise InvalidURLException - Raised if it is not possible to generate the url for the mapped page
|
|
28
|
+
# i.e. if the mapping is a regular expression.
|
|
29
|
+
def url_for(page, base_url:)
|
|
30
|
+
return unless (mapping = key(page))
|
|
31
|
+
raise InvalidURLException, REGEXP_MAPPING_MSG unless mapping.can_compute_uri?
|
|
32
|
+
|
|
33
|
+
PageMagic::Utils::URL.concat(base_url, mapping.compute_uri)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# get the page class mapped to the given url
|
|
37
|
+
# @param [String] url - the url to search against
|
|
38
|
+
# @return [PageMagic]
|
|
39
|
+
def mapped_page(url)
|
|
40
|
+
matches(url).first
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def matches(url)
|
|
46
|
+
keys.find_all { |matcher| matcher.match?(url) }.sort.collect { |match| self[match] }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PageMagic
|
|
4
|
+
module Utils
|
|
5
|
+
# module String - contains methods for manipulating strings
|
|
6
|
+
module String
|
|
7
|
+
class << self
|
|
8
|
+
# convert a snake case `String` or `Symbol`
|
|
9
|
+
# @example
|
|
10
|
+
# classify(:snake_case) # => "SnakeCase"
|
|
11
|
+
# @return [String]
|
|
12
|
+
def classify(string_or_symbol)
|
|
13
|
+
string_or_symbol.to_s.split('_').collect(&:capitalize).reduce(:+)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PageMagic
|
|
4
|
+
module Utils
|
|
5
|
+
# module String - contains methods for manipulating strings
|
|
6
|
+
module URL
|
|
7
|
+
class << self
|
|
8
|
+
# build a url from a base and path.
|
|
9
|
+
# @example
|
|
10
|
+
# concat('http://base.url/', '/path') # => "http://base.url/path"
|
|
11
|
+
# @return [String]
|
|
12
|
+
def concat(base_url, path)
|
|
13
|
+
path = path.sub(%r{^/}, '')
|
|
14
|
+
base_url = base_url.sub(%r{/$}, '')
|
|
15
|
+
"#{base_url}/#{path}"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PageMagic
|
|
2
4
|
# module WaitMethods - contains methods for waiting
|
|
3
5
|
module WaitMethods
|
|
@@ -10,6 +12,7 @@ module PageMagic
|
|
|
10
12
|
start_time = Time.now
|
|
11
13
|
until Time.now > start_time + timeout_after
|
|
12
14
|
return true if yield == true
|
|
15
|
+
|
|
13
16
|
sleep retry_every
|
|
14
17
|
end
|
|
15
18
|
raise TimeoutException, 'Action took to long'
|
data/lib/page_magic/watcher.rb
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PageMagic
|
|
2
4
|
# class WatchedElementDefinition - Contains the specification the for checking if an subject has changed
|
|
3
5
|
class Watcher
|
|
4
|
-
attr_reader :name, :
|
|
6
|
+
attr_reader :name, :context, :observed_value, :block
|
|
5
7
|
|
|
6
8
|
# @param [Symbol] name the of the subject being checked
|
|
7
|
-
# @param [Symbol] method the method that should be called on the subject being checked
|
|
8
9
|
# @example
|
|
9
|
-
# Watcher.new(:
|
|
10
|
-
# Watcher.new do
|
|
10
|
+
# Watcher.new(:url) do
|
|
11
11
|
# session.url
|
|
12
12
|
# end
|
|
13
|
-
def initialize(name,
|
|
13
|
+
def initialize(name, context:, &block)
|
|
14
14
|
@name = name
|
|
15
|
-
@
|
|
15
|
+
@context = context
|
|
16
16
|
@block = block
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
# check current value of watched element. The result of the check
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
else
|
|
26
|
-
object = subject.send(name)
|
|
27
|
-
attribute ? object.send(attribute) : object
|
|
28
|
-
end
|
|
19
|
+
# check current value of watched element. The result of the check can be accessed
|
|
20
|
+
# by calling {PageMagic::Watcher#last}
|
|
21
|
+
# if a block was specified to the constructor then this will be executed.
|
|
22
|
+
# @return [PageMagic::Watcher]
|
|
23
|
+
def check
|
|
24
|
+
@observed_value = context.instance_eval(&block)
|
|
29
25
|
self
|
|
30
26
|
end
|
|
31
27
|
|
|
@@ -34,7 +30,6 @@ module PageMagic
|
|
|
34
30
|
def ==(other)
|
|
35
31
|
other.is_a?(Watcher) &&
|
|
36
32
|
name == other.name &&
|
|
37
|
-
attribute == other.attribute &&
|
|
38
33
|
block == other.block
|
|
39
34
|
end
|
|
40
35
|
end
|