page_object_wrapper 1.3.7 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -42,49 +42,87 @@ optional arguments are enclosed with [ ]
42
42
 
43
43
  ### Examples
44
44
 
45
- #### definition example
45
+ #### definition examples
46
+ ##### define a page object with url and some elements
47
+ PageObjectWrapper.define_page :some_test_page do
48
+ locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html' # url
49
+
50
+ text_field(:tf) do # defines a text_field
51
+ locator :id => 'f1' # element locator (can be Hash or String)
52
+ menu :user_defined, 'some food' # input data with type :user_defined for this element
53
+ end
46
54
 
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'
55
+ select(:s1) do # select list
56
+ locator :id => 'f10'
57
+ menu :fresh_food, 'one'
58
+ menu :missing_food, 'three'
59
+ end
60
+
61
+ table(:table_with_header) do # table with predifined header
62
+ locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
63
+ header [:country, :total_area, :land_area] # header will be used later inside #select_from_xxx calls
64
+ end
65
+ end
66
+
67
+ ##### elements can be included into element\_sets
68
+ PageObjectWrapper.define_page :some_test_page do
69
+ locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
51
70
 
52
- elements_set(:test_elements) do
71
+ elements_set :test_elements do
53
72
  text_field(:tf) do
54
73
  locator :id => 'f1'
55
74
  menu :user_defined, 'some food'
56
75
  end
57
76
 
58
- textarea(:ta) do
77
+ textarea :ta do
59
78
  locator :id => 'f2'
60
79
  end
61
80
 
62
- select(:s1) do
81
+ select :s1 do
63
82
  locator :id => 'f10'
64
83
  menu :fresh_food, 'one'
65
84
  menu :missing_food, 'three'
66
85
  end
86
+ end
87
+ end
67
88
 
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'
71
- end
89
+ ##### each element can be marked as required
90
+ PageObjectWrapper.define_page :some_test_page do
91
+ locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
72
92
 
73
- checkbox(:cb){ locator :id => 'f5' }
74
- radio(:rb){ locator :id => 'f3' }
93
+ text_field :tf do
94
+ locator :id => 'f1'
95
+ menu :user_defined, 'some food'
96
+ required true # will be checked for presence upon page load
75
97
  end
98
+ end
76
99
 
77
- action(:press_cool_button, :test_page_with_table) do
78
- button(:name => 'foo').when_present.click
100
+ *if all pages are similar through out the web app, it's possible to additionaly set a number of uniq elements
101
+ which will be checked for presence as well*
102
+
103
+ PageObjectWrapper.define_page :some_test_page_similar_to_previous do
104
+ locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
105
+
106
+ text_field :tf do
107
+ locator :id => 'f1'
108
+ menu :user_defined, 'some food'
109
+ required true # will be checked for presence upon page load
79
110
  end
111
+ end
80
112
 
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
113
+ ##### it's possible to define action and its aliases inside pages
114
+ *actions are being executed in browser context
115
+
116
+ PageObjectWrapper.define_page :some_test_page do
117
+ locator 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
118
+ uniq_h1 :text => 'Testing display of HTML elements'
119
+
120
+ action(:press_cool_button, :test_page_with_table) do # this action returns :test_page_with_table object after execution
121
+ button(:name => 'foo').when_present.click
84
122
  end
85
123
 
86
- action :fill_textarea_with_returned_value do |fill_with|
87
- data = (fill_with.nil?)? 'Default data' : fill_with
124
+ action :fill_textarea_with_returned_value do |fill_with| # this action returns 'data'
125
+ data = (fill_with.nil?)? 'Default data' : fill_with # (because returned page object is not specified)
88
126
  textarea(:id => 'f2').set data
89
127
  data
90
128
  end
@@ -95,21 +133,10 @@ optional arguments are enclosed with [ ]
95
133
  table(:table_without_header) do
96
134
  locator :summary => 'Each row names a Nordic country and specifies its total area and land area, in square kilometers'
97
135
  end
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
136
  end
112
137
 
138
+ ##### other definition examples can be found inside 'good\_pages', 'bad\_pages' folders
139
+
113
140
  here we have defined a page object with locator (url) = 'http://www.cs.tut.fi/~jkorpela/www/testel.html'
114
141
  - uniq\_xxx is used to define a uniq element on that page, which uniquely identifies the page from other pages
115
142
  - uniq\_xxx is being checked when openning the page with PageObjectWrapper.open\_page and when running an page\_object.action
@@ -167,7 +194,7 @@ Defined elements can be accessed with their labels.
167
194
 
168
195
  #### feed\_xxx
169
196
  *parameters*
170
- :fresh\_food, :missing\_food
197
+ menu type, specified inside page\_object (optional)
171
198
  *returns*
172
199
  current\_page
173
200
 
@@ -222,10 +249,6 @@ next\_page from xxx action
222
249
  *preconditions*
223
250
  **tp** is a :some\_test\_page object opened in the browser
224
251
 
225
- it "executes fire_block in Watir::Browser context":
226
- tp = PageObjectWrapper.open_page(:some_test_page)
227
- tp.fire_fill_textarea
228
-
229
252
  it "can be invoked with parameters":
230
253
  tp = PageObjectWrapper.current_page
231
254
  tp.fire_fill_textarea('User defined data')
@@ -236,13 +259,6 @@ next\_page from xxx action
236
259
  data = tp.fire_fill_textarea_with_returned_value('data to fill with')
237
260
  tp.validate_textarea_value(data).should be(true)
238
261
 
239
- context "next_page not nil":
240
- it "returns next_page":
241
- tp = PageObjectWrapper.current_page
242
- np = tp.fire_press_cool_button
243
- np.should be_a(PageObject)
244
- np.label_value.should eq(:test_page_with_table)
245
-
246
262
  context "xxx is alias":
247
263
  it "executes corresponding action":
248
264
  tp = PageObjectWrapper.open_page(:some_test_page)
@@ -253,18 +269,13 @@ next\_page from xxx action
253
269
  optional arguments defined inside action
254
270
  *returns*
255
271
  anything block inside xxx validator returns
256
- it's expected that validator returns true | false
257
272
 
258
273
  *preconditions*
259
274
  **tp** is a :some\_test\_page object opened in the browser
260
275
 
261
276
  tp = PageObjectWrapper.open_page(:some_test_page)
262
- tp.fire_fill_textarea
263
- tp.validate_textarea_value('Default data').should be(true)
264
-
265
- tp = PageObjectWrapper.current_page
266
- tp.fire_fill_textarea('User defined data')
267
- tp.validate_textarea_value('User defined data').should be(true)
277
+ tp.fire_fill_textarea data
278
+ tp.validate_textarea_value.should eq data
268
279
 
269
280
  #### select\_from\_xxx
270
281
  *parameters*
@@ -274,7 +285,7 @@ Watir::TableCell if next\_page not specified
274
285
  next\_page if it is specified
275
286
 
276
287
  *preconditions*
277
- **tp** is a :some\_test\_page object opened in the browser
288
+ **tp** is a :some\_test\_page object opened in the browser (url = (https://raw.github.com/evgeniy-khatko/page_object_wrapper/master/img/scheme.png))
278
289
  its syntax is close to SQL *'select column1 from page\_object.some\_table where column2 = string\_or\_regexp'*
279
290
  page\_object.select\_from\_xxx( :column1, :column2 => 'string\_or\_regexp' )
280
291
  correct arguments are:
@@ -343,6 +354,7 @@ correct arguments are:
343
354
  gp = PageObjectWrapper.open_page(:google_pagination)
344
355
  gp.pagination_open(n).should be_a PageObject
345
356
  gp.validate_current_number?(n).should be_true
357
+
346
358
  ## Contributing
347
359
 
348
360
  1. Fork it
@@ -7,6 +7,10 @@ PageObjectWrapper.define_page('some_page_with_lost_of_errors') do
7
7
  elements_set('some elements_set label') do
8
8
  end
9
9
 
10
+ text_field :bad_required_flad do
11
+ required 'a string'
12
+ end
13
+
10
14
  elements_set(:bad_elements) do
11
15
  element('') do
12
16
  menu :fresh_food, Array.new
@@ -1,4 +1,4 @@
1
1
  PageObjectWrapper.define_page(:wrong_google_page) do
2
2
  locator 'google.com'
3
- uniq_element :id => 'foobar'
3
+ uniq_text_field :id => 'foobar'
4
4
  end
@@ -0,0 +1,9 @@
1
+ PageObjectWrapper.define_page(:required_missing) do
2
+ locator 'file://'+Dir.pwd+'/good_pages/some_test_page.html'
3
+
4
+ text_field(:tf) do
5
+ locator :id => 'foobar'
6
+ required true
7
+ end
8
+
9
+ end
@@ -3,7 +3,36 @@ PageObjectWrapper.define_page(:some_test_page) do
3
3
  locator 'file://'+Dir.pwd+'/good_pages/some_test_page.html'
4
4
  uniq_h1 :text => 'Testing display of HTML elements'
5
5
 
6
+ text_field(:tf_standalone) do
7
+ locator :id => 'f1'
8
+ menu :loud, 'tf food'
9
+ end
10
+
11
+ button(:standalone_cool_button_with_default_press_action) do
12
+ locator :name => 'foo'
13
+ menu :loud, 'try to feed me!'
14
+ end
15
+
16
+ button(:standalone_cool_button) do
17
+ locator :name => 'foo'
18
+ press_action :click
19
+ end
20
+
21
+ button(:invalid_press_action_button) do
22
+ locator :name => 'foo'
23
+ press_action :press
24
+ end
25
+
26
+ button(:invalid_button) do
27
+ locator :name => 'bar'
28
+ end
29
+
6
30
  elements_set(:test_elements) do
31
+
32
+ button(:cool_button) do
33
+ locator :name => 'foo'
34
+ end
35
+
7
36
  text_field(:tf) do
8
37
  locator :id => 'f1'
9
38
  menu :loud, 'tf food'
@@ -0,0 +1,4 @@
1
+ PageObjectWrapper.define_page(:uniq_missing) do
2
+ locator 'file://'+Dir.pwd+'/good_pages/some_test_page.html'
3
+ uniq_text_field :id => 'foobar'
4
+ end
@@ -32,6 +32,10 @@ module PageObjectWrapper
32
32
  PageObject.current_page
33
33
  end
34
34
 
35
+ def self.current_page? label
36
+ PageObject.current_page? label
37
+ end
38
+
35
39
  def self.load(path_to_pages='.')
36
40
  processed = 0
37
41
  Dir.glob("#{path_to_pages}/*_page.rb"){|fn|
@@ -6,6 +6,8 @@ class Element < DslElementWithLocator
6
6
  super label
7
7
  @type = type
8
8
  @menu = Hash.new
9
+ @press_action = :click
10
+ @required = false
9
11
  end
10
12
 
11
13
  def menu food_type, value
@@ -15,4 +17,20 @@ class Element < DslElementWithLocator
15
17
  def menu_value
16
18
  @menu
17
19
  end
20
+
21
+ def press_action action
22
+ @press_action = action
23
+ end
24
+
25
+ def press_action_value
26
+ @press_action
27
+ end
28
+
29
+ def required flag
30
+ @required = flag
31
+ end
32
+
33
+ def required_value
34
+ @required
35
+ end
18
36
  end
@@ -8,4 +8,5 @@ module PageObjectWrapper
8
8
  class DynamicUrl < StandardError; end
9
9
  class InvalidPagination < StandardError; end
10
10
  class OutOfBoundsSubpage < StandardError; end
11
+ class InvalidElement < StandardError; end
11
12
  end
@@ -10,6 +10,7 @@ require 'Alias'
10
10
  require 'Validator'
11
11
  require 'Table'
12
12
  require 'Pagination'
13
+ require 'Element'
13
14
  require 'known_elements'
14
15
 
15
16
  class PageObject < DslElementWithLocator
@@ -18,19 +19,18 @@ class PageObject < DslElementWithLocator
18
19
  @@pages = []
19
20
  @@current_page = nil
20
21
 
21
- UNIQ_ELEMENT_WAIT_PERIOD = 10
22
+ REQUIRED_ELEMENT_WAIT_PERIOD = 10
22
23
  FEED_ALL = Regexp.new(/^feed_all$/)
23
- FEED_SET = Regexp.new(/^feed_([\w_]+)$/)
24
+ FEED = Regexp.new(/^feed_([\w_]+)$/)
24
25
  FIRE_ACTION = Regexp.new(/^fire_([\w_]+)$/)
25
26
  SELECT_FROM = Regexp.new(/^select_from_([\w_]+)$/)
26
27
  PAGINATION_EACH = Regexp.new(/^([\w_]+)_each$/)
27
28
  PAGINATION_OPEN = Regexp.new(/^([\w_]+)_open$/)
28
29
  VALIDATE = Regexp.new(/^validate_([\w_\?]+)$/)
30
+ PRESS = Regexp.new(/^press_([\w_\?]+)$/)
29
31
 
30
32
  def initialize(label)
31
33
  super label
32
- @uniq_element_type = nil
33
- @uniq_element_hash = {}
34
34
  @esets = []
35
35
  @elements = []
36
36
  @actions = []
@@ -40,28 +40,42 @@ class PageObject < DslElementWithLocator
40
40
  @paginations = []
41
41
  end
42
42
 
43
+ KNOWN_ELEMENTS.each{|m|
44
+ PageObject.send :define_method, m do |l, &b|
45
+ e = Element.new(l, m.to_sym)
46
+ e.instance_eval(&b)
47
+ @elements << e
48
+ end
49
+ }
50
+
43
51
  # lazy evaluated calls of real watir elements are handled by :method_missing
44
52
  def method_missing(method_name, *args, &block)
45
53
  case
46
54
  when KNOWN_ELEMENTS.include?(method_name.to_s.gsub(/^uniq_/,''))
47
55
  # page_object.uniq_xxx(hash)
48
- @uniq_element_type = method_name.to_s.gsub(/^uniq_/,'').to_sym
49
- @uniq_element_hash = args[0]
56
+ meth = method_name.to_s.gsub(/^uniq_/,'')
57
+ e = Element.new(method_name.to_sym, meth)
58
+ e.instance_eval { locator(args[0]); required(true) }
59
+ @elements << e
50
60
  when has_eset?(method_name)
51
61
  # page_object.some_elements_set
52
62
  eset = eset_for(method_name)
53
- return_array_of_watir_elements(eset)
63
+ PageObject.return_array_of_watir_elements(eset)
54
64
  when has_element?(method_name)
55
65
  # page_object.some_element
56
66
  element = element_for(method_name)
57
- return_watir_element(element)
67
+ PageObject.return_watir_element element
58
68
  when FEED_ALL.match(method_name)
59
69
  # page_object.feed_all(:fresh_food)
60
70
  feed_elements(@elements, *args)
61
- when (FEED_SET.match(method_name) and has_eset?($1))
71
+ when (FEED.match(method_name) and has_eset?($1))
62
72
  # page_object.feed_some_elements_set(:fresh_food)
63
73
  eset = eset_for($1)
64
74
  feed_elements(eset.elements, *args)
75
+ when (FEED.match(method_name) and has_element?($1))
76
+ # page_object.feed_some_element(:fresh_food)
77
+ e = element_for($1)
78
+ feed_elements([e], *args)
65
79
  when (FIRE_ACTION.match(method_name) and has_action?($1))
66
80
  # page_object.fire_some_action
67
81
  a = action_for($1)
@@ -86,6 +100,10 @@ class PageObject < DslElementWithLocator
86
100
  # page_object.open_padination(1)
87
101
  pagination = pagination_for($1)
88
102
  open_subpage(pagination, *args)
103
+ when (PRESS.match(method_name) and has_element?($1))
104
+ # page_object.press_element
105
+ element = element_for($1)
106
+ press(element)
89
107
  else
90
108
  super
91
109
  end
@@ -107,9 +125,12 @@ class PageObject < DslElementWithLocator
107
125
  when FEED_ALL.match(method_name)
108
126
  # page_object.feed_all(:fresh_food)
109
127
  true
110
- when (FEED_SET.match(method_name) and has_eset?($1))
128
+ when (FEED.match(method_name) and has_eset?($1))
111
129
  # page_object.feed_some_elements_set(:fresh_food)
112
130
  true
131
+ when (FEED.match(method_name) and has_element?($1))
132
+ # page_object.feed_some_element(:fresh_food)
133
+ true
113
134
  when (FIRE_ACTION.match(method_name) and has_action?($1))
114
135
  # page_object.fire_some_action
115
136
  true
@@ -128,6 +149,9 @@ class PageObject < DslElementWithLocator
128
149
  when (PAGINATION_OPEN.match(method_name) and has_pagination?($1))
129
150
  # page_object.open_padination(1)
130
151
  true
152
+ when (PRESS.match(method_name) and has_element?($1))
153
+ # page_object.press_element
154
+ true
131
155
  else
132
156
  super
133
157
  end
@@ -155,17 +179,22 @@ class PageObject < DslElementWithLocator
155
179
  raise PageObjectWrapper::BrowserNotFound if @@browser.nil?
156
180
  raise PageObjectWrapper::UnknownPageObject, label if not @@pages.collect(&:label_value).include?(label)
157
181
  page_object = PageObject.find_page_object(label)
158
- if not page_object.uniq_element_type.nil?
182
+ page_object.elements.select{ |e| e.required_value == true }.each{ |required_element|
159
183
  begin
160
- watir_uniq_element = @@browser.send page_object.uniq_element_type, page_object.uniq_element_hash
161
- watir_uniq_element.wait_until_present UNIQ_ELEMENT_WAIT_PERIOD
184
+ watir_element = return_watir_element required_element
185
+ watir_element.wait_until_present REQUIRED_ELEMENT_WAIT_PERIOD
162
186
  rescue Watir::Wait::TimeoutError => e
163
- raise PageObjectWrapper::UnmappedPageObject, "#{label} <=> #{@@browser.url} (#{e.message})" if not watir_uniq_element.present?
187
+ raise PageObjectWrapper::UnmappedPageObject, "#{label} <=> #{@@browser.url} (#{e.message})" if not watir_element.present?
164
188
  end
165
- end
189
+ }
166
190
  @@current_page = page_object
167
191
  end
168
192
 
193
+ def self.current_page? label
194
+ self.map_current_page label
195
+ true
196
+ end
197
+
169
198
  def self.current_page
170
199
  @@current_page
171
200
  end
@@ -242,15 +271,19 @@ class PageObject < DslElementWithLocator
242
271
  eset_output << "\tlabel #{eset.label_value.inspect} not a Symbol\n" if not eset.label_value.is_a?(Symbol)
243
272
  eset_output.unshift "elements_set(#{eset.label_value.inspect}):\n" if not eset_output.empty?
244
273
  output += eset_output
245
- eset.elements.each{|e|
246
- element_output = []
247
- element_output << "\t\telement #{e.label_value.inspect} already defined\n" if labeled(eset.elements).count(e.label_value) > 1
248
- element_output << "\t\tlabel #{e.label_value.inspect} not a Symbol\n" if not e.label_value.is_a?(Symbol)
249
- element_output << "\t\tlocator #{e.locator_value.inspect} not a meaningful Hash or String\n" if (not e.locator_value.is_a?(Hash) and not e.locator_value.is_a?(String)) or e.locator_value.empty?
250
- element_output << "\t\tmenu #{e.menu_value.inspect} not properly defined (must be { :food_type => 'a string' | true | false })\n" if (e.menu_value.keys.collect(&:class).uniq != [Symbol]) or not (e.menu_value.values.collect(&:class).uniq - [String, TrueClass, FalseClass]).empty?
251
- element_output.unshift "\telement(#{e.label_value.inspect}):\n" if not element_output.empty?
252
- output += element_output
253
- }
274
+ }
275
+ @elements.each{|e|
276
+ element_output = []
277
+ element_output << "\telement #{e.label_value.inspect} already defined\n" if labeled(@elements).count(e.label_value) > 1
278
+ element_output << "\tlabel #{e.label_value.inspect} not a Symbol\n" if not e.label_value.is_a?(Symbol)
279
+ element_output << "\tlocator #{e.locator_value.inspect} not a meaningful Hash or String\n" if (not e.locator_value.is_a?(Hash) and not e.locator_value.is_a?(String)) \
280
+ or e.locator_value.empty?
281
+ element_output << "\tmenu #{e.menu_value.inspect} not properly defined (must be { :food_type => 'a string' | true | false })\n" if (not e.menu_value.empty?) and \
282
+ ((e.menu_value.keys.collect(&:class).uniq != [Symbol]) \
283
+ or not (e.menu_value.values.collect(&:class).uniq - [String, TrueClass, FalseClass]).empty?)
284
+ element_output << "\trequired flag #{e.required_value.inspect} not a true | false\n" if not [true, false].include? e.required_value
285
+ element_output.unshift "element(#{e.label_value.inspect}):\n" if not element_output.empty?
286
+ output += element_output
254
287
  }
255
288
  @actions.each{|a|
256
289
  action_output = []
@@ -286,9 +319,6 @@ class PageObject < DslElementWithLocator
286
319
  }
287
320
  @tables.each{|t|
288
321
  table_output = []
289
- table_output << "\ttable #{t.label_value.inspect} already defined\n" if labeled(@tables).count(t.label_value) > 1
290
- table_output << "\tlabel #{t.label_value.inspect} not a Symbol\n" if not t.label_value.is_a?(Symbol)
291
- table_output << "\tlocator #{t.locator_value.inspect} not a meaningful Hash or String\n" if (not t.locator_value.is_a?(Hash) and not t.locator_value.is_a?(String)) or t.locator_value.empty?
292
322
  table_output << "\theader #{t.header_value.inspect} not a meaningful Array\n" if not t.header_value.is_a?(Array) or t.header_value.empty?
293
323
  table_output.unshift "table(#{t.label_value.inspect}):\n" if not table_output.empty?
294
324
  output += table_output
@@ -314,7 +344,7 @@ private
314
344
  p
315
345
  end
316
346
 
317
- def return_watir_element(e)
347
+ def self.return_watir_element(e)
318
348
  el = nil
319
349
  if e.locator_value.is_a? Hash
320
350
  el = @@browser.send e.type, e.locator_value
@@ -324,7 +354,7 @@ private
324
354
  el
325
355
  end
326
356
 
327
- def return_array_of_watir_elements(eset)
357
+ def self.return_array_of_watir_elements(eset)
328
358
  eset.elements.collect{|e| return_watir_element(e)}
329
359
  end
330
360
 
@@ -349,7 +379,7 @@ private
349
379
  else
350
380
  food = e.menu_value[menu_name].to_s
351
381
  end
352
- watir_element = return_watir_element(e)
382
+ watir_element = PageObject.return_watir_element e
353
383
  case watir_element
354
384
  when Watir::CheckBox
355
385
  watir_element.when_present.set eval(food) if ["true", "false"].include? food
@@ -361,7 +391,9 @@ private
361
391
  if watir_element.respond_to?(:set)
362
392
  watir_element.when_present.set food if food!=''
363
393
  else
364
- raise PageObjectWrapper::UnableToFeedObject, to_tree(@@current_page, e) + ' check element type'
394
+ # this is an element which does not support input (e.g. button) => skipping it
395
+ next
396
+ #raise PageObjectWrapper::UnableToFeedObject, to_tree(@@current_page, e) + ' check element type'
365
397
  end
366
398
  end
367
399
  }
@@ -487,6 +519,16 @@ private
487
519
  self
488
520
  end
489
521
 
522
+ def press e
523
+ raise PageObjectWrapper::BrowserNotFound if @@browser.nil? or not @@browser.exist?
524
+ watir_element = PageObject.return_watir_element e
525
+ raise PageObjectWrapper::InvalidElement, "Element #{e.locator_value} not found in #{@@current_page}"\
526
+ if not watir_element.present?
527
+ raise PageObjectWrapper::InvalidElement, "Element #{e.locator_value} does not respond to #{e.press_action_value}"\
528
+ if not watir_element.respond_to? e.press_action_value
529
+ watir_element.when_present.send e.press_action_value
530
+ watir_element
531
+ end
490
532
 
491
533
  def labeled(ary)
492
534
  ary.collect(&:label_value)
@@ -5,6 +5,7 @@ class Pagination < DslElement
5
5
  super label
6
6
  @locator = nil
7
7
  @finds = nil
8
+ @menu = Hash.new
8
9
  end
9
10
 
10
11
  def locator hash, finds
@@ -19,5 +20,5 @@ class Pagination < DslElement
19
20
  def finds_value
20
21
  @finds
21
22
  end
22
- end
23
23
 
24
+ end
@@ -1,5 +1,5 @@
1
1
  require 'Dsl'
2
- class Table < DslElementWithLocator
2
+ class Table < Element
3
3
  attr_reader :type
4
4
  dsl_attr_accessor :header
5
5
  DEFAULT_HEADER_COLLUMNS_NUMBER = 100
@@ -7,11 +7,9 @@ class Table < DslElementWithLocator
7
7
 
8
8
 
9
9
  def initialize(label)
10
- super label
10
+ super label, 'table'
11
11
  h = []
12
12
  DEFAULT_HEADER_COLLUMNS_NUMBER.times { |i| h << (DEFAULT_HEADER_COLLUMNS_PREFIX+i.to_s).to_sym }
13
13
  @header = h
14
- @type = 'table'
15
14
  end
16
15
  end
17
-
@@ -8,7 +8,7 @@ KNOWN_ELEMENTS = [
8
8
  'cites', 'code', 'codes', 'col', 'colgroup', 'colgroups',
9
9
  'cols', 'command', 'commands', 'datalist', 'datalists',
10
10
  'dd', 'dds', 'del', 'dels', 'details', 'dfn', 'dfns', 'div',
11
- 'divs', 'dl', 'dls', 'dt', 'dts', 'element', 'elements',
11
+ 'divs', 'dl', 'dls', 'dt', 'dts', 'element',
12
12
  'em', 'embed', 'embeds', 'ems', 'fieldset', 'fieldsets', 'figcaption',
13
13
  'figcaptions', 'figure', 'figures', 'file_field', 'file_fields', 'font',
14
14
  'fonts', 'footer', 'footers', 'form', 'forms', 'frame', 'frames',
@@ -24,7 +24,7 @@ KNOWN_ELEMENTS = [
24
24
  'ps', 'q', 'qs', 'radio', 'radios', 'rp', 'rps', 'rt', 'rts', 'rubies', 'ruby', 's',
25
25
  'samp', 'samps', 'script', 'scripts', 'section', 'sections', 'select', 'selects', 'small',
26
26
  'smalls', 'source', 'sources', 'span', 'spans', 'ss', 'strong', 'strongs', 'style', 'styles',
27
- 'sub', 'subs', 'summaries', 'summary', 'sup', 'sups', 'table', 'tables', 'tbody', 'tbodys', 'td',
27
+ 'sub', 'subs', 'summaries', 'summary', 'sup', 'sups', 'tbody', 'tbodys', 'td',
28
28
  'tds', 'text_field', 'text_fields', 'textarea', 'textareas', 'tfoot', 'tfoots', 'th', 'thead',
29
29
  'theads', 'ths', 'time', 'times', 'title', 'titles', 'tr', 'track', 'tracks', 'trs', 'ul',
30
30
  'uls', 'var', 'vars', 'video', 'videos', 'wbr', 'wbrs'
@@ -1,3 +1,3 @@
1
1
  module PageObjectWrapper
2
- VERSION = "1.3.7"
2
+ VERSION = "1.4.0"
3
3
  end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'shared_examples'
3
+ require 'known_elements'
3
4
 
4
5
  describe "define_page_object" do
5
6
  let!(:page_object){
@@ -21,8 +22,17 @@ describe "define_page_object" do
21
22
  end
22
23
 
23
24
  describe "page_object uniq_element" do
24
- its(:uniq_element_type) { should eq :h1 }
25
- its(:uniq_element_hash) { should == {:text => 'Testing display of HTML elements'} }
25
+ specify { subject.elements.collect(&:label_value).should include(:uniq_h1) }
26
+ let(:uniq_element){ subject.elements[subject.elements.collect(&:label_value).index(:uniq_h1)] }
27
+ specify { uniq_element.required_value.should be_true }
28
+ end
29
+
30
+ describe "page_object element" do
31
+ it "can contain known elements" do
32
+ KNOWN_ELEMENTS.each{ |known|
33
+ subject.should respond_to known
34
+ }
35
+ end
26
36
  end
27
37
 
28
38
  specify { subject.esets.collect(&:label_value).should include(:test_elements)}
@@ -47,8 +57,42 @@ describe "define_page_object" do
47
57
  specify { subject.paginations.collect(&:label_value).should include(:some_pagination)}
48
58
  it { should respond_to(:some_pagination_each) }
49
59
  it { should respond_to(:some_pagination_open) }
60
+
61
+ specify { subject.elements.collect(&:label_value).should include(:tf_standalone)}
62
+ it { should respond_to(:feed_tf_standalone) }
63
+ it { should respond_to(:press_tf_standalone) }
64
+
65
+ specify { subject.elements.collect(&:label_value).should include(:standalone_cool_button)}
66
+ it { should respond_to(:press_standalone_cool_button) }
67
+ it { should respond_to(:feed_standalone_cool_button) }
50
68
  end
51
69
 
70
+ context "element outside elements_set" do
71
+ subject { page_object.elements[page_object.elements.collect(&:label_value).index(:tf_standalone)] }
72
+
73
+ it { should be_a(Element) }
74
+
75
+ describe "element label" do
76
+ it_should_behave_like "a label"
77
+ end
78
+
79
+ describe "element locator" do
80
+ it_should_behave_like "a locator"
81
+ its(:locator_value) { should be_a Hash }
82
+ end
83
+
84
+ describe "element menu" do
85
+ it { should respond_to(:menu) }
86
+ it { should respond_to(:menu_value) }
87
+
88
+ its(:menu_value) { should be_a Hash}
89
+
90
+ describe "user defined menu" do
91
+ its(:menu_value){ should have_key :loud }
92
+ its(:menu_value){ should have_value 'tf food'}
93
+ end
94
+ end
95
+ end
52
96
 
53
97
  context "elements_set" do
54
98
  subject { page_object.esets[page_object.esets.collect(&:label_value).index(:test_elements)] }
@@ -60,7 +104,7 @@ describe "define_page_object" do
60
104
  end
61
105
  end
62
106
 
63
- context "element" do
107
+ context "element inside elements_set" do
64
108
  subject { page_object.elements[page_object.elements.collect(&:label_value).index(:tf)] }
65
109
 
66
110
  it { should be_a(Element) }
@@ -24,12 +24,19 @@ describe "page_object.feed_xxx" do
24
24
  end
25
25
 
26
26
  it "returns current page object" do
27
+ @tp.feed_tf_standalone(:quite).should be_a PageObject
27
28
  @tp.feed_test_elements(:quite).should be_a PageObject
29
+ @tp.feed_all(:quite).should be_a PageObject
28
30
  end
29
31
 
30
- context "menu not specified" do
31
- it "does nothing" do
32
- @tp.feed_test_elements
32
+ describe "feed_standalone_element" do
33
+ it "does nothing if menu not spesified" do
34
+ @tp.feed_tf_standalone
35
+ @b.text_field(:id => 'f1').value.should eq 'Default text.'
36
+ end
37
+
38
+ it "does nothing if element does not support :select or :set methods" do
39
+ @tp.feed_standalone_cool_button(:loud)
33
40
  @b.text_field(:id => 'f1').value.should eq 'Default text.'
34
41
  @b.textarea(:id => 'f2').value.should eq "Default text.\n"
35
42
  @b.radio(:id => 'f3').should_not be_set
@@ -39,9 +46,46 @@ describe "page_object.feed_xxx" do
39
46
  @b.select(:id => 'f10').value.should eq 'two (default)'
40
47
  @b.select(:id => 'f11').value.should eq 'two (default)'
41
48
  end
49
+
50
+ it "FEEDS elements which has provided menu" do
51
+ @tp.feed_tf_standalone(:loud)
52
+ @b.text_field(:id => 'f1').value.should eq 'tf food'
53
+ end
54
+
55
+ it "feeds ONLY elements which has provided menu" do
56
+ @tp.feed_tf_standalone(:quite)
57
+ @b.text_field(:id => 'f1').value.should eq 'Default text.'
58
+ @b.textarea(:id => 'f2').value.should eq "Default text.\n"
59
+ @b.radio(:id => 'f4').should be_set
60
+ @b.checkbox(:id => 'f6').should be_set
61
+ @b.select(:id => 'f11').value.should eq 'two (default)'
62
+ end
63
+
64
+ it "overrides defined menu when passing arguments" do
65
+ @tp.feed_tf_standalone(:loud, :tf_standalone => 'cheef menu')
66
+ @b.text_field(:id => 'f1').value.should eq 'cheef menu'
67
+ end
68
+
69
+ it "can be used without providing a menu" do
70
+ @tp.feed_tf_standalone(:tf_standalone => 'cheef menu')
71
+ @b.text_field(:id => 'f1').value.should eq 'cheef menu'
72
+ end
42
73
  end
43
74
 
44
- describe "basic usage" do
75
+ describe "feed_elements_set" do
76
+ it "does nothing if menu not spesified" do
77
+ @tp.feed_test_elements
78
+ @tp.feed_all
79
+ @b.text_field(:id => 'f1').value.should eq 'Default text.'
80
+ @b.textarea(:id => 'f2').value.should eq "Default text.\n"
81
+ @b.radio(:id => 'f3').should_not be_set
82
+ @b.radio(:id => 'f4').should be_set
83
+ @b.checkbox(:id => 'f5').should_not be_set
84
+ @b.checkbox(:id => 'f6').should be_set
85
+ @b.select(:id => 'f10').value.should eq 'two (default)'
86
+ @b.select(:id => 'f11').value.should eq 'two (default)'
87
+ end
88
+
45
89
  it "FEEDS elements which has provided menu" do
46
90
  @tp.feed_test_elements(:loud)
47
91
  @b.text_field(:id => 'f1').value.should eq 'tf food'
@@ -79,5 +123,56 @@ describe "page_object.feed_xxx" do
79
123
  @b.select(:id => 'f11').value.should eq 'three'
80
124
  end
81
125
  end
126
+
127
+ describe "feed_all" do
128
+ it "does nothing if menu not spesified" do
129
+ @tp.feed_all
130
+ @b.text_field(:id => 'f1').value.should eq 'Default text.'
131
+ @b.textarea(:id => 'f2').value.should eq "Default text.\n"
132
+ @b.radio(:id => 'f3').should_not be_set
133
+ @b.radio(:id => 'f4').should be_set
134
+ @b.checkbox(:id => 'f5').should_not be_set
135
+ @b.checkbox(:id => 'f6').should be_set
136
+ @b.select(:id => 'f10').value.should eq 'two (default)'
137
+ @b.select(:id => 'f11').value.should eq 'two (default)'
138
+ end
139
+
140
+ it "FEEDS elements which has provided menu" do
141
+ @tp.feed_all(:loud)
142
+ @b.text_field(:id => 'f1').value.should eq 'tf food'
143
+ @b.textarea(:id => 'f2').value.should eq "ta food"
144
+ @b.radio(:id => 'f3').should be_set
145
+ @b.radio(:id => 'f4').should_not be_set
146
+ @b.checkbox(:id => 'f5').should be_set
147
+ @b.checkbox(:id => 'f6').should_not be_set
148
+ @b.select(:id => 'f10').value.should eq 'one'
149
+ @b.select(:id => 'f11').value.should eq 'one'
150
+ end
151
+
152
+ it "feeds ONLY elements which has provided menu" do
153
+ @tp.feed_all(:quite)
154
+ @b.text_field(:id => 'f1').value.should eq 'Default text.'
155
+ @b.textarea(:id => 'f2').value.should eq "Default text.\n"
156
+ @b.radio(:id => 'f4').should be_set
157
+ @b.checkbox(:id => 'f6').should be_set
158
+ @b.select(:id => 'f11').value.should eq 'two (default)'
159
+ end
160
+
161
+ it "overrides defined menu when passing arguments" do
162
+ @tp.feed_all(:loud, :tf => 'cheef menu', :rb1 => false, :rb2 => true, :cb2 => true, :s2 => 'three')
163
+ @b.text_field(:id => 'f1').value.should eq 'cheef menu'
164
+ @b.radio(:id => 'f4').should be_set
165
+ @b.checkbox(:id => 'f6').should be_set
166
+ @b.select(:id => 'f11').value.should eq 'three'
167
+ end
168
+
169
+ it "can be used without providing a menu" do
170
+ @tp.feed_all(:tf => 'cheef menu', :rb2 => true, :cb2 => true, :s2 => 'three')
171
+ @b.text_field(:id => 'f1').value.should eq 'cheef menu'
172
+ @b.radio(:id => 'f4').should be_set
173
+ @b.checkbox(:id => 'f6').should be_set
174
+ @b.select(:id => 'f11').value.should eq 'three'
175
+ end
176
+ end
82
177
  end
83
178
  end
@@ -10,26 +10,35 @@ describe "PageObjectWrapper.load" do
10
10
  begin
11
11
  PageObjectWrapper.load(File.dirname(__FILE__)+'/../bad_pages')
12
12
  rescue Exception => e
13
- # puts '=============='
14
- # puts e.message
15
- # puts '=============='
13
+ # puts '=============='
14
+ # puts e.message
15
+ # puts '=============='
16
16
  e.should be_a(PageObjectWrapper::Load)
17
17
  e.message.should == 'page_object("some_page_with_lost_of_errors"):
18
18
  label "some_page_with_lost_of_errors" not a Symbol
19
19
  locator "" not a meaningful String
20
20
  elements_set("some elements_set label"):
21
21
  label "some elements_set label" not a Symbol
22
- element(""):
23
- label "" not a Symbol
24
- locator nil not a meaningful Hash or String
25
- menu {:fresh_food=>[]} not properly defined (must be { :food_type => \'a string\' | true | false })
26
- element(:e):
27
- element :e already defined
28
- menu {"a string"=>"another string"} not properly defined (must be { :food_type => \'a string\' | true | false })
29
- element(:e):
30
- element :e already defined
31
- locator {} not a meaningful Hash or String
32
- menu {} not properly defined (must be { :food_type => \'a string\' | true | false })
22
+ element(:bad_required_flad):
23
+ locator nil not a meaningful Hash or String
24
+ required flag "a string" not a true | false
25
+ element(""):
26
+ element "" already defined
27
+ label "" not a Symbol
28
+ locator nil not a meaningful Hash or String
29
+ menu {:fresh_food=>[]} not properly defined (must be { :food_type => \'a string\' | true | false })
30
+ element(:e):
31
+ element :e already defined
32
+ menu {"a string"=>"another string"} not properly defined (must be { :food_type => \'a string\' | true | false })
33
+ element(:e):
34
+ element :e already defined
35
+ locator {} not a meaningful Hash or String
36
+ element(""):
37
+ element "" already defined
38
+ label "" not a Symbol
39
+ locator nil not a meaningful Hash or String
40
+ element(:some_table):
41
+ locator nil not a meaningful Hash or String
33
42
  action(""):
34
43
  label "" not a Symbol
35
44
  next_page "a string" not a Symbol
@@ -41,11 +50,7 @@ alias(""):
41
50
  action "unknown action" not known Action
42
51
  validator(""):
43
52
  label "" not a Symbol
44
- table(""):
45
- label "" not a Symbol
46
- locator nil not a meaningful Hash or String
47
53
  table(:some_table):
48
- locator nil not a meaningful Hash or String
49
54
  header [] not a meaningful Array
50
55
  pagination(""):
51
56
  label "" not a Symbol
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe "page_object.press_xxx" do
4
+ context "browser is closed" do
5
+ it "raises PageObjectWrapper::BrowserNotFound" do
6
+ tp = PageObjectWrapper.receive_page(:some_test_page)
7
+ expect{ tp.press_standalone_cool_button }.to raise_error(PageObjectWrapper::BrowserNotFound)
8
+ end
9
+ end
10
+
11
+ context "browser is opened" do
12
+ before(:all){
13
+ @b = Watir::Browser.new
14
+ PageObjectWrapper.use_browser @b
15
+ }
16
+ before(:each){ @tp = PageObjectWrapper.open_page(:some_test_page) }
17
+ after(:all){ PageObjectWrapper.browser.quit }
18
+ let(:tp){ PageObjectWrapper.current_page }
19
+
20
+ context "xxx not found among current_page elements" do
21
+ it "raises NoMethodError" do
22
+ expect{ tp.press_nonexistent_element }.to raise_error(NoMethodError)
23
+ end
24
+ end
25
+
26
+ context "element does not respond to user action" do
27
+ it "raises InvalidElement error" do
28
+ expect{ tp.press_invalid_press_action_button }.to raise_error(PageObjectWrapper::InvalidElement)
29
+ end
30
+ end
31
+
32
+ context "element does not present" do
33
+ it "raises InvalidElement error" do
34
+ expect{ tp.press_invalid_button }.to raise_error(PageObjectWrapper::InvalidElement)
35
+ end
36
+ end
37
+
38
+ context "basic usage" do
39
+
40
+ it "returns pressed watir element" do
41
+ tp.press_cool_button.should be_a Watir::Button
42
+ end
43
+
44
+ it "really presses the element" do
45
+ tp.press_standalone_cool_button_with_default_press_action
46
+ PageObjectWrapper.current_page?(:test_page_with_table).should be_true
47
+ end
48
+
49
+ it "presses with user defined action" do
50
+ tp.press_standalone_cool_button
51
+ PageObjectWrapper.current_page?(:test_page_with_table).should be_true
52
+ end
53
+
54
+ it "presses element inside an elements_set" do
55
+ tp.press_cool_button
56
+ PageObjectWrapper.current_page?(:test_page_with_table).should be_true
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe "page_object required elements" do
4
+ describe "required elements are checked during .open_page" do
5
+
6
+ context "browser is closed" do
7
+ it "raises PageObjectWrapper::BrowserNotFound" do
8
+ tp = PageObjectWrapper.receive_page(:some_test_page)
9
+ expect{ PageObjectWrapper.open_page :some_test_page }.to raise_error(PageObjectWrapper::BrowserNotFound)
10
+ end
11
+ end
12
+
13
+ context "browser is opened" do
14
+ before(:all){
15
+ @b = Watir::Browser.new
16
+ PageObjectWrapper.use_browser @b
17
+ }
18
+
19
+ after(:all){ PageObjectWrapper.browser.quit }
20
+
21
+ context "one of required elements not found" do
22
+ it "raises UnmappedPageObject error" do
23
+ expect{ PageObjectWrapper.open_page :required_missing }.to raise_error(PageObjectWrapper::UnmappedPageObject)
24
+ end
25
+ end
26
+
27
+ context "one of uniq elements not found" do
28
+ it "raises UnmappedPageObject error" do
29
+ expect{ PageObjectWrapper.open_page :uniq_missing }.to raise_error(PageObjectWrapper::UnmappedPageObject)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "required elements are checked during .current_page?" do
36
+ context "browser is closed" do
37
+ it "raises PageObjectWrapper::BrowserNotFound" do
38
+ tp = PageObjectWrapper.receive_page(:some_test_page)
39
+ expect{ PageObjectWrapper.current_page? :some_test_page }.to raise_error(Watir::Exception::Error)
40
+ end
41
+ end
42
+
43
+ context "browser is opened" do
44
+ before(:all){
45
+ @b = Watir::Browser.new
46
+ PageObjectWrapper.use_browser @b
47
+ }
48
+
49
+ after(:all){ PageObjectWrapper.browser.quit }
50
+ before(:all){ PageObjectWrapper.open_page :some_test_page }
51
+
52
+ context "one of required elements not found" do
53
+ it "raises UnmappedPageObject error" do
54
+ expect{ PageObjectWrapper.current_page? :required_missing }.to raise_error(PageObjectWrapper::UnmappedPageObject)
55
+ end
56
+ end
57
+
58
+ context "one of uniq elements not found" do
59
+ it "raises UnmappedPageObject error" do
60
+ expect{ PageObjectWrapper.current_page? :uniq_missing }.to raise_error(PageObjectWrapper::UnmappedPageObject)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
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.7
4
+ version: 1.4.0
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: 2013-03-10 00:00:00.000000000 Z
12
+ date: 2013-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &20221960 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
24
+ version_requirements: *20221960
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: activesupport
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &20221520 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0'
38
33
  type: :runtime
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
35
+ version_requirements: *20221520
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: babosa
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &20220960 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ! '>='
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: '0'
54
44
  type: :runtime
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
46
+ version_requirements: *20220960
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: rspec
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &20220180 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: 2.0.0
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: 2.0.0
57
+ version_requirements: *20220180
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: debugger
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &20219440 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
@@ -85,12 +65,7 @@ dependencies:
85
65
  version: '0'
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
68
+ version_requirements: *20219440
94
69
  description: Wraps watir-webdriver with convenient testing interface, based on PageObjects
95
70
  automation testing pattern. Simplifies resulting automated test understanding.
96
71
  email:
@@ -111,9 +86,11 @@ files:
111
86
  - good_pages/google_wrong_uniq_page.rb
112
87
  - good_pages/goole_as_page.rb
113
88
  - good_pages/pagination_example_page.rb
89
+ - good_pages/required_missing_page.rb
114
90
  - good_pages/some_test_page.html
115
91
  - good_pages/some_test_page.rb
116
92
  - good_pages/test_table_page.rb
93
+ - good_pages/uniq_missing_page.rb
117
94
  - img/scheme.png
118
95
  - lib/page_object_wrapper.rb
119
96
  - lib/page_object_wrapper/Action.rb
@@ -136,6 +113,8 @@ files:
136
113
  - spec/load_spec.rb
137
114
  - spec/menu_xxx_spec.rb
138
115
  - spec/open_page_spec.rb
116
+ - spec/press_xxx_spec.rb
117
+ - spec/required_elements_spec.rb
139
118
  - spec/select_from_xxx_spec.rb
140
119
  - spec/shared_examples.rb
141
120
  - spec/spec_helper.rb
@@ -163,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
142
  version: '0'
164
143
  requirements: []
165
144
  rubyforge_project:
166
- rubygems_version: 1.8.25
145
+ rubygems_version: 1.8.15
167
146
  signing_key:
168
147
  specification_version: 3
169
148
  summary: Wraps watir-webdriver with convenient testing interface.
@@ -175,6 +154,8 @@ test_files:
175
154
  - spec/load_spec.rb
176
155
  - spec/menu_xxx_spec.rb
177
156
  - spec/open_page_spec.rb
157
+ - spec/press_xxx_spec.rb
158
+ - spec/required_elements_spec.rb
178
159
  - spec/select_from_xxx_spec.rb
179
160
  - spec/shared_examples.rb
180
161
  - spec/spec_helper.rb