page-object 1.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c96b938e70722ef3112ed42848c96a2fd3dbf39
4
- data.tar.gz: 15af3e8cc3af7f269dcacecf24d6f1b38fcb9f9e
3
+ metadata.gz: 386482bc19d329a8cd1189c91a689fca46fc9a8e
4
+ data.tar.gz: cb8e35e8ec52b8b5e776d9122ef7d7e02ce4e14d
5
5
  SHA512:
6
- metadata.gz: 99435b3c59bac3889037dca32b76ef15c3f90472855e06e7ea06b816a91e0d7ea82c07edd8f026f3514b1e15739b15f5a6363df9d8bca7fc834eb104243b4df5
7
- data.tar.gz: e760b232a4f41f862a719585061513902f3b345dd4cd40dba732dd77d4b427bf634fe85059fdcb3c38f150de65063d8d537d595695414b9c96cb1b59eb3e72da
6
+ metadata.gz: b061306394d35e32ca3c44a18b27ee3909c0d8cdd983debbe3d0e0307d55707bf2f4b2b8386cbef267f7becc2da53e83ff78e1e12d56f50f03d116ad552ffe89
7
+ data.tar.gz: e8373204c8b363185d094987ffa51e1d2518281b38ffddd6ebd868192e1fa48b07686a0829549db31223bc1086b376823c106c411cd90f33c10903a5897db749
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format Fuubar
2
+ --format documentation
data/ChangeLog CHANGED
@@ -1,3 +1,10 @@
1
+ === Version 1.0.1
2
+ * Enhancements
3
+ * Checks the name of generated methods to ensure they do not colide with existing page-object methods
4
+ * Removed old legacy css code and now delegate everything to Watir
5
+ * Fixes
6
+ * Added support for dynamically finding elements inside iframes (Thanks Justin Ko)
7
+
1
8
  === Version 1.0 / 2014-6-1
2
9
  * Enhancements
3
10
  * Better support for using Regexp
@@ -48,6 +48,11 @@ Feature: Handling frames
48
48
  When I type "page-object" into the text field from frame 1 identified dynamically
49
49
  Then I should verify "page-object" in the text field for frame 1 identified dynamically
50
50
 
51
+ Scenario: Identifying items in iframes at runtime
52
+ Given I am on the iframe elements page
53
+ When I type "page-object" into the text field from iframe 1 identified dynamically
54
+ Then I should verify "page-object" in the text field for iframe 1 identified dynamically
55
+
51
56
  Scenario: Handling alerts inside frames
52
57
  Given I am on the frame elements page
53
58
  When I trigger an alert within a frame
@@ -220,7 +220,7 @@ end
220
220
  class DoubleClickPage
221
221
  include PageObject
222
222
  button(:click)
223
- paragraph(:text)
223
+ paragraph(:p_text)
224
224
  end
225
225
 
226
226
  Given /^I am on the Double Click page$/ do
@@ -233,7 +233,7 @@ When /^I double click the button$/ do
233
233
  end
234
234
 
235
235
  Then /^the paragraph should read "([^\"]*)"$/ do |expected_text|
236
- @page.text.should == expected_text
236
+ @page.p_text.should == expected_text
237
237
  end
238
238
 
239
239
  When /^I scroll the heading element into view$/ do
@@ -119,6 +119,18 @@ Then /^I should verify "([^\"]*)" in the text field for frame 1 identified dynam
119
119
  end
120
120
  end
121
121
 
122
+ When /^I type "([^\"]*)" into the text field from iframe 1 identified dynamically$/ do |value|
123
+ @page.in_iframe(:id => 'frame_one_1') do |frame|
124
+ @page.text_field_element(:name => 'senderElement', :frame => frame).value = value
125
+ end
126
+ end
127
+
128
+ Then /^I should verify "([^\"]*)" in the text field for iframe 1 identified dynamically$/ do |value|
129
+ @page.in_iframe(:id => 'frame_one_1') do |frame|
130
+ @page.text_field_element(:name => 'senderElement', :frame => frame).value.should == value
131
+ end
132
+ end
133
+
122
134
  When /^I trigger an alert within a frame$/ do
123
135
  @page.in_frame(:id => 'frame_three_3') do |frame|
124
136
  @msg = @page.alert(frame) do
@@ -1,3 +1,13 @@
1
+
2
+ def class_exists?(class_name)
3
+ begin
4
+ klass = Module.const_get(class_name)
5
+ return klass.is_a?(Class)
6
+ rescue NameError
7
+ return false
8
+ end
9
+ end
10
+
1
11
  Given /^I am on the Gxt Examples page$/ do
2
12
  visit GxtSamplePageObject
3
13
  end
@@ -28,9 +38,9 @@ When /^I define a page-object using that widget$/ do
28
38
 
29
39
  page_url "http://gxtexamplegallery.appspot.com/"
30
40
 
31
- div(:basic_grid, :class => "label_basic_grid")
41
+ div(:basic_grid, :class => "label_basic_grid")
32
42
  gxt_table(:gxt_table, :class => "x-grid3")
33
- end
43
+ end unless class_exists? 'GxtSamplePageObject'
34
44
  end
35
45
 
36
46
  When /^I have registered the GxtTable with PageObject$/ do
@@ -1,20 +1,24 @@
1
1
  class IndexedPropertyPage
2
2
  include PageObject
3
3
 
4
- indexed_property :table, [[:text_field, :text, {:id => 'table[%s].text'}],
4
+ indexed_property :table, [[:text_field, :text_table, {:id => 'table[%s].text'}],
5
5
  [:text_field, :text_name, {:name => 'tableName[%s].text'}],
6
6
  [:radio_button, :radio, {:id => 'table[%s].radio'}],
7
7
  [:checkbox, :check, {:id => 'table[%s].check'}],
8
8
  [:text_area, :area, {:id => 'table[%s].area'}],
9
9
  [:button, :button, {:id => 'table[%s].button'}]]
10
10
 
11
- indexed_property :nottable, [[:text_field, :text, {:id => 'nottable[%s].text'}]]
11
+ indexed_property :nottable, [[:text_field, :text_nottable, {:id => 'nottable[%s].text'}]]
12
12
 
13
13
  end
14
14
 
15
+ def page
16
+ @page ||= IndexedPropertyPage.new(@browser)
17
+ end
18
+
15
19
  Given /^I am on the indexed property page$/ do
16
- @page = IndexedPropertyPage.new(@browser)
17
- @page.navigate_to(UrlHelper.indexed)
20
+ # @page = IndexedPropertyPage.new(@browser)
21
+ page.navigate_to(UrlHelper.indexed)
18
22
  end
19
23
 
20
24
  When /^I search for the elements for index "([^\"]*)"$/ do |index|
@@ -22,58 +26,58 @@ When /^I search for the elements for index "([^\"]*)"$/ do |index|
22
26
  end
23
27
 
24
28
  Then /^I type "([^\"]*)" into the table's indexed text field by id$/ do |val|
25
- @page.table[@index].text = val
29
+ page.table[@index].text_table = val
26
30
  end
27
31
 
28
32
  Then /^The table's indexed text field by id should contain "([^\"]*)"$/ do |val|
29
- @page.table[@index].text.should == val
33
+ page.table[@index].text_table.should == val
30
34
  end
31
35
 
32
36
  Then /^I type "([^\"]*)" into the table's indexed text field by name$/ do |val|
33
- @page.table[@index].text_name = val
37
+ page.table[@index].text_name = val
34
38
  end
35
39
 
36
40
  Then /^The table's indexed text field by name should contain "([^\"]*)"$/ do |val|
37
- @page.table[@index].text_name.should == val
41
+ page.table[@index].text_name.should == val
38
42
  end
39
43
 
40
44
  Then /^I select the indexed radio button$/ do
41
- @page.table[@index].select_radio
45
+ page.table[@index].select_radio
42
46
  end
43
47
 
44
48
  Then /^The indexed radio button should be selected$/ do
45
- @page.table[@index].radio_selected?.should == true
49
+ page.table[@index].radio_selected?.should == true
46
50
  end
47
51
 
48
52
  Then /^I check the indexed checkbox$/ do
49
- @page.table[@index].check_check
53
+ page.table[@index].check_check
50
54
  end
51
55
 
52
56
  Then /^The indexed checkbox should be checked$/ do
53
- @page.table[@index].check_checked?.should == true
57
+ page.table[@index].check_checked?.should == true
54
58
  end
55
59
 
56
60
  Then /^I type "([^\"]*)" into the table's indexed text area$/ do |val|
57
- @page.table[@index].area = val
61
+ page.table[@index].area = val
58
62
  end
59
63
 
60
64
  Then /^The table's indexed text area should contain "([^\"]*)"$/ do |val|
61
- @page.table[@index].area.should == val
65
+ page.table[@index].area.should == val
62
66
  end
63
67
 
64
68
  Then /^I should see that the indexed button exists$/ do
65
- @page.table[@index].button?.should == true
69
+ page.table[@index].button?.should == true
66
70
  end
67
71
 
68
72
  Then /^I should be able to click the indexed button$/ do
69
- @page.table[@index].button
73
+ page.table[@index].button
70
74
  end
71
75
 
72
76
  Then /^I type "([^\"]*)" into the regular indexed text field by id$/ do |val|
73
- @page.nottable[@index].text = val
77
+ page.nottable[@index].text_nottable = val
74
78
  end
75
79
 
76
80
  Then /^The regular indexed text field by id should contain "([^\"]*)"$/ do |val|
77
- @page.nottable[@index].text.should == val
81
+ page.nottable[@index].text_nottable.should == val
78
82
  end
79
83
 
@@ -28,7 +28,6 @@ class Page
28
28
  text_area(:text_area_css, :css => ".text_area_class")
29
29
  text_area(:text_area_name, :name => "text_area_name")
30
30
  text_area(:text_area_xpath, :xpath => "//textarea")
31
- text_area(:text_area_css, :css => "textarea")
32
31
  text_area(:text_area_tag_name, :tag_name => "textarea")
33
32
  text_area(:text_area_index, :index => 0)
34
33
  text_area(:text_area_text, :text => "")
@@ -42,7 +41,6 @@ class Page
42
41
  hidden_field(:hidden_field_css, :css => ".hidden_field_class")
43
42
  hidden_field(:hidden_field_name, :name => "hidden_field_name")
44
43
  hidden_field(:hidden_field_xpath, :xpath => "//input[@type='hidden']")
45
- hidden_field(:hidden_field_css, :css => "input[type='hidden']")
46
44
  hidden_field(:hidden_field_tag_name, :tag_name => "input[type='hidden']")
47
45
  hidden_field(:hidden_field_index, :index => 0)
48
46
  hidden_field(:hidden_field_text, :text => "")
@@ -60,7 +58,6 @@ class Page
60
58
  link(:google_search_href, :href => "success.html")
61
59
  link(:google_search_text, :text => "Google Search")
62
60
  link(:google_search_index, :index => 0)
63
- link(:google_search_css, :css => "a.link_class")
64
61
  link(:google_search_title, :title => "link_title")
65
62
 
66
63
  select_list(:sel_list_id, :id => "sel_list_id")
@@ -112,7 +109,6 @@ class Page
112
109
  div(:div_title, :title => 'div_title')
113
110
  div(:div_class_index, :class => "div_class", :index => 0)
114
111
  div(:div_name_index, :name => "div_name", :index => 0)
115
- div(:div_css, :css => ".div_class")
116
112
 
117
113
  div(:div_data_entity, :data_entity => "test")
118
114
 
@@ -155,7 +151,6 @@ class Page
155
151
  button(:button_xpath, :xpath=> "//input[@type='submit']")
156
152
  button(:button_text, :text => 'Click Me')
157
153
  button(:button_value, :value => 'Click Me')
158
- button(:button_css, :css => "input[type='submit']")
159
154
  button(:button_class_index, :class => "button_class", :index => 0)
160
155
  button(:button_name_index, :name => "button_name", :index => 0)
161
156
 
data/lib/page-object.rb CHANGED
@@ -260,7 +260,7 @@ module PageObject
260
260
  end
261
261
 
262
262
  #
263
- # Identify an element as existing within a frame or iframe. A frame parameter
263
+ # Identify an element as existing within a frame. A frame parameter
264
264
  # is passed to the block and must be passed to the other calls to PageObject.
265
265
  # You can nest calls to in_frame by passing the frame to the next level.
266
266
  #
@@ -281,6 +281,27 @@ module PageObject
281
281
  platform.in_frame(identifier, frame, &block)
282
282
  end
283
283
 
284
+ # Identify an element as existing within an iframe. A frame parameter
285
+ # is passed to the block and must be passed to the other calls to PageObject.
286
+ # You can nest calls to in_iframe by passing the frame to the next level.
287
+ #
288
+ # @example
289
+ # in_iframe(:id => 'iframe_id') do |iframe|
290
+ # text_field_element(:id => 'ifname', :frame => iframe)
291
+ # end
292
+ #
293
+ # @param [Hash] identifier how we find the iframe. The valid keys are:
294
+ # * :id => Watir and Selenium
295
+ # * :index => Watir and Selenium
296
+ # * :name => Watir and Selenium
297
+ # * :class => Watir only
298
+ # @param frame passed from a previous call to in_iframe. Used to nest calls
299
+ # @param block that contains the calls to elements that exist inside the iframe.
300
+ #
301
+ def in_iframe(identifier, frame=nil, &block)
302
+ platform.in_iframe(identifier, frame, &block)
303
+ end
304
+
284
305
  #
285
306
  # Override the normal showModalDialog call is it opens a window instead
286
307
  # of a dialog. You will need to attach to the new window in order to
@@ -209,7 +209,8 @@ module PageObject
209
209
  # * :xpath => Watir and Selenium
210
210
  # @param optional block to be invoked when element method is called
211
211
  #
212
- def text_field(name, identifier={:index => 0}, &block)
212
+ def text_field(name, identifier={:index => 0}, &block)
213
+ standard_methods(name, identifier, 'text_field_for', &block)
213
214
  define_method(name) do
214
215
  return platform.text_field_value_for identifier.clone unless block_given?
215
216
  self.send("#{name}_element").value
@@ -218,7 +219,6 @@ module PageObject
218
219
  return platform.text_field_value_set(identifier.clone, value) unless block_given?
219
220
  self.send("#{name}_element").value = value
220
221
  end
221
- standard_methods(name, identifier, 'text_field_for', &block)
222
222
  end
223
223
 
224
224
  #
@@ -244,11 +244,11 @@ module PageObject
244
244
  # @param optional block to be invoked when element method is called
245
245
  #
246
246
  def hidden_field(name, identifier={:index => 0}, &block)
247
+ standard_methods(name, identifier, 'hidden_field_for', &block)
247
248
  define_method(name) do
248
249
  return platform.hidden_field_value_for identifier.clone unless block_given?
249
250
  self.send("#{name}_element").value
250
251
  end
251
- standard_methods(name, identifier, 'hidden_field_for', &block)
252
252
  end
253
253
  alias_method :hidden, :hidden_field
254
254
 
@@ -275,6 +275,7 @@ module PageObject
275
275
  # @param optional block to be invoked when element method is called
276
276
  #
277
277
  def text_area(name, identifier={:index => 0}, &block)
278
+ standard_methods(name, identifier, 'text_area_for', &block)
278
279
  define_method(name) do
279
280
  return platform.text_area_value_for identifier.clone unless block_given?
280
281
  self.send("#{name}_element").value
@@ -283,7 +284,6 @@ module PageObject
283
284
  return platform.text_area_value_set(identifier.clone, value) unless block_given?
284
285
  self.send("#{name}_element").value = value
285
286
  end
286
- standard_methods(name, identifier, 'text_area_for', &block)
287
287
  end
288
288
  alias_method :textarea, :text_area
289
289
 
@@ -313,6 +313,7 @@ module PageObject
313
313
  # @param optional block to be invoked when element method is called
314
314
  #
315
315
  def select_list(name, identifier={:index => 0}, &block)
316
+ standard_methods(name, identifier, 'select_list_for', &block)
316
317
  define_method(name) do
317
318
  return platform.select_list_value_for identifier.clone unless block_given?
318
319
  self.send("#{name}_element").value
@@ -321,13 +322,10 @@ module PageObject
321
322
  return platform.select_list_value_set(identifier.clone, value) unless block_given?
322
323
  self.send("#{name}_element").select(value)
323
324
  end
324
-
325
325
  define_method("#{name}_options") do
326
326
  element = self.send("#{name}_element")
327
327
  (element && element.options) ? element.options.collect(&:text) : []
328
328
  end
329
-
330
- standard_methods(name, identifier, 'select_list_for', &block)
331
329
  end
332
330
  alias_method :select, :select_list
333
331
 
@@ -357,11 +355,11 @@ module PageObject
357
355
  # @param optional block to be invoked when element method is called
358
356
  #
359
357
  def link(name, identifier={:index => 0}, &block)
358
+ standard_methods(name, identifier, 'link_for', &block)
360
359
  define_method(name) do
361
360
  return platform.click_link_for identifier.clone unless block_given?
362
361
  self.send("#{name}_element").click
363
362
  end
364
- standard_methods(name, identifier, 'link_for', &block)
365
363
  end
366
364
  alias_method :a, :link
367
365
 
@@ -390,6 +388,7 @@ module PageObject
390
388
  # @param optional block to be invoked when element method is called
391
389
  #
392
390
  def checkbox(name, identifier={:index => 0}, &block)
391
+ standard_methods(name, identifier, 'checkbox_for', &block)
393
392
  define_method("check_#{name}") do
394
393
  return platform.check_checkbox(identifier.clone) unless block_given?
395
394
  self.send("#{name}_element").check
@@ -402,7 +401,6 @@ module PageObject
402
401
  return platform.checkbox_checked?(identifier.clone) unless block_given?
403
402
  self.send("#{name}_element").checked?
404
403
  end
405
- standard_methods(name, identifier, 'checkbox_for', &block)
406
404
  end
407
405
 
408
406
  #
@@ -431,6 +429,7 @@ module PageObject
431
429
  # @param optional block to be invoked when element method is called
432
430
  #
433
431
  def radio_button(name, identifier={:index => 0}, &block)
432
+ standard_methods(name, identifier, 'radio_button_for', &block)
434
433
  define_method("select_#{name}") do
435
434
  return platform.select_radio(identifier.clone) unless block_given?
436
435
  self.send("#{name}_element").select
@@ -443,7 +442,6 @@ module PageObject
443
442
  return platform.radio_selected?(identifier.clone) unless block_given?
444
443
  self.send("#{name}_element").selected?
445
444
  end
446
- standard_methods(name, identifier, 'radio_button_for', &block)
447
445
  end
448
446
  alias_method :radio, :radio_button
449
447
 
@@ -468,6 +466,7 @@ module PageObject
468
466
  # * :name => Watir and Selenium
469
467
  #
470
468
  def radio_button_group(name, identifier)
469
+ check_name(name)
471
470
  define_method("select_#{name}") do |value|
472
471
  platform.radio_buttons_for(identifier.clone).each do |radio_elem|
473
472
  if radio_elem.value == value
@@ -521,11 +520,11 @@ module PageObject
521
520
  # @param optional block to be invoked when element method is called
522
521
  #
523
522
  def button(name, identifier={:index => 0}, &block)
523
+ standard_methods(name, identifier, 'button_for', &block)
524
524
  define_method(name) do
525
525
  return platform.click_button_for identifier.clone unless block_given?
526
526
  self.send("#{name}_element").click
527
527
  end
528
- standard_methods(name, identifier, 'button_for', &block)
529
528
  end
530
529
 
531
530
  #
@@ -550,11 +549,11 @@ module PageObject
550
549
  # @param optional block to be invoked when element method is called
551
550
  #
552
551
  def div(name, identifier={:index => 0}, &block)
552
+ standard_methods(name, identifier, 'div_for', &block)
553
553
  define_method(name) do
554
554
  return platform.div_text_for identifier.clone unless block_given?
555
555
  self.send("#{name}_element").text
556
556
  end
557
- standard_methods(name, identifier, 'div_for', &block)
558
557
  end
559
558
 
560
559
  #
@@ -579,11 +578,11 @@ module PageObject
579
578
  # @param optional block to be invoked when element method is called
580
579
  #
581
580
  def span(name, identifier={:index => 0}, &block)
581
+ standard_methods(name, identifier, 'span_for', &block)
582
582
  define_method(name) do
583
583
  return platform.span_text_for identifier.clone unless block_given?
584
584
  self.send("#{name}_element").text
585
585
  end
586
- standard_methods(name, identifier, 'span_for', &block)
587
586
  end
588
587
 
589
588
  #
@@ -608,11 +607,11 @@ module PageObject
608
607
  # @param optional block to be invoked when element method is called
609
608
  #
610
609
  def table(name, identifier={:index => 0}, &block)
610
+ standard_methods(name, identifier, 'table_for', &block)
611
611
  define_method(name) do
612
612
  return platform.table_text_for identifier.clone unless block_given?
613
613
  self.send("#{name}_element").text
614
614
  end
615
- standard_methods(name, identifier, 'table_for', &block)
616
615
  end
617
616
 
618
617
  #
@@ -638,11 +637,11 @@ module PageObject
638
637
  # @param optional block to be invoked when element method is called
639
638
  #
640
639
  def cell(name, identifier={:index => 0}, &block)
640
+ standard_methods(name, identifier, 'cell_for', &block)
641
641
  define_method("#{name}") do
642
642
  return platform.cell_text_for identifier.clone unless block_given?
643
643
  self.send("#{name}_element").text
644
644
  end
645
- standard_methods(name, identifier, 'cell_for', &block)
646
645
  end
647
646
  alias_method :td, :cell
648
647
 
@@ -717,11 +716,11 @@ module PageObject
717
716
  # @param optional block to be invoked when element method is called
718
717
  #
719
718
  def list_item(name, identifier={:index => 0}, &block)
719
+ standard_methods(name, identifier, 'list_item_for', &block)
720
720
  define_method(name) do
721
721
  return platform.list_item_text_for identifier.clone unless block_given?
722
722
  self.send("#{name}_element").text
723
723
  end
724
- standard_methods(name, identifier, 'list_item_for', &block)
725
724
  end
726
725
  alias_method :li, :list_item
727
726
 
@@ -746,11 +745,11 @@ module PageObject
746
745
  # @param optional block to be invoked when element method is called
747
746
  #
748
747
  def unordered_list(name, identifier={:index => 0}, &block)
748
+ standard_methods(name, identifier, 'unordered_list_for', &block)
749
749
  define_method(name) do
750
750
  return platform.unordered_list_text_for identifier.clone unless block_given?
751
751
  self.send("#{name}_element").text
752
752
  end
753
- standard_methods(name, identifier, 'unordered_list_for', &block)
754
753
  end
755
754
  alias_method :ul, :unordered_list
756
755
 
@@ -775,11 +774,11 @@ module PageObject
775
774
  # @param optional block to be invoked when element method is called
776
775
  #
777
776
  def ordered_list(name, identifier={:index => 0}, &block)
777
+ standard_methods(name, identifier, 'ordered_list_for', &block)
778
778
  define_method(name) do
779
779
  return platform.ordered_list_text_for identifier.clone unless block_given?
780
780
  self.send("#{name}_element").text
781
781
  end
782
- standard_methods(name, identifier, 'ordered_list_for', &block)
783
782
  end
784
783
  alias_method :ol, :ordered_list
785
784
 
@@ -803,11 +802,11 @@ module PageObject
803
802
  # @param optional block to be invoked when element method is called
804
803
  #
805
804
  def h1(name, identifier={:index => 0}, &block)
805
+ standard_methods(name, identifier,'h1_for', &block)
806
806
  define_method(name) do
807
807
  return platform.h1_text_for identifier.clone unless block_given?
808
808
  self.send("#{name}_element").text
809
809
  end
810
- standard_methods(name, identifier,'h1_for', &block)
811
810
  end
812
811
 
813
812
  #
@@ -830,11 +829,11 @@ module PageObject
830
829
  # @param optional block to be invoked when element method is called
831
830
  #
832
831
  def h2(name, identifier={:index => 0}, &block)
832
+ standard_methods(name, identifier, 'h2_for', &block)
833
833
  define_method(name) do
834
834
  return platform.h2_text_for identifier.clone unless block_given?
835
835
  self.send("#{name}_element").text
836
836
  end
837
- standard_methods(name, identifier, 'h2_for', &block)
838
837
  end
839
838
 
840
839
  #
@@ -857,11 +856,11 @@ module PageObject
857
856
  # @param optional block to be invoked when element method is called
858
857
  #
859
858
  def h3(name, identifier={:index => 0}, &block)
859
+ standard_methods(name, identifier, 'h3_for', &block)
860
860
  define_method(name) do
861
861
  return platform.h3_text_for identifier.clone unless block_given?
862
862
  self.send("#{name}_element").text
863
863
  end
864
- standard_methods(name, identifier, 'h3_for', &block)
865
864
  end
866
865
 
867
866
  #
@@ -884,11 +883,11 @@ module PageObject
884
883
  # @param optional block to be invoked when element method is called
885
884
  #
886
885
  def h4(name, identifier={:index => 0}, &block)
886
+ standard_methods(name, identifier, 'h4_for', &block)
887
887
  define_method(name) do
888
888
  return platform.h4_text_for identifier.clone unless block_given?
889
889
  self.send("#{name}_element").text
890
890
  end
891
- standard_methods(name, identifier, 'h4_for', &block)
892
891
  end
893
892
 
894
893
  #
@@ -911,11 +910,11 @@ module PageObject
911
910
  # @param optional block to be invoked when element method is called
912
911
  #
913
912
  def h5(name, identifier={:index => 0}, &block)
913
+ standard_methods(name, identifier, 'h5_for', &block)
914
914
  define_method(name) do
915
915
  return platform.h5_text_for identifier.clone unless block_given?
916
916
  self.send("#{name}_element").text
917
917
  end
918
- standard_methods(name, identifier, 'h5_for', &block)
919
918
  end
920
919
 
921
920
  #
@@ -938,11 +937,11 @@ module PageObject
938
937
  # @param optional block to be invoked when element method is called
939
938
  #
940
939
  def h6(name, identifier={:index => 0}, &block)
940
+ standard_methods(name, identifier, 'h6_for', &block)
941
941
  define_method(name) do
942
942
  return platform.h6_text_for identifier.clone unless block_given?
943
943
  self.send("#{name}_element").text
944
944
  end
945
- standard_methods(name, identifier, 'h6_for', &block)
946
945
  end
947
946
 
948
947
  #
@@ -965,11 +964,11 @@ module PageObject
965
964
  # @param optional block to be invoked when element method is called
966
965
  #
967
966
  def paragraph(name, identifier={:index => 0}, &block)
967
+ standard_methods(name, identifier, 'paragraph_for', &block)
968
968
  define_method(name) do
969
969
  return platform.paragraph_text_for identifier.clone unless block_given?
970
970
  self.send("#{name}_element").text
971
971
  end
972
- standard_methods(name, identifier, 'paragraph_for', &block)
973
972
  end
974
973
  alias_method :p, :paragraph
975
974
 
@@ -995,11 +994,11 @@ module PageObject
995
994
  # @param optional block to be invoked when element method is called
996
995
  #
997
996
  def file_field(name, identifier={:index => 0}, &block)
997
+ standard_methods(name, identifier, 'file_field_for', &block)
998
998
  define_method("#{name}=") do |value|
999
999
  return platform.file_field_value_set(identifier.clone, value) unless block_given?
1000
1000
  self.send("#{name}_element").value = value
1001
1001
  end
1002
- standard_methods(name, identifier, 'file_field_for', &block)
1003
1002
  end
1004
1003
 
1005
1004
  #
@@ -1023,11 +1022,11 @@ module PageObject
1023
1022
  # @param optional block to be invoked when element method is called
1024
1023
  #
1025
1024
  def label(name, identifier={:index => 0}, &block)
1025
+ standard_methods(name, identifier, 'label_for', &block)
1026
1026
  define_method(name) do
1027
1027
  return platform.label_text_for identifier.clone unless block_given?
1028
1028
  self.send("#{name}_element").text
1029
1029
  end
1030
- standard_methods(name, identifier, 'label_for', &block)
1031
1030
  end
1032
1031
 
1033
1032
  #
@@ -1051,11 +1050,11 @@ module PageObject
1051
1050
  # @param optional block to be invoked when element method is called
1052
1051
  #
1053
1052
  def area(name, identifier={:index => 0}, &block)
1053
+ standard_methods(name, identifier, 'area_for', &block)
1054
1054
  define_method(name) do
1055
1055
  return platform.click_area_for identifier.clone unless block_given?
1056
1056
  self.send("#{name}_element").click
1057
1057
  end
1058
- standard_methods(name, identifier, 'area_for', &block)
1059
1058
  end
1060
1059
 
1061
1060
  #
@@ -1172,6 +1171,7 @@ module PageObject
1172
1171
  # @param optional block to be invoked when element method is called
1173
1172
  #
1174
1173
  def element(name, tag, identifier={:index => 0}, &block)
1174
+ check_name(name)
1175
1175
  define_method("#{name}") do
1176
1176
  self.send("#{name}_element").text
1177
1177
  end
@@ -1205,6 +1205,7 @@ module PageObject
1205
1205
  # @param optional block to be invoked when element method is called
1206
1206
  #
1207
1207
  def elements(name, tag, identifier={:index => 0}, &block)
1208
+ check_name(name)
1208
1209
  define_method("#{name}_elements") do
1209
1210
  return call_block(&block) if block_given?
1210
1211
  platform.elements_for(tag, identifier.clone)
@@ -1245,6 +1246,7 @@ module PageObject
1245
1246
  end
1246
1247
 
1247
1248
  def standard_methods(name, identifier, method, &block)
1249
+ check_name(name)
1248
1250
  define_method("#{name}_element") do
1249
1251
  return call_block(&block) if block_given?
1250
1252
  platform.send(method, identifier.clone)
@@ -1313,5 +1315,8 @@ module PageObject
1313
1315
  end
1314
1316
  end
1315
1317
 
1318
+ def check_name(name)
1319
+ raise NameError, "Identifier '#{name}' conflicts with page-object method of the same name" if self.instance_methods.include? name
1320
+ end
1316
1321
  end
1317
1322
  end
@@ -15,7 +15,7 @@ module PageObject
15
15
  how_and_what.each do |key, value|
16
16
  how_and_what[key] = value % index
17
17
  end
18
- self.class.send type, name, how_and_what
18
+ self.class.send type, name, how_and_what unless self.class.instance_methods.include? name
19
19
  end
20
20
  end
21
21
  end
@@ -34,4 +34,4 @@ module PageObject
34
34
  end
35
35
  end
36
36
  end
37
- end
37
+ end
@@ -941,32 +941,8 @@ module PageObject
941
941
 
942
942
  private
943
943
 
944
- def move_element_to_css_selector(the_call, identifier)
945
- valid_elements = %w(
946
- area audio canvas div
947
- h1 h2 h3 h4 h5 h6
948
- label li p span td video
949
- )
950
- element = the_call.split('(').first
951
- if identifier.keys.include?(:css) and valid_elements.include? element
952
- the_call[element] = 'element'
953
- selectors = identifier[:css].split(/,\s*/).map { |selector|
954
- modified_selector = selector.split /\s+/
955
- last = modified_selector.pop
956
- if last.index(element) == 0
957
- selector
958
- else
959
- modified_selector.push(element + last)
960
- end
961
- }
962
- identifier[:css] = selectors.join(', ')
963
- end
964
- [the_call, identifier]
965
- end
966
-
967
944
  def find_watir_elements(the_call, type, identifier, tag_name=nil)
968
945
  identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
969
- the_call, identifier = move_element_to_css_selector(the_call, identifier)
970
946
  elements = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
971
947
  switch_to_default_content(frame_identifiers)
972
948
  elements.map { |element| type.new(element, :platform => :watir_webdriver) }
@@ -974,7 +950,6 @@ module PageObject
974
950
 
975
951
  def find_watir_element(the_call, type, identifier, tag_name=nil)
976
952
  identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
977
- the_call, identifier = move_element_to_css_selector(the_call, identifier)
978
953
  element = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
979
954
  switch_to_default_content(frame_identifiers)
980
955
  type.new(element, :platform => :watir_webdriver)
@@ -982,7 +957,6 @@ module PageObject
982
957
 
983
958
  def process_watir_call(the_call, type, identifier, value=nil, tag_name=nil)
984
959
  identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
985
- the_call, identifier = move_element_to_css_selector(the_call, identifier)
986
960
  value = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
987
961
  switch_to_default_content(frame_identifiers)
988
962
  value
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "1.0"
3
+ VERSION = "1.0.1"
4
4
  end
@@ -30,6 +30,7 @@ module PageObject
30
30
  def self.define_accessors(base, widget_tag, widget_class)
31
31
  accessors_module = Module.new do
32
32
  define_method widget_tag do |name, *identifier_args, &block|
33
+ check_name(name)
33
34
 
34
35
  identifier = identifier_args.first
35
36
  identifier = {:index => 0} if identifier.nil?
data/page-object.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_dependency 'selenium-webdriver', '>= 2.42.0'
25
25
  s.add_dependency 'page_navigation', '>= 0.9'
26
26
 
27
- s.add_development_dependency 'rspec', '>= 2.14.0'
27
+ s.add_development_dependency 'rspec', '< 3.0'
28
28
  s.add_development_dependency 'cucumber', '>= 1.3.0'
29
29
  s.add_development_dependency 'yard', '>= 0.7.2'
30
30
  s.add_development_dependency 'rack', '>= 1.0'
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ include RSpec::Matchers
4
+
5
+ describe PageObject::Accessors do
6
+ context 'when declaring new elements on the page' do
7
+
8
+ it "should check the name when adding an element" do
9
+ class TestPage
10
+ include PageObject
11
+
12
+ def self.elements
13
+ [
14
+ 'text_field',
15
+ 'hidden_field',
16
+ 'text_area',
17
+ 'select_list',
18
+ 'link',
19
+ 'checkbox',
20
+ 'radio_button',
21
+ 'radio_button_group',
22
+ 'button',
23
+ 'div',
24
+ 'span',
25
+ 'table',
26
+ 'cell',
27
+ 'image',
28
+ 'form',
29
+ 'list_item',
30
+ 'unordered_list',
31
+ 'ordered_list',
32
+ 'h1',
33
+ 'h2',
34
+ 'h3',
35
+ 'h4',
36
+ 'h5',
37
+ 'h6',
38
+ 'paragraph',
39
+ 'file_field',
40
+ 'label',
41
+ 'area',
42
+ 'canvas',
43
+ 'audio',
44
+ 'video',
45
+ 'svg',
46
+ 'address',
47
+ 'figure'
48
+ ]
49
+ end
50
+
51
+ elements.each do |ele|
52
+ expect {
53
+ self.send ele, :platform, :id => 'foo'
54
+ }.to raise_error(NameError, "Identifier \'platform\' conflicts with page-object method of the same name")
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+ end
@@ -17,7 +17,7 @@ class SeleniumAccessorsTestPageObject
17
17
  div(:message, :id => 'message_id')
18
18
  table(:cart, :id => 'cart_id')
19
19
  cell(:total, :id => 'total')
20
- span(:alert, :id => 'alert_id')
20
+ span(:alert_span, :id => 'alert_id')
21
21
  image(:logo, :id => 'logo')
22
22
  form(:login, :id => 'login')
23
23
  list_item(:item_one, :id => 'one')
@@ -69,7 +69,7 @@ class SeleniumBlockPageObject
69
69
  div :footer do |element|
70
70
  "div"
71
71
  end
72
- span :alert do |element|
72
+ span :alert_span do |element|
73
73
  "span"
74
74
  end
75
75
  table :cart do |element|
@@ -342,12 +342,12 @@ describe PageObject::Accessors do
342
342
  it "should retrieve the text from a span" do
343
343
  selenium_browser.should_receive(:find_element).and_return(selenium_browser)
344
344
  selenium_browser.should_receive(:text).and_return("Alert")
345
- selenium_page_object.alert.should == "Alert"
345
+ selenium_page_object.alert_span.should == "Alert"
346
346
  end
347
347
 
348
348
  it "should retrieve the span element from the page" do
349
349
  selenium_browser.should_receive(:find_element).and_return(selenium_browser)
350
- element = selenium_page_object.alert_element
350
+ element = selenium_page_object.alert_span_element
351
351
  element.should be_instance_of PageObject::Elements::Span
352
352
  end
353
353
  end
@@ -17,7 +17,7 @@ class WatirAccessorsTestPageObject
17
17
  div(:message, :id => 'message_id')
18
18
  table(:cart, :id => 'cart_id')
19
19
  cell(:total, :id => 'total')
20
- span(:alert, :id => 'alert_id')
20
+ span(:alert_span, :id => 'alert_id')
21
21
  image(:logo, :id => 'logo')
22
22
  form(:login, :id => 'login')
23
23
  list_item(:item_one, :id => 'one')
@@ -69,7 +69,7 @@ class WatirBlockPageObject
69
69
  div :footer do |element|
70
70
  "div"
71
71
  end
72
- span :alert do |element|
72
+ span :alert_span do |element|
73
73
  "span"
74
74
  end
75
75
  table :cart do |element|
@@ -687,24 +687,24 @@ describe PageObject::Accessors do
687
687
  describe "span accessors" do
688
688
  context "when called on a page object" do
689
689
  it "should generate accessor methods" do
690
- watir_page_object.should respond_to(:alert)
691
- watir_page_object.should respond_to(:alert_element)
690
+ watir_page_object.should respond_to(:alert_span)
691
+ watir_page_object.should respond_to(:alert_span_element)
692
692
  end
693
693
 
694
694
  it "should call a block on the element method when present" do
695
- block_page_object.alert_element.should == "span"
695
+ block_page_object.alert_span_element.should == "span"
696
696
  end
697
697
  end
698
698
 
699
699
  it "should retrieve the text from a span" do
700
700
  watir_browser.should_receive(:span).and_return(watir_browser)
701
701
  watir_browser.should_receive(:text).and_return("Alert")
702
- watir_page_object.alert.should == "Alert"
702
+ watir_page_object.alert_span.should == "Alert"
703
703
  end
704
704
 
705
705
  it "should retrieve the span element from the page" do
706
706
  watir_browser.should_receive(:span).and_return(watir_browser)
707
- element = watir_page_object.alert_element
707
+ element = watir_page_object.alert_span_element
708
708
  element.should be_instance_of PageObject::Elements::Span
709
709
  end
710
710
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page-object
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Morgan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-01 00:00:00.000000000 Z
11
+ date: 2014-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: watir-webdriver
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "<"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.14.0
61
+ version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "<"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.14.0
68
+ version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cucumber
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -330,6 +330,7 @@ files:
330
330
  - lib/page-object/widgets.rb
331
331
  - page-object.gemspec
332
332
  - pageobject.gems
333
+ - spec/page-object/accessors_spec.rb
333
334
  - spec/page-object/element_locators_spec.rb
334
335
  - spec/page-object/elements/area_spec.rb
335
336
  - spec/page-object/elements/button_spec.rb
@@ -518,6 +519,7 @@ test_files:
518
519
  - features/text_field.feature
519
520
  - features/unordered_list.feature
520
521
  - features/video.feature
522
+ - spec/page-object/accessors_spec.rb
521
523
  - spec/page-object/element_locators_spec.rb
522
524
  - spec/page-object/elements/area_spec.rb
523
525
  - spec/page-object/elements/button_spec.rb