pouch 0.2.0 → 0.3.0
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.
- data/lib/pouch/elements.rb +48 -1
- data/lib/pouch/version.rb +1 -1
- data/lib/pouch.rb +14 -3
- data/spec/elements_spec.rb +58 -18
- data/spec/pouch_spec.rb +30 -2
- metadata +2 -2
data/lib/pouch/elements.rb
CHANGED
@@ -3,11 +3,14 @@ module Pouch
|
|
3
3
|
|
4
4
|
def element tag, name, identifier, *args, &block
|
5
5
|
define_method name do
|
6
|
+
timer { browser.element(tag, identifier).visible? }
|
6
7
|
return browser.element tag, identifier unless block_given?
|
7
8
|
block.call browser.send(:element, tag, identifier), *args
|
8
9
|
end
|
9
|
-
end
|
10
10
|
|
11
|
+
define_waiting_methods tag, name, identifier, *args, &block
|
12
|
+
end
|
13
|
+
|
11
14
|
def button name, identifier, *args, &block
|
12
15
|
element :button, name, identifier, args, &block
|
13
16
|
end
|
@@ -115,5 +118,49 @@ module Pouch
|
|
115
118
|
element :ul, name, identifier, args, &block
|
116
119
|
end
|
117
120
|
|
121
|
+
private
|
122
|
+
|
123
|
+
def define_waiting_methods tag, name, identifier, *args, &block
|
124
|
+
define_method "when_#{name}_not_visible" do
|
125
|
+
result = negative_timer { !browser.element(tag, identifier).visible? }
|
126
|
+
unless result
|
127
|
+
raise VisibilityError, "#{name} element is still visible"
|
128
|
+
end
|
129
|
+
self
|
130
|
+
end
|
131
|
+
|
132
|
+
define_method "when_#{name}_present" do
|
133
|
+
timer { browser.element(tag, identifier).present? }
|
134
|
+
html_element = browser.element tag, identifier
|
135
|
+
return located_element unless block_given?
|
136
|
+
block.call located_element, *args
|
137
|
+
end
|
138
|
+
|
139
|
+
define_method "when_#{name}_not_present" do
|
140
|
+
result = negative_timer { !browser.element(tag, identifier).present? }
|
141
|
+
unless result
|
142
|
+
raise PresenceError, "#{name} element is still present"
|
143
|
+
end
|
144
|
+
self
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def timer &block
|
149
|
+
timed_out = Time.now + timeout
|
150
|
+
until Time.now > timed_out
|
151
|
+
result = yield block rescue false
|
152
|
+
break if result
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def negative_timer &block
|
157
|
+
timed_out = Time.now + timeout
|
158
|
+
until Time.now > timed_out
|
159
|
+
result = yield_block
|
160
|
+
return result if result
|
161
|
+
end
|
162
|
+
false
|
163
|
+
end
|
164
|
+
|
118
165
|
end
|
119
166
|
end
|
data/lib/pouch/version.rb
CHANGED
data/lib/pouch.rb
CHANGED
@@ -4,7 +4,10 @@ require "pouch/elements"
|
|
4
4
|
module Pouch
|
5
5
|
include Elements
|
6
6
|
|
7
|
-
class
|
7
|
+
class ContextArgumentError < StandardError; end
|
8
|
+
class ReplacementError < StandardError; end
|
9
|
+
class VisibilityError < StandardError; end
|
10
|
+
class PresenceError < StandardError; end
|
8
11
|
|
9
12
|
def self.included base
|
10
13
|
base.extend self
|
@@ -18,7 +21,11 @@ module Pouch
|
|
18
21
|
|
19
22
|
@browser = browser
|
20
23
|
@context = standardize opts[:context] if opts[:context]
|
24
|
+
@timeout = opts[:timeout] || 10
|
25
|
+
|
26
|
+
set_timer if self.respond_to? :set_timer
|
21
27
|
visit if self.respond_to?(:visit) && start
|
28
|
+
|
22
29
|
contextualize_methods
|
23
30
|
end
|
24
31
|
|
@@ -30,6 +37,10 @@ module Pouch
|
|
30
37
|
@context
|
31
38
|
end
|
32
39
|
|
40
|
+
def timeout
|
41
|
+
@timeout
|
42
|
+
end
|
43
|
+
|
33
44
|
def page_url= str
|
34
45
|
define_method :visit do
|
35
46
|
self.browser.goto str
|
@@ -53,7 +64,7 @@ module Pouch
|
|
53
64
|
def get_match context
|
54
65
|
methods.select{ |mthd| mthd.to_s.start_with? "#{context}_" }.each_with_object([]) do |mthd, array|
|
55
66
|
unless respond_to? mthd.to_s.gsub("#{context}_", "")
|
56
|
-
raise
|
67
|
+
raise ReplacementError, "#{self.class} defined no standard method for replacement '#{mthd}'"
|
57
68
|
end
|
58
69
|
array << mthd
|
59
70
|
end
|
@@ -69,7 +80,7 @@ module Pouch
|
|
69
80
|
if [Array, String, Symbol].include? context.class
|
70
81
|
[context].flatten.map(&:to_s)
|
71
82
|
else
|
72
|
-
raise "
|
83
|
+
raise ContextArgumentError, "cannot define Pouch context with #{context.class}"
|
73
84
|
end
|
74
85
|
end
|
75
86
|
|
data/spec/elements_spec.rb
CHANGED
@@ -12,53 +12,93 @@ describe Pouch::Elements do
|
|
12
12
|
element(:a, :what_replacement, id: 'no-match')
|
13
13
|
end
|
14
14
|
|
15
|
-
let(:browser){ double 'webdriver' }
|
16
|
-
let(:element){ double 'html_link' }
|
15
|
+
let(:browser){ double 'webdriver', :element => element }
|
16
|
+
let(:element){ double 'html_link', :visible? => true }
|
17
17
|
let(:page){ Page.new browser }
|
18
18
|
let(:diff){ Page.new browser, context: 'different' }
|
19
19
|
let(:what){ Page.new browser, context: 'what' }
|
20
20
|
|
21
21
|
describe "#element" do
|
22
22
|
it "returns the link element by default" do
|
23
|
-
expect(browser).to receive(:element).with(:a, id:'generic').and_return(element)
|
24
23
|
expect(page.generic).to eq element
|
25
24
|
end
|
26
25
|
|
27
|
-
it "returns an element that can be clicked" do
|
28
|
-
expect(browser).to receive(:element).with(:a, id:'generic').and_return(element)
|
29
|
-
expect(element).to receive(:click)
|
30
|
-
page.generic.click
|
31
|
-
end
|
32
|
-
|
33
26
|
it "returns the result of the definition block" do
|
34
|
-
expect(browser).to receive(:element).with(:a, id:'blocked').and_return(element)
|
35
27
|
expect(element).to receive(:href).and_return("www.test.com")
|
36
28
|
expect(page.blocked).to eq "www.test.com"
|
37
29
|
end
|
38
30
|
|
31
|
+
it "calls #timer to wait for visible element" do
|
32
|
+
expect(page).to receive(:timer)
|
33
|
+
page.generic
|
34
|
+
end
|
35
|
+
|
36
|
+
it "generates #when_generic_not_visible" do
|
37
|
+
expect(page).to respond_to :when_generic_not_visible
|
38
|
+
end
|
39
|
+
|
40
|
+
it "generates #when_generic_present method" do
|
41
|
+
expect(page).to respond_to :when_generic_present
|
42
|
+
end
|
43
|
+
|
44
|
+
it "generates #when_generic_not_present method" do
|
45
|
+
expect(page).to respond_to :when_generic_not_present
|
46
|
+
end
|
47
|
+
|
39
48
|
context "with context" do
|
40
49
|
it "uses the replacement method" do
|
41
|
-
expect(browser).to receive(:element).with(:a, id:'generic-diff')
|
50
|
+
expect(browser).to receive(:element).twice.with(:a, id:'generic-diff')
|
42
51
|
expect(diff.generic).to eq element
|
43
52
|
end
|
44
53
|
|
45
54
|
it "uses the replacement method with definition block" do
|
46
|
-
expect(browser).to receive(:element).with(:a, id:'blocked-diff').and_return(element)
|
47
55
|
expect(element).to receive(:href).and_return("www.diff.com")
|
48
56
|
expect(diff.blocked).to eq "www.diff.com"
|
49
57
|
end
|
50
58
|
|
51
59
|
it "uses the standard method when context matches no replacement" do
|
52
|
-
expect(browser).to receive(:element).with(:a, id:'generic')
|
60
|
+
expect(browser).to receive(:element).twice.with(:a, id:'generic')
|
53
61
|
expect(Page.new(browser, context: 'test').generic).to eq element
|
54
62
|
end
|
55
63
|
|
56
64
|
it "throws an error with replacement but no standard method" do
|
57
|
-
expect{ what.replacement }.to raise_error Pouch::
|
65
|
+
expect{ what.replacement }.to raise_error Pouch::ReplacementError, /Page defined no standard method for replacement/
|
58
66
|
end
|
59
67
|
end
|
60
68
|
end
|
61
69
|
|
70
|
+
describe "#when_element_not_visible" do
|
71
|
+
Page.send(:link, :invisible, id:'hidden')
|
72
|
+
|
73
|
+
let(:page){ Page.new 'webdriver' }
|
74
|
+
|
75
|
+
it "returns the page object instance if valid" do
|
76
|
+
expect(page).to receive(:negative_timer).and_return(true)
|
77
|
+
expect(page.when_invisible_not_visible).to eq page
|
78
|
+
end
|
79
|
+
|
80
|
+
it "raises an VisibilityError if invalid" do
|
81
|
+
expect(page).to receive(:negative_timer).and_return(false)
|
82
|
+
expect{ page.when_invisible_not_visible }.to raise_error Pouch::VisibilityError, /invisible element/
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#when_element_not_present" do
|
87
|
+
Page.send(:link, :gone, id:'not-here')
|
88
|
+
|
89
|
+
let(:page){ Page.new 'webdriver' }
|
90
|
+
|
91
|
+
it "returns the page object instance if valid" do
|
92
|
+
expect(page).to receive(:negative_timer).and_return(true)
|
93
|
+
expect(page.when_gone_not_present).to eq page
|
94
|
+
end
|
95
|
+
|
96
|
+
it "raises a PresenceError if invalid" do
|
97
|
+
expect(page).to receive(:negative_timer).and_return(false)
|
98
|
+
expect{ page.when_gone_not_present }.to raise_error Pouch::PresenceError, /gone element/
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
62
102
|
describe "#button" do
|
63
103
|
it "calls :element with :button tag" do
|
64
104
|
expect(page).to receive(:element).with(:button, :button_name, {id: 'id'}, [])
|
@@ -67,7 +107,7 @@ describe Pouch::Elements do
|
|
67
107
|
end
|
68
108
|
|
69
109
|
describe "#checkbox" do
|
70
|
-
it "calls :element with :
|
110
|
+
it "calls :element with :input tag" do
|
71
111
|
expect(page).to receive(:element).with(:input, :checkbox_name, {id: 'id', type: 'checkbox'}, [])
|
72
112
|
page.send(:checkbox, :checkbox_name, id: 'id')
|
73
113
|
end
|
@@ -81,7 +121,7 @@ describe Pouch::Elements do
|
|
81
121
|
end
|
82
122
|
|
83
123
|
describe "#file_field" do
|
84
|
-
it "calls :element with :
|
124
|
+
it "calls :element with :input tag" do
|
85
125
|
expect(page).to receive(:element).with(:input, :ff_name, {id: 'id', type: 'file'}, [])
|
86
126
|
page.send(:file_field, :ff_name, id: 'id')
|
87
127
|
end
|
@@ -172,7 +212,7 @@ describe Pouch::Elements do
|
|
172
212
|
end
|
173
213
|
|
174
214
|
describe "#radio_button" do
|
175
|
-
it "calls :element with :
|
215
|
+
it "calls :element with :input tag" do
|
176
216
|
expect(page).to receive(:element).with(:input, :radio_name, {id: 'id', type: 'radio'}, [])
|
177
217
|
page.send(:radio_button, :radio_name, id: 'id')
|
178
218
|
end
|
@@ -221,7 +261,7 @@ describe Pouch::Elements do
|
|
221
261
|
end
|
222
262
|
|
223
263
|
describe "#text_area" do
|
224
|
-
it "calls :element with :
|
264
|
+
it "calls :element with :textarea tag" do
|
225
265
|
expect(page).to receive(:element).with(:textarea, :text_area_name, {id: 'id'}, [])
|
226
266
|
page.send(:text_area, :text_area_name, id: 'id')
|
227
267
|
end
|
data/spec/pouch_spec.rb
CHANGED
@@ -18,6 +18,18 @@ describe Pouch do
|
|
18
18
|
obj = Page2.new 'webdriver'
|
19
19
|
expect(obj.instance_variable_get :@browser).to eq 'webdriver'
|
20
20
|
end
|
21
|
+
|
22
|
+
it "creates @timeout variable" do
|
23
|
+
obj = Page2.new 'webdriver'
|
24
|
+
expect(obj.instance_variable_get :@timeout).to eq 10
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with :timeout option" do
|
28
|
+
it "creates @timeout variable" do
|
29
|
+
obj = Page2.new 'webdriver', timeout: 5
|
30
|
+
expect(obj.instance_variable_get :@timeout).to eq 5
|
31
|
+
end
|
32
|
+
end
|
21
33
|
|
22
34
|
context "when instance does not respond to #visit" do
|
23
35
|
it "doesn't navigate to page_url if start=true" do
|
@@ -86,11 +98,11 @@ describe Pouch do
|
|
86
98
|
end
|
87
99
|
|
88
100
|
it "raises StandardError with Hash argument" do
|
89
|
-
expect{ obj.call({}) }.to raise_error(
|
101
|
+
expect{ obj.call({}) }.to raise_error(Pouch::ContextArgumentError, /Hash/)
|
90
102
|
end
|
91
103
|
|
92
104
|
it "raises StandardError if one argument is a Number" do
|
93
|
-
expect{ obj.call(['one', 2]) }.to raise_error(
|
105
|
+
expect{ obj.call(['one', 2]) }.to raise_error(Pouch::ContextArgumentError, /Fixnum/)
|
94
106
|
end
|
95
107
|
end
|
96
108
|
end
|
@@ -108,5 +120,21 @@ describe Pouch do
|
|
108
120
|
expect(obj.context).to eq ['one', 'two', 'three']
|
109
121
|
end
|
110
122
|
end
|
123
|
+
|
124
|
+
describe "#timeout" do
|
125
|
+
context "without setting a custom timeout interval" do
|
126
|
+
it "returns the page object default timeout" do
|
127
|
+
obj = Page.new 'webdriver'
|
128
|
+
expect(obj.timeout).to eq 10
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "after passing :timeout option to #initialize" do
|
133
|
+
it "returns the custom timeout" do
|
134
|
+
obj = Page.new 'webdriver', timeout: 5
|
135
|
+
expect(obj.timeout).to eq 5
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
111
139
|
|
112
140
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pouch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|