page-object 0.3.1 → 0.3.2

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.
Files changed (32) hide show
  1. data/ChangeLog +13 -1
  2. data/features/element.feature +10 -0
  3. data/features/headings.feature +54 -0
  4. data/features/html/nested_elements.html +6 -2
  5. data/features/html/static_elements.html +11 -26
  6. data/features/nested_elements.feature +14 -1
  7. data/features/step_definitions/element_steps.rb +4 -0
  8. data/features/step_definitions/headings_steps.rb +12 -0
  9. data/features/step_definitions/nested_elements_steps.rb +27 -0
  10. data/features/step_definitions/text_area_steps.rb +4 -0
  11. data/features/support/page.rb +24 -0
  12. data/features/text_area.feature +6 -0
  13. data/lib/page-object/accessors.rb +87 -0
  14. data/lib/page-object/element_locators.rb +45 -0
  15. data/lib/page-object/elements.rb +1 -0
  16. data/lib/page-object/elements/element.rb +1 -1
  17. data/lib/page-object/elements/heading.rb +7 -0
  18. data/lib/page-object/nested_elements.rb +12 -0
  19. data/lib/page-object/platforms/selenium_webdriver/element.rb +3 -12
  20. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +72 -0
  21. data/lib/page-object/platforms/watir_webdriver/element.rb +3 -0
  22. data/lib/page-object/platforms/watir_webdriver/page_object.rb +57 -0
  23. data/lib/page-object/platforms/watir_webdriver/text_area.rb +7 -0
  24. data/lib/page-object/version.rb +1 -1
  25. data/page-object.gemspec +1 -1
  26. data/spec/page-object/accessors_spec.rb +135 -0
  27. data/spec/page-object/element_locators_spec.rb +18 -0
  28. data/spec/page-object/elements/element_spec.rb +42 -0
  29. data/spec/page-object/elements/heading_spec.rb +22 -0
  30. data/spec/page-object/elements/nested_element_spec.rb +33 -3
  31. metadata +11 -6
  32. data/features/element_attributes.feature +0 -233
@@ -273,5 +273,50 @@ module PageObject
273
273
  def ordered_list_element(identifier)
274
274
  platform.ordered_list_for(identifier.clone)
275
275
  end
276
+
277
+ #
278
+ # Finds a h1
279
+ #
280
+ # @param [Hash] identifier how we find a H1. You can use a multiple paramaters
281
+ # by combining of any of the following except xpath. The valid keys are:
282
+ # * :class => Watir and Selenium
283
+ # * :id => Watir and Selenium
284
+ # * :index => Watir and Selenium
285
+ # * :name => Watir and Selenium
286
+ # * :xpath => Watir and Selenium
287
+ #
288
+ def h1_element(identifier)
289
+ platform.h1_for(identifier.clone)
290
+ end
291
+
292
+ #
293
+ # Finds a h2
294
+ #
295
+ # @param [Hash] identifier how we find a H2. You can use a multiple paramaters
296
+ # by combining of any of the following except xpath. The valid keys are:
297
+ # * :class => Watir and Selenium
298
+ # * :id => Watir and Selenium
299
+ # * :index => Watir and Selenium
300
+ # * :name => Watir and Selenium
301
+ # * :xpath => Watir and Selenium
302
+ #
303
+ def h2_element(identifier)
304
+ platform.h2_for(identifier.clone)
305
+ end
306
+
307
+ #
308
+ # Finds a h3
309
+ #
310
+ # @param [Hash] identifier how we find a H3. You can use a multiple paramaters
311
+ # by combining of any of the following except xpath. The valid keys are:
312
+ # * :class => Watir and Selenium
313
+ # * :id => Watir and Selenium
314
+ # * :index => Watir and Selenium
315
+ # * :name => Watir and Selenium
316
+ # * :xpath => Watir and Selenium
317
+ #
318
+ def h3_element(identifier)
319
+ platform.h3_for(identifier.clone)
320
+ end
276
321
  end
277
322
  end
@@ -18,3 +18,4 @@ require 'page-object/elements/list_item'
18
18
  require 'page-object/elements/unordered_list'
19
19
  require 'page-object/elements/ordered_list'
20
20
  require 'page-object/elements/option'
21
+ require 'page-object/elements/heading'
@@ -58,7 +58,7 @@ module PageObject
58
58
  protected
59
59
 
60
60
  def self.should_build_watir_xpath identifier
61
- ['table', 'span', 'div', 'td', 'li', 'ul', 'ol'].include? identifier[:tag_name] and identifier[:name]
61
+ ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3'].include? identifier[:tag_name] and identifier[:name]
62
62
  end
63
63
 
64
64
  def self.build_xpath_for identifier
@@ -0,0 +1,7 @@
1
+ module PageObject
2
+ module Elements
3
+ class Heading < Element
4
+
5
+ end
6
+ end
7
+ end
@@ -68,5 +68,17 @@ module PageObject
68
68
  def list_item_element(identifier={:index => 0})
69
69
  @platform.list_item_for(identifier)
70
70
  end
71
+
72
+ def h1_element(identifier={:index => 0})
73
+ @platform.h1_for(identifier)
74
+ end
75
+
76
+ def h2_element(identifier={:index => 0})
77
+ @platform.h2_for(identifier)
78
+ end
79
+
80
+ def h3_element(identifier={:index => 0})
81
+ @platform.h3_for(identifier)
82
+ end
71
83
  end
72
84
  end
@@ -100,6 +100,7 @@ module PageObject
100
100
  wait.until do
101
101
  self.exists?
102
102
  end
103
+ self
103
104
  end
104
105
 
105
106
  #
@@ -112,6 +113,7 @@ module PageObject
112
113
  wait.until do
113
114
  self.visible?
114
115
  end
116
+ self
115
117
  end
116
118
 
117
119
  #
@@ -124,6 +126,7 @@ module PageObject
124
126
  wait.until do
125
127
  not self.visible?
126
128
  end
129
+ self
127
130
  end
128
131
 
129
132
  #
@@ -138,18 +141,6 @@ module PageObject
138
141
  wait.until &block
139
142
  end
140
143
 
141
- #
142
- # Waits until the block returns true
143
- #
144
- # @param [Integer] (defaults to: 5) seconds to wait before timing out
145
- # @param [String] the message to display if the event timeouts
146
- # @param the block to execute when the event occurrs
147
- #
148
- def wait_until(timeout=5, message=nil, &block)
149
- wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => message})
150
- wait.until &block
151
- end
152
-
153
144
  #
154
145
  # Send keystrokes to this element
155
146
  #
@@ -553,6 +553,78 @@ module PageObject
553
553
  @browser.switch_to.default_content unless frame_identifiers.nil?
554
554
  ::PageObject::Elements::OrderedList.new(element, :platform => :selenium_webdriver)
555
555
  end
556
+
557
+ #
558
+ # platform method to retrieve the text from a h1
559
+ # See PageObject::Accessors#h1
560
+ #
561
+ def h1_text_for(identifier)
562
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h1')
563
+ switch_to_frame(frame_identifiers)
564
+ value = @browser.find_element(how, what).text
565
+ @browser.switch_to.default_content
566
+ value
567
+ end
568
+
569
+ #
570
+ # platform method to retrieve the h1 element
571
+ # See PageObject::Accessors#h1
572
+ #
573
+ def h1_for(identifier)
574
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h1')
575
+ switch_to_frame(frame_identifiers)
576
+ element = @browser.find_element(how, what)
577
+ @browser.switch_to.default_content unless frame_identifiers.nil?
578
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
579
+ end
580
+
581
+ #
582
+ # platform method to retrieve the text from a h2
583
+ # See PageObject::Accessors#h2
584
+ #
585
+ def h2_text_for(identifier)
586
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h2')
587
+ switch_to_frame(frame_identifiers)
588
+ value = @browser.find_element(how, what).text
589
+ @browser.switch_to.default_content
590
+ value
591
+ end
592
+
593
+ #
594
+ # platform method to retrieve the h2 element
595
+ # See PageObject::Accessors#h2
596
+ #
597
+ def h2_for(identifier)
598
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h2')
599
+ switch_to_frame(frame_identifiers)
600
+ element = @browser.find_element(how, what)
601
+ @browser.switch_to.default_content unless frame_identifiers.nil?
602
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
603
+ end
604
+
605
+ #
606
+ # platform method to retrieve the text from a h3
607
+ # See PageObject::Accessors#h3
608
+ #
609
+ def h3_text_for(identifier)
610
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h3')
611
+ switch_to_frame(frame_identifiers)
612
+ value = @browser.find_element(how, what).text
613
+ @browser.switch_to.default_content
614
+ value
615
+ end
616
+
617
+ #
618
+ # platform method to retrieve the h3 element
619
+ # See PageObject::Accessors#h3
620
+ #
621
+ def h3_for(identifier)
622
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h3')
623
+ switch_to_frame(frame_identifiers)
624
+ element = @browser.find_element(how, what)
625
+ @browser.switch_to.default_content unless frame_identifiers.nil?
626
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
627
+ end
556
628
 
557
629
  private
558
630
 
@@ -90,6 +90,7 @@ module PageObject
90
90
  #
91
91
  def when_present(timeout=5)
92
92
  @element.wait_until_present(timeout)
93
+ self
93
94
  end
94
95
 
95
96
  #
@@ -101,6 +102,7 @@ module PageObject
101
102
  Object::Watir::Wait.until(timeout, "Element was not visible in #{timeout} seconds") do
102
103
  visible?
103
104
  end
105
+ self
104
106
  end
105
107
 
106
108
  #
@@ -112,6 +114,7 @@ module PageObject
112
114
  Object::Watir::Wait.while(timeout, "Element still visible after #{timeout} seconds") do
113
115
  visible?
114
116
  end
117
+ self
115
118
  end
116
119
 
117
120
  #
@@ -454,6 +454,63 @@ module PageObject
454
454
  element = @browser.instance_eval "#{nested_frames(frame_identifiers)}ol(identifier)"
455
455
  Object::PageObject::Elements::OrderedList.new(element, :platform => :watir_webdriver)
456
456
  end
457
+
458
+ #
459
+ # platform method to retrieve the text for a h1
460
+ # See PageObject::Accessors#h1
461
+ #
462
+ def h1_text_for(identifier)
463
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h1')
464
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h1(identifier).text"
465
+ end
466
+
467
+ #
468
+ # platform method to retrieve the h1 element
469
+ # See PageObject::Accessors#h1
470
+ #
471
+ def h1_for(identifier)
472
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h1')
473
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h1(identifier)"
474
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
475
+ end
476
+
477
+ #
478
+ # platform method to retrieve the text for a h2
479
+ # See PageObject::Accessors#h2
480
+ #
481
+ def h2_text_for(identifier)
482
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h2')
483
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h2(identifier).text"
484
+ end
485
+
486
+ #
487
+ # platform method to retrieve the h2 element
488
+ # See PageObject::Accessors#h2
489
+ #
490
+ def h2_for(identifier)
491
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h2')
492
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h2(identifier)"
493
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
494
+ end
495
+
496
+ #
497
+ # platform method to retrieve the text for a h3
498
+ # See PageObject::Accessors#h3
499
+ #
500
+ def h3_text_for(identifier)
501
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h3')
502
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h3(identifier).text"
503
+ end
504
+
505
+ #
506
+ # platform method to retrieve the h3 element
507
+ # See PageObject::Accessors#h3
508
+ #
509
+ def h3_for(identifier)
510
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h3')
511
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h3(identifier)"
512
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
513
+ end
457
514
 
458
515
  private
459
516
 
@@ -10,6 +10,13 @@ module PageObject
10
10
  def value=(new_value)
11
11
  element.send_keys(new_value)
12
12
  end
13
+
14
+ #
15
+ # Clear the TextArea
16
+ #
17
+ def clear
18
+ element.wd.clear
19
+ end
13
20
  end
14
21
  end
15
22
  end
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.3.1"
3
+ VERSION = "0.3.2"
4
4
  end
data/page-object.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.add_dependency 'watir-webdriver', '>= 0.3.3'
23
- s.add_dependency 'selenium-webdriver', '>= 2.5.0'
23
+ s.add_dependency 'selenium-webdriver', '>= 2.6.0'
24
24
 
25
25
  s.add_development_dependency 'rspec', '>= 2.6.0'
26
26
  s.add_development_dependency 'cucumber', '>= 1.0.0'
@@ -21,6 +21,9 @@ class AccessorsTestPageObject
21
21
  list_item(:item_one, :id => 'one')
22
22
  unordered_list(:menu, :id => 'main_menu')
23
23
  ordered_list(:top_five, :id => 'top')
24
+ h1(:heading1, :id => 'main_heading')
25
+ h2(:heading2, :id => 'main_heading')
26
+ h3(:heading3, :id => 'main_heading')
24
27
  end
25
28
 
26
29
  class BlockPageObject
@@ -79,6 +82,15 @@ class BlockPageObject
79
82
  ordered_list :top_five do |element|
80
83
  "ordered_list"
81
84
  end
85
+ h1 :heading1 do |element|
86
+ "h1"
87
+ end
88
+ h2 :heading2 do |element|
89
+ "h2"
90
+ end
91
+ h3 :heading3 do |element|
92
+ "h3"
93
+ end
82
94
  end
83
95
 
84
96
  describe PageObject::Accessors do
@@ -860,4 +872,127 @@ describe PageObject::Accessors do
860
872
  end
861
873
  end
862
874
  end
875
+
876
+ describe "h1 accessors" do
877
+ context "when called on a page object" do
878
+ it "should generate accessor methods" do
879
+ watir_page_object.should respond_to(:heading1)
880
+ watir_page_object.should respond_to(:heading1_element)
881
+ end
882
+
883
+ it "should call a block on the element method when present" do
884
+ block_page_object.heading1_element.should == "h1"
885
+ end
886
+ end
887
+
888
+ context "watir implementation" do
889
+ it "should retrieve the text from the h1" do
890
+ watir_browser.should_receive(:h1).and_return(watir_browser)
891
+ watir_browser.should_receive(:text).and_return("value")
892
+ watir_page_object.heading1.should == "value"
893
+ end
894
+
895
+ it "should retrieve the element from the page" do
896
+ watir_browser.should_receive(:h1).and_return(watir_browser)
897
+ element = watir_page_object.heading1_element
898
+ element.should be_instance_of PageObject::Elements::Heading
899
+ end
900
+ end
901
+
902
+ context "selenium implementation" do
903
+ it "should retrieve the text from the h1" do
904
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
905
+ selenium_browser.should_receive(:text).and_return("value")
906
+ selenium_page_object.heading1.should == "value"
907
+ end
908
+
909
+ it "should retrieve the element from the page" do
910
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
911
+ element = selenium_page_object.heading1_element
912
+ element.should be_instance_of PageObject::Elements::Heading
913
+ end
914
+ end
915
+ end
916
+
917
+ describe "h2 accessors" do
918
+ context "when called on a page object" do
919
+ it "should generate accessor methods" do
920
+ watir_page_object.should respond_to(:heading2)
921
+ watir_page_object.should respond_to(:heading2_element)
922
+ end
923
+
924
+ it "should call a block on the element method when present" do
925
+ block_page_object.heading2_element.should == "h2"
926
+ end
927
+ end
928
+
929
+ context "watir implementation" do
930
+ it "should retrieve the text from the h2" do
931
+ watir_browser.should_receive(:h2).and_return(watir_browser)
932
+ watir_browser.should_receive(:text).and_return("value")
933
+ watir_page_object.heading2.should == "value"
934
+ end
935
+
936
+ it "should retrieve the element from the page" do
937
+ watir_browser.should_receive(:h2).and_return(watir_browser)
938
+ element = watir_page_object.heading2_element
939
+ element.should be_instance_of PageObject::Elements::Heading
940
+ end
941
+ end
942
+
943
+ context "selenium implementation" do
944
+ it "should retrieve the text from the h2" do
945
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
946
+ selenium_browser.should_receive(:text).and_return("value")
947
+ selenium_page_object.heading2.should == "value"
948
+ end
949
+
950
+ it "should retrieve the element from the page" do
951
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
952
+ element = selenium_page_object.heading2_element
953
+ element.should be_instance_of PageObject::Elements::Heading
954
+ end
955
+ end
956
+
957
+ describe "h3 accessors" do
958
+ context "when called on a page object" do
959
+ it "should generate accessor methods" do
960
+ watir_page_object.should respond_to(:heading3)
961
+ watir_page_object.should respond_to(:heading3_element)
962
+ end
963
+
964
+ it "should call a block on the element method when present" do
965
+ block_page_object.heading3_element.should == "h3"
966
+ end
967
+ end
968
+
969
+ context "watir implementation" do
970
+ it "should retrieve the text from the h3" do
971
+ watir_browser.should_receive(:h3).and_return(watir_browser)
972
+ watir_browser.should_receive(:text).and_return("value")
973
+ watir_page_object.heading3.should == "value"
974
+ end
975
+
976
+ it "should retrieve the element from the page" do
977
+ watir_browser.should_receive(:h3).and_return(watir_browser)
978
+ element = watir_page_object.heading3_element
979
+ element.should be_instance_of PageObject::Elements::Heading
980
+ end
981
+ end
982
+
983
+ context "selenium implementation" do
984
+ it "should retrieve the text from the h3" do
985
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
986
+ selenium_browser.should_receive(:text).and_return("value")
987
+ selenium_page_object.heading3.should == "value"
988
+ end
989
+
990
+ it "should retrieve the element from the page" do
991
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
992
+ element = selenium_page_object.heading3_element
993
+ element.should be_instance_of PageObject::Elements::Heading
994
+ end
995
+ end
996
+ end
997
+ end
863
998
  end