page_object_wrapper 1.3.4 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +78 -49
- data/bad_pages/bad_page.rb +2 -2
- data/good_pages/some_test_page.rb +7 -0
- data/lib/page_object_wrapper/Action.rb +1 -1
- data/lib/page_object_wrapper/PageObject.rb +17 -9
- data/lib/page_object_wrapper/version.rb +1 -1
- data/spec/fire_xxx_and_validate_xxx_spec.rb +19 -7
- data/spec/load_spec.rb +4 -4
- metadata +10 -10
data/README.md
CHANGED
@@ -44,64 +44,72 @@ optional arguments are enclosed with [ ]
|
|
44
44
|
|
45
45
|
#### definition example
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
textarea(:ta) do
|
58
|
-
locator :id => 'f2'
|
59
|
-
end
|
60
|
-
|
61
|
-
select(:s1) do
|
62
|
-
locator :id => 'f10'
|
63
|
-
menu :fresh_food, 'one'
|
64
|
-
menu :missing_food, 'three'
|
65
|
-
end
|
66
|
-
|
67
|
-
select(:s2) do
|
68
|
-
locator "form(:action => 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi').select(:id => 'f11')"
|
69
|
-
menu :fresh_food, 'one'
|
70
|
-
end
|
71
|
-
|
72
|
-
checkbox(:cb){ locator :id => 'f5' }
|
73
|
-
radio(:rb){ locator :id => 'f3' }
|
47
|
+
PageObjectWrapper.define_page(:some_test_page) do
|
48
|
+
#locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
|
49
|
+
locator 'file://'+Dir.pwd+'/good_pages/some_test_page.html'
|
50
|
+
uniq_h1 :text => 'Testing display of HTML elements'
|
51
|
+
|
52
|
+
elements_set(:test_elements) do
|
53
|
+
text_field(:tf) do
|
54
|
+
locator :id => 'f1'
|
55
|
+
menu :user_defined, 'some food'
|
74
56
|
end
|
75
57
|
|
76
|
-
|
77
|
-
|
58
|
+
textarea(:ta) do
|
59
|
+
locator :id => 'f2'
|
60
|
+
end
|
61
|
+
|
62
|
+
select(:s1) do
|
63
|
+
locator :id => 'f10'
|
64
|
+
menu :fresh_food, 'one'
|
65
|
+
menu :missing_food, 'three'
|
78
66
|
end
|
79
67
|
|
80
|
-
|
81
|
-
|
82
|
-
|
68
|
+
select(:s2) do
|
69
|
+
locator "form(:action => 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi').select(:id => 'f11')"
|
70
|
+
menu :fresh_food, 'one'
|
83
71
|
end
|
84
72
|
|
85
|
-
|
73
|
+
checkbox(:cb){ locator :id => 'f5' }
|
74
|
+
radio(:rb){ locator :id => 'f3' }
|
75
|
+
end
|
86
76
|
|
87
|
-
|
88
|
-
|
89
|
-
|
77
|
+
action(:press_cool_button, :test_page_with_table) do
|
78
|
+
button(:name => 'foo').when_present.click
|
79
|
+
end
|
90
80
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
81
|
+
action(:fill_textarea, :some_test_page) do |fill_with|
|
82
|
+
data = (fill_with.nil?)? 'Default data' : fill_with
|
83
|
+
textarea(:id => 'f2').set data
|
84
|
+
end
|
95
85
|
|
96
|
-
|
97
|
-
|
98
|
-
|
86
|
+
action :fill_textarea_with_returned_value do |fill_with|
|
87
|
+
data = (fill_with.nil?)? 'Default data' : fill_with
|
88
|
+
textarea(:id => 'f2').set data
|
89
|
+
data
|
90
|
+
end
|
99
91
|
|
100
|
-
|
101
|
-
|
102
|
-
|
92
|
+
action_alias(:fill_textarea_alias, :some_test_page){ action :fill_textarea }
|
93
|
+
action_alias(:fill_textarea_with_returned_value_alias){ action :fill_textarea_with_returned_value }
|
94
|
+
|
95
|
+
table(:table_without_header) do
|
96
|
+
locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
|
103
97
|
end
|
104
98
|
|
99
|
+
table(:table_with_header) do
|
100
|
+
locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
|
101
|
+
header [:country, :total_area, :land_area]
|
102
|
+
end
|
103
|
+
|
104
|
+
pagination(:some_pagination) do
|
105
|
+
locator :xpath => ''
|
106
|
+
end
|
107
|
+
|
108
|
+
validator(:textarea_value) do |expected|
|
109
|
+
textarea(:id => 'f2').value == expected
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
105
113
|
here we have defined a page object with locator (url) = 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
|
106
114
|
- uniq\_xxx is used to define a uniq element on that page, which uniquely identifies the page from other pages
|
107
115
|
- uniq\_xxx is being checked when openning the page with PageObjectWrapper.open\_page and when running an page\_object.action
|
@@ -210,9 +218,18 @@ next\_page from xxx action
|
|
210
218
|
tp = PageObjectWrapper.current_page
|
211
219
|
tp.fire_fill_textarea('User defined data')
|
212
220
|
|
213
|
-
|
214
|
-
|
215
|
-
|
221
|
+
context "next_page == nil":
|
222
|
+
it "returns action returned value":
|
223
|
+
tp = PageObjectWrapper.current_page
|
224
|
+
data = tp.fire_fill_textarea_with_returned_value('data to fill with')
|
225
|
+
tp.validate_textarea_value(data).should be(true)
|
226
|
+
|
227
|
+
context "next_page not nil":
|
228
|
+
it "returns next_page":
|
229
|
+
tp = PageObjectWrapper.current_page
|
230
|
+
np = tp.fire_press_cool_button
|
231
|
+
np.should be_a(PageObject)
|
232
|
+
np.label_value.should eq(:test_page_with_table)
|
216
233
|
|
217
234
|
context "xxx is alias":
|
218
235
|
it "executes corresponding action":
|
@@ -273,6 +290,12 @@ correct arguments are:
|
|
273
290
|
it "returns nil":
|
274
291
|
tp.select_from_table_without_header(:column_0, :column_1 => /123/).should eq nil
|
275
292
|
tp.select_from_table_with_header(:country, :total_area => /123/).should eq nil
|
293
|
+
context "found by row number":
|
294
|
+
it "returns found cells":
|
295
|
+
tp.select_from_table_without_header(:column_0, :row => 2).text.should eq 'Iceland'
|
296
|
+
tp.select_from_table_with_header(:country, :row => 3).text.should eq 'Norway'
|
297
|
+
it "returns nil":
|
298
|
+
tp.select_from_table_with_header(:country, :row => 123).should eq nil
|
276
299
|
|
277
300
|
context "next_page specified":
|
278
301
|
context "found by String":
|
@@ -281,6 +304,12 @@ correct arguments are:
|
|
281
304
|
context "not found by String":
|
282
305
|
it "returns nil":
|
283
306
|
tp.select_from_table_without_header(:column_0, {:column_1 => '123'}, :some_test_page).should eq nil
|
307
|
+
context "found by row number":
|
308
|
+
it "returns found cells":
|
309
|
+
tp.select_from_table_without_header(:column_0, {:row => 2}, :some_test_page).should eq PageObjectWrapper.receive_page(:some_test_page)
|
310
|
+
tp.select_from_table_with_header(:country, {:row => 3}, :some_test_page).should eq PageObjectWrapper.receive_page(:some_test_page)
|
311
|
+
it "returns nil":
|
312
|
+
tp.select_from_table_with_header(:country, {:row => 123}, :some_test_page).should eq nil
|
284
313
|
|
285
314
|
#### each\_xxx
|
286
315
|
TODO
|
data/bad_pages/bad_page.rb
CHANGED
@@ -20,13 +20,13 @@ PageObjectWrapper.define_page('some_page_with_lost_of_errors') do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
action('',
|
23
|
+
action('','a string') do
|
24
24
|
end
|
25
25
|
|
26
26
|
validator('') do
|
27
27
|
end
|
28
28
|
|
29
|
-
action_alias('',
|
29
|
+
action_alias('','a string'){ action 'unknown action'}
|
30
30
|
|
31
31
|
table('') do
|
32
32
|
end
|
@@ -37,7 +37,14 @@ PageObjectWrapper.define_page(:some_test_page) do
|
|
37
37
|
textarea(:id => 'f2').set data
|
38
38
|
end
|
39
39
|
|
40
|
+
action :fill_textarea_with_returned_value do |fill_with|
|
41
|
+
data = (fill_with.nil?)? 'Default data' : fill_with
|
42
|
+
textarea(:id => 'f2').set data
|
43
|
+
data
|
44
|
+
end
|
45
|
+
|
40
46
|
action_alias(:fill_textarea_alias, :some_test_page){ action :fill_textarea }
|
47
|
+
action_alias(:fill_textarea_with_returned_value_alias){ action :fill_textarea_with_returned_value }
|
41
48
|
|
42
49
|
table(:table_without_header) do
|
43
50
|
locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
|
@@ -195,13 +195,13 @@ class PageObject < DslElementWithLocator
|
|
195
195
|
eset
|
196
196
|
end
|
197
197
|
|
198
|
-
def action(label, next_page, &block)
|
198
|
+
def action(label, next_page=nil, &block)
|
199
199
|
a = Action.new(label, next_page, &block)
|
200
200
|
@actions << a
|
201
201
|
a
|
202
202
|
end
|
203
203
|
|
204
|
-
def action_alias(label, next_page, &block)
|
204
|
+
def action_alias(label, next_page=nil, &block)
|
205
205
|
a = Alias.new(label, next_page)
|
206
206
|
a.instance_eval(&block)
|
207
207
|
@aliases << a
|
@@ -256,8 +256,10 @@ class PageObject < DslElementWithLocator
|
|
256
256
|
action_output = []
|
257
257
|
action_output << "\taction #{a.label_value.inspect} already defined\n" if labeled(@actions).count(a.label_value) > 1
|
258
258
|
action_output << "\tlabel #{a.label_value.inspect} not a Symbol\n" if not a.label_value.is_a?(Symbol)
|
259
|
-
|
260
|
-
|
259
|
+
if not a.next_page_value.nil?
|
260
|
+
action_output << "\tnext_page #{a.next_page_value.inspect} not a Symbol\n" if not a.next_page_value.is_a? Symbol
|
261
|
+
action_output << "\tnext_page #{a.next_page_value.inspect} unknown page_object\n" if not labeled(@@pages).include?(a.next_page_value)
|
262
|
+
end
|
261
263
|
action_output << "\tfire event is not a Proc\n" if not a.fire_block_value.is_a?(Proc)
|
262
264
|
action_output.unshift "action(#{a.label_value.inspect}):\n" if not action_output.empty?
|
263
265
|
output += action_output
|
@@ -266,8 +268,10 @@ class PageObject < DslElementWithLocator
|
|
266
268
|
alias_output = []
|
267
269
|
alias_output << "\talias #{a.label_value.inspect} already defined\n" if labeled(@aliases).count(a.label_value) > 1
|
268
270
|
alias_output << "\tlabel #{a.label_value.inspect} not a Symbol\n" if not a.label_value.is_a?(Symbol)
|
269
|
-
|
270
|
-
|
271
|
+
if not a.next_page_value.nil?
|
272
|
+
alias_output << "\tnext_page #{a.next_page_value.inspect} not a Symbol\n" if not a.next_page_value.is_a? Symbol
|
273
|
+
alias_output << "\tnext_page #{a.next_page_value.inspect} unknown page_object\n" if not labeled(@@pages).include?(a.next_page_value)
|
274
|
+
end
|
271
275
|
alias_output << "\taction #{a.action_value.inspect} not known Action\n" if not labeled(@actions).include? a.action_value
|
272
276
|
alias_output.unshift "alias(#{a.label_value.inspect}):\n" if not alias_output.empty?
|
273
277
|
output += alias_output
|
@@ -358,9 +362,13 @@ private
|
|
358
362
|
def fire_action(a, *args)
|
359
363
|
raise PageObjectWrapper::BrowserNotFound if @@browser.nil? or not @@browser.exist?
|
360
364
|
block = (a.is_a? Action)? a.fire_block_value : action_for(a.action_value).fire_block_value
|
361
|
-
@@browser.instance_exec *args, &block
|
362
|
-
|
363
|
-
|
365
|
+
block_result = @@browser.instance_exec *args, &block
|
366
|
+
if not a.next_page_value.nil?
|
367
|
+
self.class.map_current_page a.next_page_value
|
368
|
+
return @@current_page
|
369
|
+
else
|
370
|
+
return block_result
|
371
|
+
end
|
364
372
|
end
|
365
373
|
|
366
374
|
def run_validator(v, *args)
|
@@ -34,20 +34,32 @@ describe "page_object.fire_xxx" do
|
|
34
34
|
tp.validate_textarea_value('User defined data').should be(true)
|
35
35
|
end
|
36
36
|
|
37
|
+
context "next_page == nil" do
|
38
|
+
it "returns action returned value" do
|
39
|
+
tp = PageObjectWrapper.current_page
|
40
|
+
data = tp.fire_fill_textarea_with_returned_value('data to fill with')
|
41
|
+
tp.validate_textarea_value(data).should be(true)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "next_page not nil" do
|
46
|
+
it "returns next_page" do
|
47
|
+
tp = PageObjectWrapper.current_page
|
48
|
+
np = tp.fire_press_cool_button
|
49
|
+
np.should be_a(PageObject)
|
50
|
+
np.label_value.should eq(:test_page_with_table)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
37
54
|
context "xxx is alias" do
|
38
55
|
it "executes corresponding action" do
|
39
56
|
tp = PageObjectWrapper.open_page(:some_test_page)
|
40
57
|
tp.fire_fill_textarea_alias
|
41
58
|
tp.validate_textarea_value('Default data').should be(true)
|
59
|
+
data = tp.fire_fill_textarea_with_returned_value_alias('data to fill with')
|
60
|
+
tp.validate_textarea_value(data).should be(true)
|
42
61
|
end
|
43
62
|
end
|
44
63
|
|
45
|
-
it "returns next_page" do
|
46
|
-
tp = PageObjectWrapper.current_page
|
47
|
-
np = tp.fire_press_cool_button
|
48
|
-
np.should be_a(PageObject)
|
49
|
-
np.label_value.should eq(:test_page_with_table)
|
50
|
-
end
|
51
|
-
|
52
64
|
end
|
53
65
|
end
|
data/spec/load_spec.rb
CHANGED
@@ -31,12 +31,12 @@ elements_set("some elements_set label"):
|
|
31
31
|
locator {} not a meaningful Hash or String
|
32
32
|
action(""):
|
33
33
|
label "" not a Symbol
|
34
|
-
next_page
|
35
|
-
next_page
|
34
|
+
next_page "a string" not a Symbol
|
35
|
+
next_page "a string" unknown page_object
|
36
36
|
alias(""):
|
37
37
|
label "" not a Symbol
|
38
|
-
next_page
|
39
|
-
next_page
|
38
|
+
next_page "a string" not a Symbol
|
39
|
+
next_page "a string" unknown page_object
|
40
40
|
action "unknown action" not known Action
|
41
41
|
validator(""):
|
42
42
|
label "" not a Symbol
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: page_object_wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|
16
|
-
requirement: &
|
16
|
+
requirement: &14087000 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *14087000
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
requirement: &
|
27
|
+
requirement: &14086460 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *14086460
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &14085880 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *14085880
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: debugger
|
49
|
-
requirement: &
|
49
|
+
requirement: &14085340 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *14085340
|
58
58
|
description: Wraps watir-webdriver with convenient testing interface, based on PageObjects
|
59
59
|
automation testing pattern. Simplifies resulting automated test understanding.
|
60
60
|
email:
|