page_magic 1.2.1 → 1.2.3
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/.rubocop.yml +1 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +44 -58
- data/VERSION +1 -1
- data/lib/page_magic/driver.rb +1 -1
- data/lib/page_magic/element/locators.rb +2 -2
- data/lib/page_magic/element/query.rb +1 -1
- data/lib/page_magic/element/selector.rb +2 -2
- data/lib/page_magic/element.rb +13 -2
- data/lib/page_magic/element_context.rb +3 -3
- data/lib/page_magic/element_definition_builder.rb +3 -3
- data/lib/page_magic/elements.rb +6 -6
- data/lib/page_magic/exceptions.rb +3 -0
- data/lib/page_magic/matcher.rb +3 -3
- data/lib/page_magic/session.rb +19 -12
- data/lib/page_magic/wait_methods.rb +3 -3
- data/lib/page_magic/watchers.rb +2 -2
- data/lib/page_magic.rb +2 -2
- data/page_magic.gemspec +3 -3
- data/spec/element_spec.rb +7 -0
- data/spec/page_magic/driver_spec.rb +1 -1
- data/spec/page_magic/element_context_spec.rb +1 -1
- data/spec/page_magic/elements_spec.rb +1 -1
- data/spec/page_magic/session_spec.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f73c42fab4dedc07b8f403de27bbafb7f06beda6
|
|
4
|
+
data.tar.gz: 6bb45f94bf3cebc7da9678dd29b4ec135c4899be
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6ca98987cf3ba24618714325f42b5b3567389f06dd4d67348a75fb22ac941f3e1d88250e373ec94397cfb2d93f6e484166824f319f4ffc92d75d5392efe3c862
|
|
7
|
+
data.tar.gz: 3cc31ae2222b73a2ad710595c2e16c4716cc8fba1b4ffd09132af280fbbe25406ec18a48c000dabad31d6369a2fd07fe0d09fbea4e772d23767ee0070d73412c
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,38 +1,28 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: https://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
activesupport (4.2.
|
|
4
|
+
activesupport (4.2.6)
|
|
5
5
|
i18n (~> 0.7)
|
|
6
6
|
json (~> 1.7, >= 1.7.7)
|
|
7
7
|
minitest (~> 5.1)
|
|
8
8
|
thread_safe (~> 0.3, >= 0.3.4)
|
|
9
9
|
tzinfo (~> 1.1)
|
|
10
|
-
addressable (2.
|
|
11
|
-
ast (2.
|
|
12
|
-
astrolabe (1.3.1)
|
|
13
|
-
parser (~> 2.2)
|
|
10
|
+
addressable (2.4.0)
|
|
11
|
+
ast (2.2.0)
|
|
14
12
|
builder (3.2.2)
|
|
15
|
-
capybara (2.
|
|
13
|
+
capybara (2.7.1)
|
|
14
|
+
addressable
|
|
16
15
|
mime-types (>= 1.16)
|
|
17
16
|
nokogiri (>= 1.3.3)
|
|
18
17
|
rack (>= 1.0.0)
|
|
19
18
|
rack-test (>= 0.5.4)
|
|
20
19
|
xpath (~> 2.0)
|
|
21
|
-
certifi (
|
|
22
|
-
childprocess (0.5.
|
|
20
|
+
certifi (2016.02.28)
|
|
21
|
+
childprocess (0.5.9)
|
|
23
22
|
ffi (~> 1.0, >= 1.0.11)
|
|
24
23
|
cliver (0.3.2)
|
|
25
|
-
codeclimate-test-reporter (0.
|
|
24
|
+
codeclimate-test-reporter (0.5.0)
|
|
26
25
|
simplecov (>= 0.7.1, < 1.0.0)
|
|
27
|
-
cucumber (2.1.0)
|
|
28
|
-
builder (>= 2.1.2)
|
|
29
|
-
cucumber-core (~> 1.3.0)
|
|
30
|
-
diff-lcs (>= 1.1.3)
|
|
31
|
-
gherkin3 (~> 3.1.0)
|
|
32
|
-
multi_json (>= 1.7.5, < 2.0)
|
|
33
|
-
multi_test (>= 0.1.2)
|
|
34
|
-
cucumber-core (1.3.0)
|
|
35
|
-
gherkin3 (~> 3.1.0)
|
|
36
26
|
descendants_tracker (0.0.4)
|
|
37
27
|
thread_safe (~> 0.3, >= 0.3.1)
|
|
38
28
|
diff-lcs (1.2.5)
|
|
@@ -40,21 +30,19 @@ GEM
|
|
|
40
30
|
faraday (0.9.2)
|
|
41
31
|
multipart-post (>= 1.2, < 3)
|
|
42
32
|
ffi (1.9.10)
|
|
43
|
-
|
|
44
|
-
git (1.2.9.1)
|
|
33
|
+
git (1.3.0)
|
|
45
34
|
github-markup (1.4.0)
|
|
46
|
-
github_api (0.13.
|
|
47
|
-
addressable (~> 2.
|
|
35
|
+
github_api (0.13.1)
|
|
36
|
+
addressable (~> 2.4.0)
|
|
48
37
|
descendants_tracker (~> 0.0.4)
|
|
49
38
|
faraday (~> 0.8, < 0.10)
|
|
50
39
|
hashie (>= 3.4)
|
|
51
40
|
multi_json (>= 1.7.5, < 2.0)
|
|
52
|
-
nokogiri (~> 1.6.6)
|
|
53
41
|
oauth2
|
|
54
|
-
hashie (3.4.
|
|
42
|
+
hashie (3.4.4)
|
|
55
43
|
highline (1.7.8)
|
|
56
44
|
i18n (0.7.0)
|
|
57
|
-
jeweler (2.
|
|
45
|
+
jeweler (2.1.1)
|
|
58
46
|
builder
|
|
59
47
|
bundler (>= 1.0)
|
|
60
48
|
git (>= 1.2.5)
|
|
@@ -63,28 +51,28 @@ GEM
|
|
|
63
51
|
nokogiri (>= 1.5.10)
|
|
64
52
|
rake
|
|
65
53
|
rdoc
|
|
54
|
+
semver
|
|
66
55
|
json (1.8.3)
|
|
67
|
-
jwt (1.5.
|
|
56
|
+
jwt (1.5.1)
|
|
68
57
|
mime-types (3.0)
|
|
69
58
|
mime-types-data (~> 3.2015)
|
|
70
|
-
mime-types-data (3.
|
|
59
|
+
mime-types-data (3.2016.0221)
|
|
71
60
|
mini_portile2 (2.0.0)
|
|
72
|
-
minitest (5.8.
|
|
73
|
-
multi_json (1.
|
|
74
|
-
multi_test (0.1.2)
|
|
61
|
+
minitest (5.8.4)
|
|
62
|
+
multi_json (1.12.0)
|
|
75
63
|
multi_xml (0.5.5)
|
|
76
64
|
multipart-post (2.0.0)
|
|
77
|
-
nokogiri (1.6.7.
|
|
65
|
+
nokogiri (1.6.7.2)
|
|
78
66
|
mini_portile2 (~> 2.0.0.rc2)
|
|
79
|
-
oauth2 (1.
|
|
67
|
+
oauth2 (1.1.0)
|
|
80
68
|
faraday (>= 0.8, < 0.10)
|
|
81
|
-
jwt (~> 1.0)
|
|
69
|
+
jwt (~> 1.0, < 1.5.2)
|
|
82
70
|
multi_json (~> 1.3)
|
|
83
71
|
multi_xml (~> 0.5)
|
|
84
|
-
rack (
|
|
85
|
-
parser (2.
|
|
86
|
-
ast (
|
|
87
|
-
poltergeist (1.
|
|
72
|
+
rack (>= 1.2, < 3)
|
|
73
|
+
parser (2.3.1.0)
|
|
74
|
+
ast (~> 2.2)
|
|
75
|
+
poltergeist (1.9.0)
|
|
88
76
|
capybara (~> 2.1)
|
|
89
77
|
cliver (~> 0.3.1)
|
|
90
78
|
multi_json (~> 1.0)
|
|
@@ -98,55 +86,54 @@ GEM
|
|
|
98
86
|
rack
|
|
99
87
|
rack-test (0.6.3)
|
|
100
88
|
rack (>= 1.0)
|
|
101
|
-
rainbow (2.
|
|
102
|
-
rake (
|
|
103
|
-
rdoc (4.2.
|
|
89
|
+
rainbow (2.1.0)
|
|
90
|
+
rake (11.1.2)
|
|
91
|
+
rdoc (4.2.2)
|
|
104
92
|
json (~> 1.4)
|
|
105
|
-
redcarpet (3.3.
|
|
93
|
+
redcarpet (3.3.4)
|
|
106
94
|
rspec (3.4.0)
|
|
107
95
|
rspec-core (~> 3.4.0)
|
|
108
96
|
rspec-expectations (~> 3.4.0)
|
|
109
97
|
rspec-mocks (~> 3.4.0)
|
|
110
|
-
rspec-core (3.4.
|
|
98
|
+
rspec-core (3.4.4)
|
|
111
99
|
rspec-support (~> 3.4.0)
|
|
112
100
|
rspec-expectations (3.4.0)
|
|
113
101
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
114
102
|
rspec-support (~> 3.4.0)
|
|
115
|
-
rspec-mocks (3.4.
|
|
103
|
+
rspec-mocks (3.4.1)
|
|
116
104
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
117
105
|
rspec-support (~> 3.4.0)
|
|
118
106
|
rspec-support (3.4.1)
|
|
119
|
-
rubocop (0.
|
|
120
|
-
|
|
121
|
-
parser (>= 2.2.3.0, < 3.0)
|
|
107
|
+
rubocop (0.40.0)
|
|
108
|
+
parser (>= 2.3.1.0, < 3.0)
|
|
122
109
|
powerpack (~> 0.1)
|
|
123
110
|
rainbow (>= 1.99.1, < 3.0)
|
|
124
111
|
ruby-progressbar (~> 1.7)
|
|
125
|
-
|
|
126
|
-
ruby-progressbar (1.
|
|
127
|
-
rubyzip (1.
|
|
128
|
-
selenium-webdriver (2.
|
|
112
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
113
|
+
ruby-progressbar (1.8.1)
|
|
114
|
+
rubyzip (1.2.0)
|
|
115
|
+
selenium-webdriver (2.53.0)
|
|
129
116
|
childprocess (~> 0.5)
|
|
130
|
-
multi_json (~> 1.0)
|
|
131
117
|
rubyzip (~> 1.0)
|
|
132
118
|
websocket (~> 1.0)
|
|
133
|
-
|
|
119
|
+
semver (1.0.1)
|
|
120
|
+
simplecov (0.11.2)
|
|
134
121
|
docile (~> 1.1.0)
|
|
135
122
|
json (~> 1.8)
|
|
136
123
|
simplecov-html (~> 0.10.0)
|
|
137
124
|
simplecov-html (0.10.0)
|
|
138
|
-
sinatra (1.4.
|
|
139
|
-
rack (~> 1.
|
|
125
|
+
sinatra (1.4.7)
|
|
126
|
+
rack (~> 1.5)
|
|
140
127
|
rack-protection (~> 1.4)
|
|
141
128
|
tilt (>= 1.3, < 3)
|
|
142
129
|
thread_safe (0.3.5)
|
|
143
|
-
tilt (2.0.
|
|
144
|
-
tins (1.6.0)
|
|
130
|
+
tilt (2.0.3)
|
|
145
131
|
tzinfo (1.2.2)
|
|
146
132
|
thread_safe (~> 0.1)
|
|
133
|
+
unicode-display_width (1.0.5)
|
|
147
134
|
watir-webdriver (0.9.1)
|
|
148
135
|
selenium-webdriver (>= 2.46.2)
|
|
149
|
-
websocket (1.2.
|
|
136
|
+
websocket (1.2.3)
|
|
150
137
|
websocket-driver (0.6.3)
|
|
151
138
|
websocket-extensions (>= 0.1.0)
|
|
152
139
|
websocket-extensions (0.1.2)
|
|
@@ -161,7 +148,6 @@ DEPENDENCIES
|
|
|
161
148
|
activesupport (~> 4)
|
|
162
149
|
capybara (>= 2.5)
|
|
163
150
|
codeclimate-test-reporter
|
|
164
|
-
cucumber
|
|
165
151
|
github-markup (~> 1.4)
|
|
166
152
|
jeweler (~> 2.0)
|
|
167
153
|
poltergeist
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.2.
|
|
1
|
+
1.2.3
|
data/lib/page_magic/driver.rb
CHANGED
|
@@ -25,7 +25,7 @@ module PageMagic
|
|
|
25
25
|
# @param [Symbol] browser name of required browser
|
|
26
26
|
# @param [Hash] options driver specific options
|
|
27
27
|
# @return [Object] Capybara compliant driver instance
|
|
28
|
-
def build(app, browser:, options:{})
|
|
28
|
+
def build(app, browser:, options: {})
|
|
29
29
|
handler.call(app, options, browser)
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -4,7 +4,7 @@ module PageMagic
|
|
|
4
4
|
# contains method for finding element definitions
|
|
5
5
|
module Locators
|
|
6
6
|
# message used when raising {ElementMissingException} from methods within this module
|
|
7
|
-
ELEMENT_NOT_DEFINED_MSG = 'Element not defined: %s'
|
|
7
|
+
ELEMENT_NOT_DEFINED_MSG = 'Element not defined: %s'.freeze
|
|
8
8
|
|
|
9
9
|
# find an element definition based on its name
|
|
10
10
|
# @param [Symbol] name name of the element
|
|
@@ -12,7 +12,7 @@ module PageMagic
|
|
|
12
12
|
# @raise [ElementMissingException] raised when element with the given name is not found
|
|
13
13
|
def element_by_name(name, *args)
|
|
14
14
|
defintion = element_definitions[name]
|
|
15
|
-
|
|
15
|
+
raise ElementMissingException, (ELEMENT_NOT_DEFINED_MSG % name) unless defintion
|
|
16
16
|
defintion.call(self, *args)
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -11,7 +11,7 @@ module PageMagic
|
|
|
11
11
|
# @param [Symbol] type the name of the required query in snakecase format
|
|
12
12
|
# @return [Query] returns the predefined query with the given name
|
|
13
13
|
def find(type)
|
|
14
|
-
query = constants.find { |constant| constant.to_s.
|
|
14
|
+
query = constants.find { |constant| constant.to_s.casecmp(type.to_s).zero? }
|
|
15
15
|
return ELEMENT unless query
|
|
16
16
|
const_get(query)
|
|
17
17
|
end
|
|
@@ -8,8 +8,8 @@ module PageMagic
|
|
|
8
8
|
# selectors
|
|
9
9
|
# @return [Selector] returns the predefined selector with the given name
|
|
10
10
|
def find(name)
|
|
11
|
-
selector = constants.find { |constant| constant.to_s.
|
|
12
|
-
|
|
11
|
+
selector = constants.find { |constant| constant.to_s.casecmp(name.to_s).zero? }
|
|
12
|
+
raise UnsupportedCriteriaException unless selector
|
|
13
13
|
const_get(selector)
|
|
14
14
|
end
|
|
15
15
|
end
|
data/lib/page_magic/element.rb
CHANGED
|
@@ -6,8 +6,9 @@ require 'page_magic/element/query'
|
|
|
6
6
|
module PageMagic
|
|
7
7
|
# class Element - represents an element in a html page.
|
|
8
8
|
class Element
|
|
9
|
-
EVENT_TYPES = [:set, :select, :select_option, :unselect_option, :click]
|
|
9
|
+
EVENT_TYPES = [:set, :select, :select_option, :unselect_option, :click].freeze
|
|
10
10
|
DEFAULT_HOOK = proc {}.freeze
|
|
11
|
+
EVENT_NOT_SUPPORTED_MSG = '%s event not supported'.freeze
|
|
11
12
|
|
|
12
13
|
include SelectorMethods, Watchers, SessionMethods, WaitMethods, Locators
|
|
13
14
|
extend Elements, SelectorMethods, Forwardable
|
|
@@ -68,12 +69,22 @@ module PageMagic
|
|
|
68
69
|
wrap_events(browser_element)
|
|
69
70
|
end
|
|
70
71
|
|
|
72
|
+
# @!method click
|
|
73
|
+
# @!method set
|
|
74
|
+
# @!method select
|
|
75
|
+
# @!method select_option
|
|
76
|
+
# @!method unselect_option
|
|
77
|
+
# calls method of the same name on the underlying Capybara element
|
|
78
|
+
# @raise [NotSupportedException] if the wrapped Capybara element does not support the method
|
|
71
79
|
EVENT_TYPES.each do |method|
|
|
72
80
|
define_method method do |*args|
|
|
81
|
+
unless browser_element.respond_to?(method)
|
|
82
|
+
raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
|
|
83
|
+
end
|
|
84
|
+
|
|
73
85
|
browser_element.send(method, *args)
|
|
74
86
|
end
|
|
75
87
|
end
|
|
76
|
-
|
|
77
88
|
def method_missing(method, *args, &block)
|
|
78
89
|
ElementContext.new(self).send(method, *args, &block)
|
|
79
90
|
rescue ElementMissingException
|
|
@@ -2,7 +2,7 @@ module PageMagic
|
|
|
2
2
|
# class ElementContext - resolves which element definition to use when accessing the browser.
|
|
3
3
|
class ElementContext
|
|
4
4
|
# Message template for execptions raised as a result of calling method_missing
|
|
5
|
-
ELEMENT_NOT_FOUND_MSG = 'Unable to find %s'
|
|
5
|
+
ELEMENT_NOT_FOUND_MSG = 'Unable to find %s'.freeze
|
|
6
6
|
|
|
7
7
|
attr_reader :page_element
|
|
8
8
|
|
|
@@ -36,9 +36,9 @@ module PageMagic
|
|
|
36
36
|
query_args = builder.build_query
|
|
37
37
|
result = page_element.browser_element.all(*query_args)
|
|
38
38
|
|
|
39
|
-
if result.
|
|
39
|
+
if result.empty?
|
|
40
40
|
query = Capybara::Query.new(*query_args)
|
|
41
|
-
|
|
41
|
+
raise ElementMissingException, ELEMENT_NOT_FOUND_MSG % query.description
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
result.to_a.collect { |e| builder.build(e) }
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
module PageMagic
|
|
2
2
|
# Builder for creating ElementDefinitions
|
|
3
3
|
class ElementDefinitionBuilder
|
|
4
|
-
INVALID_SELECTOR_MSG = 'Pass a locator/define one on the class'
|
|
4
|
+
INVALID_SELECTOR_MSG = 'Pass a locator/define one on the class'.freeze
|
|
5
5
|
attr_reader :definition_class, :options, :selector, :type, :element
|
|
6
6
|
|
|
7
|
-
def initialize(definition_class:, selector:, type:, options:{}, element: nil)
|
|
7
|
+
def initialize(definition_class:, selector:, type:, options: {}, element: nil)
|
|
8
8
|
unless element
|
|
9
9
|
selector ||= definition_class.selector
|
|
10
|
-
|
|
10
|
+
raise UndefinedSelectorException, INVALID_SELECTOR_MSG if selector.nil? || selector.empty?
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
@definition_class = definition_class
|
data/lib/page_magic/elements.rb
CHANGED
|
@@ -12,9 +12,9 @@ module PageMagic
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
INVALID_METHOD_NAME_MSG = 'a method already exists with this method name'
|
|
15
|
+
INVALID_METHOD_NAME_MSG = 'a method already exists with this method name'.freeze
|
|
16
16
|
|
|
17
|
-
TYPES = [:text_field, :button, :link, :checkbox, :select_list, :radios, :textarea]
|
|
17
|
+
TYPES = [:text_field, :button, :link, :checkbox, :select_list, :radios, :textarea].freeze
|
|
18
18
|
|
|
19
19
|
class << self
|
|
20
20
|
def extended(clazz)
|
|
@@ -59,7 +59,7 @@ module PageMagic
|
|
|
59
59
|
add_element_definition(options.delete(:name)) do |parent_element, *e_args|
|
|
60
60
|
definition_class = Class.new(section_class) do
|
|
61
61
|
parent_element(parent_element)
|
|
62
|
-
class_exec(*e_args, &
|
|
62
|
+
class_exec(*e_args, &block)
|
|
63
63
|
end
|
|
64
64
|
ElementDefinitionBuilder.new(options.merge(definition_class: definition_class))
|
|
65
65
|
end
|
|
@@ -85,10 +85,10 @@ module PageMagic
|
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
def add_element_definition(name, &block)
|
|
88
|
-
|
|
88
|
+
raise InvalidElementNameException, 'duplicate page element defined' if element_definitions[name]
|
|
89
89
|
|
|
90
90
|
methods = respond_to?(:instance_methods) ? instance_methods : methods()
|
|
91
|
-
|
|
91
|
+
raise InvalidElementNameException, INVALID_METHOD_NAME_MSG if methods.find { |method| method == name }
|
|
92
92
|
|
|
93
93
|
element_definitions[name] = block
|
|
94
94
|
end
|
|
@@ -104,7 +104,7 @@ module PageMagic
|
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def method_added(method)
|
|
107
|
-
|
|
107
|
+
raise InvalidMethodNameException, 'method name matches element name' if element_definitions[method]
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
def compute_argument(args, clazz)
|
data/lib/page_magic/matcher.rb
CHANGED
|
@@ -6,7 +6,7 @@ module PageMagic
|
|
|
6
6
|
|
|
7
7
|
# @raise [MatcherInvalidException] if at least one component is not specified
|
|
8
8
|
def initialize(path = nil, parameters: nil, fragment: nil)
|
|
9
|
-
|
|
9
|
+
raise MatcherInvalidException unless path || parameters || fragment
|
|
10
10
|
@path = path
|
|
11
11
|
@parameters = parameters
|
|
12
12
|
@fragment = fragment
|
|
@@ -19,7 +19,7 @@ module PageMagic
|
|
|
19
19
|
|
|
20
20
|
# @return [String] uri represented by this mapping
|
|
21
21
|
def compute_uri
|
|
22
|
-
|
|
22
|
+
path.to_s.tap do |uri|
|
|
23
23
|
uri << "?#{parameters.to_query}" if parameters
|
|
24
24
|
uri << "##{fragment}" if fragment
|
|
25
25
|
end
|
|
@@ -54,7 +54,7 @@ module PageMagic
|
|
|
54
54
|
path == other.path && parameters == other.parameters && fragment == other.fragment
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
alias eql? ==
|
|
58
58
|
|
|
59
59
|
private
|
|
60
60
|
|
data/lib/page_magic/session.rb
CHANGED
|
@@ -3,9 +3,10 @@ require 'page_magic/matcher'
|
|
|
3
3
|
module PageMagic
|
|
4
4
|
# class Session - coordinates access to the browser though page objects.
|
|
5
5
|
class Session
|
|
6
|
-
URL_MISSING_MSG = 'a path must be mapped or a url supplied'
|
|
7
|
-
REGEXP_MAPPING_MSG = 'URL could not be derived because mapping contains Regexps'
|
|
8
|
-
INVALID_MAPPING_MSG = 'mapping must be a string or regexp'
|
|
6
|
+
URL_MISSING_MSG = 'a path must be mapped or a url supplied'.freeze
|
|
7
|
+
REGEXP_MAPPING_MSG = 'URL could not be derived because mapping contains Regexps'.freeze
|
|
8
|
+
INVALID_MAPPING_MSG = 'mapping must be a string or regexp'.freeze
|
|
9
|
+
UNSUPPORTED_OPERATION_MSG = 'execute_script not supported by driver'.freeze
|
|
9
10
|
|
|
10
11
|
extend Forwardable
|
|
11
12
|
|
|
@@ -54,11 +55,15 @@ module PageMagic
|
|
|
54
55
|
end.to_h
|
|
55
56
|
end
|
|
56
57
|
|
|
57
|
-
# @!method execute_script
|
|
58
58
|
# execute javascript on the browser
|
|
59
59
|
# @param [String] script the script to be executed
|
|
60
60
|
# @return [Object] object returned by the capybara execute_script method
|
|
61
|
-
|
|
61
|
+
# @raise [NotSupportedException] if the capybara driver in use does not support execute script
|
|
62
|
+
def execute_script(script)
|
|
63
|
+
raw_session.execute_script(script)
|
|
64
|
+
rescue Capybara::NotSupportedByDriverError
|
|
65
|
+
raise NotSupportedException, UNSUPPORTED_OPERATION_MSG
|
|
66
|
+
end
|
|
62
67
|
|
|
63
68
|
# proxies unknown method calls to the currently loaded page object
|
|
64
69
|
# @return [Object] returned object from the page object method call
|
|
@@ -86,14 +91,16 @@ module PageMagic
|
|
|
86
91
|
# @raise [InvalidURLException] if neither a page or url are supplied
|
|
87
92
|
# @raise [InvalidURLException] if the mapped path for a page is a Regexp
|
|
88
93
|
def visit(page = nil, url: nil)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
else
|
|
95
|
-
fail InvalidURLException, URL_MISSING_MSG
|
|
94
|
+
target_url = url || begin
|
|
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
|
|
96
99
|
end
|
|
100
|
+
|
|
101
|
+
raise InvalidURLException, URL_MISSING_MSG unless target_url
|
|
102
|
+
|
|
103
|
+
raw_session.visit(target_url)
|
|
97
104
|
@current_page = initialize_page(page) if page
|
|
98
105
|
self
|
|
99
106
|
end
|
|
@@ -6,13 +6,13 @@ module PageMagic
|
|
|
6
6
|
# wait_until do
|
|
7
7
|
# (rand % 2) == 0
|
|
8
8
|
# end
|
|
9
|
-
def wait_until(timeout_after: 5, retry_every: 1, &
|
|
9
|
+
def wait_until(timeout_after: 5, retry_every: 1, &_block)
|
|
10
10
|
start_time = Time.now
|
|
11
11
|
until Time.now > start_time + timeout_after
|
|
12
|
-
return true if
|
|
12
|
+
return true if yield == true
|
|
13
13
|
sleep retry_every
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
raise TimeoutException, 'Action took to long'
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
end
|
data/lib/page_magic/watchers.rb
CHANGED
|
@@ -3,7 +3,7 @@ require 'page_magic/watcher'
|
|
|
3
3
|
module PageMagic
|
|
4
4
|
# module Watchers - contains methods for adding watchers and checking them
|
|
5
5
|
module Watchers
|
|
6
|
-
ELEMENT_MISSING_MSG = 'Unable to defined watcher: Element or method with the name %s can not be found'
|
|
6
|
+
ELEMENT_MISSING_MSG = 'Unable to defined watcher: Element or method with the name %s can not be found'.freeze
|
|
7
7
|
|
|
8
8
|
# @param [Symbol] name - the name of the watcher
|
|
9
9
|
# @return [Boolean] true if a change is detected
|
|
@@ -23,7 +23,7 @@ module PageMagic
|
|
|
23
23
|
# # more complicated code to get value
|
|
24
24
|
# end
|
|
25
25
|
def watch(name, method = nil, &block)
|
|
26
|
-
|
|
26
|
+
raise ElementMissingException, (ELEMENT_MISSING_MSG % name) unless block || respond_to?(name)
|
|
27
27
|
watched_element = block ? Watcher.new(name, &block) : Watcher.new(name, method)
|
|
28
28
|
watchers.delete_if { |w| w.name == name }
|
|
29
29
|
watchers << watched_element.check(self)
|
data/lib/page_magic.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
$LOAD_PATH.unshift(
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__).to_s)
|
|
2
2
|
require 'capybara'
|
|
3
3
|
require 'page_magic/exceptions'
|
|
4
4
|
require 'page_magic/wait_methods'
|
|
@@ -43,7 +43,7 @@ module PageMagic
|
|
|
43
43
|
# @return [Session] configured sessoin
|
|
44
44
|
def session(application: nil, browser: :rack_test, url:, options: {})
|
|
45
45
|
driver = drivers.find(browser)
|
|
46
|
-
|
|
46
|
+
raise UnspportedBrowserException unless driver
|
|
47
47
|
|
|
48
48
|
Capybara.register_driver browser do |app|
|
|
49
49
|
driver.build(app, browser: browser, options: options)
|
data/page_magic.gemspec
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: page_magic 1.2.
|
|
5
|
+
# stub: page_magic 1.2.3 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "page_magic"
|
|
9
|
-
s.version = "1.2.
|
|
9
|
+
s.version = "1.2.3"
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib"]
|
|
13
13
|
s.authors = ["Leon Davis"]
|
|
14
|
-
s.date = "2016-
|
|
14
|
+
s.date = "2016-05-15"
|
|
15
15
|
s.description = "Framework for modeling and interacting with webpages which wraps capybara"
|
|
16
16
|
s.email = "info@lad-tech.com"
|
|
17
17
|
s.extra_rdoc_files = [
|
data/spec/element_spec.rb
CHANGED
|
@@ -126,6 +126,13 @@ module PageMagic
|
|
|
126
126
|
subject.select :args
|
|
127
127
|
end
|
|
128
128
|
end
|
|
129
|
+
|
|
130
|
+
context 'Capybara element does not respond to the method' do
|
|
131
|
+
it 'raises an error' do
|
|
132
|
+
expected_message = (described_class::EVENT_NOT_SUPPORTED_MSG % 'click')
|
|
133
|
+
expect { subject.click }.to raise_error(NotSupportedException, expected_message)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
129
136
|
end
|
|
130
137
|
end
|
|
131
138
|
|
|
@@ -8,7 +8,7 @@ module PageMagic
|
|
|
8
8
|
|
|
9
9
|
describe '#build' do
|
|
10
10
|
it 'returns the result of the block passed to the driver class constructor' do
|
|
11
|
-
subject = described_class.new(:custom_browser)do
|
|
11
|
+
subject = described_class.new(:custom_browser) do
|
|
12
12
|
:driver
|
|
13
13
|
end
|
|
14
14
|
expect(subject.build(:rack_app, browser: :custom_browser, options: :options)).to eq(:driver)
|
|
@@ -142,7 +142,7 @@ module PageMagic
|
|
|
142
142
|
it 'should not evaluate the elements when applying naming checks' do
|
|
143
143
|
subject.class_eval do
|
|
144
144
|
link(:link1, :selector) do
|
|
145
|
-
|
|
145
|
+
raise('should not have been evaluated')
|
|
146
146
|
end
|
|
147
147
|
link(:link2, :selector)
|
|
148
148
|
end
|
|
@@ -75,6 +75,14 @@ module PageMagic
|
|
|
75
75
|
expect(browser).to receive(:execute_script).with(:script).and_return(:result)
|
|
76
76
|
expect(subject.execute_script(:script)).to be(:result)
|
|
77
77
|
end
|
|
78
|
+
|
|
79
|
+
context 'Capybara session does not support #execute_script' do
|
|
80
|
+
let(:browser) { Capybara::Driver::Base.new }
|
|
81
|
+
it 'raises an error' do
|
|
82
|
+
expected_message = described_class::UNSUPPORTED_OPERATION_MSG
|
|
83
|
+
expect { subject.execute_script(:script) }.to raise_error(NotSupportedException, expected_message)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
78
86
|
end
|
|
79
87
|
|
|
80
88
|
describe '#find_mapped_page' do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: page_magic
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Leon Davis
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-05-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: capybara
|