page-object 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/ChangeLog +16 -0
  2. data/features/headings.feature +42 -6
  3. data/features/html/nested_elements.html +11 -5
  4. data/features/html/static_elements.html +1 -1
  5. data/features/nested_elements.feature +19 -3
  6. data/features/paragraph.feature +33 -0
  7. data/features/step_definitions/nested_elements_steps.rb +12 -16
  8. data/features/step_definitions/paragraph_steps.rb +16 -0
  9. data/features/support/page.rb +32 -0
  10. data/lib/page-object/accessors.rb +116 -0
  11. data/lib/page-object/element_locators.rb +60 -0
  12. data/lib/page-object/elements/button.rb +3 -1
  13. data/lib/page-object/elements/check_box.rb +4 -2
  14. data/lib/page-object/elements/element.rb +23 -3
  15. data/lib/page-object/elements/form.rb +4 -2
  16. data/lib/page-object/elements/image.rb +4 -2
  17. data/lib/page-object/elements/link.rb +3 -1
  18. data/lib/page-object/elements/ordered_list.rb +4 -2
  19. data/lib/page-object/elements/paragraph.rb +7 -0
  20. data/lib/page-object/elements/radio_button.rb +4 -2
  21. data/lib/page-object/elements/select_list.rb +4 -2
  22. data/lib/page-object/elements/table.rb +4 -2
  23. data/lib/page-object/elements/table_row.rb +4 -2
  24. data/lib/page-object/elements/text_area.rb +4 -2
  25. data/lib/page-object/elements/text_field.rb +4 -2
  26. data/lib/page-object/elements/unordered_list.rb +4 -2
  27. data/lib/page-object/elements.rb +1 -0
  28. data/lib/page-object/nested_elements.rb +16 -0
  29. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +120 -0
  30. data/lib/page-object/platforms/watir_webdriver/page_object.rb +100 -0
  31. data/lib/page-object/version.rb +1 -1
  32. data/lib/page-object.rb +22 -0
  33. data/page-object.gemspec +3 -2
  34. data/spec/page-object/accessors_spec.rb +212 -31
  35. data/spec/page-object/element_locators_spec.rb +24 -0
  36. data/spec/page-object/elements/element_spec.rb +9 -250
  37. data/spec/page-object/elements/nested_element_spec.rb +125 -86
  38. data/spec/page-object/elements/selenium_element_spec.rb +128 -0
  39. data/spec/page-object/elements/watir_element_spec.rb +116 -0
  40. data/spec/page-object/page-object_spec.rb +32 -0
  41. metadata +30 -10
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class SelectList < Element
@@ -21,10 +23,10 @@ module PageObject
21
23
  super
22
24
  if platform[:platform] == :watir_webdriver
23
25
  require 'page-object/platforms/watir_webdriver/select_list'
24
- self.class.send :include, PageObject::Platforms::WatirWebDriver::SelectList
26
+ self.mixin PageObject::Platforms::WatirWebDriver::SelectList
25
27
  elsif platform[:platform] == :selenium_webdriver
26
28
  require 'page-object/platforms/selenium_webdriver/select_list'
27
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::SelectList
29
+ self.mixin PageObject::Platforms::SeleniumWebDriver::SelectList
28
30
  else
29
31
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
30
32
  end
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class Table < Element
@@ -29,10 +31,10 @@ module PageObject
29
31
  super
30
32
  if platform[:platform] == :watir_webdriver
31
33
  require 'page-object/platforms/watir_webdriver/table'
32
- self.class.send :include, PageObject::Platforms::WatirWebDriver::Table
34
+ self.mixin PageObject::Platforms::WatirWebDriver::Table
33
35
  elsif platform[:platform] == :selenium_webdriver
34
36
  require 'page-object/platforms/selenium_webdriver/table'
35
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Table
37
+ self.mixin PageObject::Platforms::SeleniumWebDriver::Table
36
38
  else
37
39
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
38
40
  end
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class TableRow < Element
@@ -29,10 +31,10 @@ module PageObject
29
31
  super
30
32
  if platform[:platform] == :watir_webdriver
31
33
  require 'page-object/platforms/watir_webdriver/table_row'
32
- self.class.send :include, PageObject::Platforms::WatirWebDriver::TableRow
34
+ self.mixin PageObject::Platforms::WatirWebDriver::TableRow
33
35
  elsif platform[:platform] == :selenium_webdriver
34
36
  require 'page-object/platforms/selenium_webdriver/table_row'
35
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::TableRow
37
+ self.mixin PageObject::Platforms::SeleniumWebDriver::TableRow
36
38
  else
37
39
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
38
40
  end
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class TextArea < Element
@@ -29,10 +31,10 @@ module PageObject
29
31
  super
30
32
  if platform[:platform] == :watir_webdriver
31
33
  require 'page-object/platforms/watir_webdriver/text_area'
32
- self.class.send :include, PageObject::Platforms::WatirWebDriver::TextArea
34
+ self.mixin PageObject::Platforms::WatirWebDriver::TextArea
33
35
  elsif platform[:platform] == :selenium_webdriver
34
36
  require 'page-object/platforms/selenium_webdriver/text_area'
35
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::TextArea
37
+ self.mixin PageObject::Platforms::SeleniumWebDriver::TextArea
36
38
  else
37
39
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
38
40
  end
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class TextField < Element
@@ -29,10 +31,10 @@ module PageObject
29
31
  super
30
32
  if platform[:platform] == :watir_webdriver
31
33
  require 'page-object/platforms/watir_webdriver/text_field'
32
- self.class.send :include, PageObject::Platforms::WatirWebDriver::TextField
34
+ self.mixin PageObject::Platforms::WatirWebDriver::TextField
33
35
  elsif platform[:platform] == :selenium_webdriver
34
36
  require 'page-object/platforms/selenium_webdriver/text_field'
35
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::TextField
37
+ self.mixin PageObject::Platforms::SeleniumWebDriver::TextField
36
38
  else
37
39
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
38
40
  end
@@ -1,3 +1,5 @@
1
+ require 'mixology'
2
+
1
3
  module PageObject
2
4
  module Elements
3
5
  class UnorderedList < Element
@@ -34,10 +36,10 @@ module PageObject
34
36
  super
35
37
  if platform[:platform] == :watir_webdriver
36
38
  require 'page-object/platforms/watir_webdriver/unordered_list'
37
- self.class.send :include, PageObject::Platforms::WatirWebDriver::UnorderedList
39
+ self.mixin PageObject::Platforms::WatirWebDriver::UnorderedList
38
40
  elsif platform[:platform] == :selenium_webdriver
39
41
  require 'page-object/platforms/selenium_webdriver/unordered_list'
40
- self.class.send :include, PageObject::Platforms::SeleniumWebDriver::UnorderedList
42
+ self.mixin PageObject::Platforms::SeleniumWebDriver::UnorderedList
41
43
  else
42
44
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
43
45
  end
@@ -19,3 +19,4 @@ require 'page-object/elements/unordered_list'
19
19
  require 'page-object/elements/ordered_list'
20
20
  require 'page-object/elements/option'
21
21
  require 'page-object/elements/heading'
22
+ require 'page-object/elements/paragraph'
@@ -80,5 +80,21 @@ module PageObject
80
80
  def h3_element(identifier={:index => 0})
81
81
  @platform.h3_for(identifier)
82
82
  end
83
+
84
+ def h4_element(identifier={:index => 0})
85
+ @platform.h4_for(identifier)
86
+ end
87
+
88
+ def h5_element(identifier={:index => 0})
89
+ @platform.h5_for(identifier)
90
+ end
91
+
92
+ def h6_element(identifier={:index => 0})
93
+ @platform.h6_for(identifier)
94
+ end
95
+
96
+ def paragraph_element(identifier={:index => 0})
97
+ @platform.paragraph_for(identifier)
98
+ end
83
99
  end
84
100
  end
@@ -23,6 +23,14 @@ module PageObject
23
23
  @browser.navigate.to url
24
24
  end
25
25
 
26
+ #
27
+ # platform method to get the current url
28
+ # See PageObject#current_url
29
+ #
30
+ def current_url
31
+ @browser.current_url
32
+ end
33
+
26
34
  #
27
35
  # platform method to retrieve the text from the current page
28
36
  # See PageObject#text
@@ -129,6 +137,22 @@ module PageObject
129
137
  def forward
130
138
  @browser.navigate.forward
131
139
  end
140
+
141
+ #
142
+ # platform method to clear the cookies from the browser
143
+ # See PageObject#clear_cookies
144
+ #
145
+ def clear_cookies
146
+ @browser.manage.delete_all_cookies
147
+ end
148
+
149
+ #
150
+ # platform method to save the current screenshot to a file
151
+ # See PageObject#save_screenshot
152
+ #
153
+ def save_screenshot(file_name)
154
+ @browser.save_screenshot(file_name)
155
+ end
132
156
 
133
157
  #
134
158
  # platform method to get the value stored in a text field
@@ -626,6 +650,102 @@ module PageObject
626
650
  ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
627
651
  end
628
652
 
653
+ #
654
+ # platform method to retrieve the text from a h4
655
+ # See PageObject::Accessors#h4
656
+ #
657
+ def h4_text_for(identifier)
658
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h4')
659
+ switch_to_frame(frame_identifiers)
660
+ value = @browser.find_element(how, what).text
661
+ @browser.switch_to.default_content
662
+ value
663
+ end
664
+
665
+ #
666
+ # platform method to retrieve the h4 element
667
+ # See PageObject::Accessors#h4
668
+ #
669
+ def h4_for(identifier)
670
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h4')
671
+ switch_to_frame(frame_identifiers)
672
+ element = @browser.find_element(how, what)
673
+ @browser.switch_to.default_content unless frame_identifiers.nil?
674
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
675
+ end
676
+
677
+ #
678
+ # platform method to retrieve the text from a h5
679
+ # See PageObject::Accessors#h5
680
+ #
681
+ def h5_text_for(identifier)
682
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h5')
683
+ switch_to_frame(frame_identifiers)
684
+ value = @browser.find_element(how, what).text
685
+ @browser.switch_to.default_content
686
+ value
687
+ end
688
+
689
+ #
690
+ # platform method to retrieve the h5 element
691
+ # See PageObject::Accessors#h5
692
+ #
693
+ def h5_for(identifier)
694
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h5')
695
+ switch_to_frame(frame_identifiers)
696
+ element = @browser.find_element(how, what)
697
+ @browser.switch_to.default_content unless frame_identifiers.nil?
698
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
699
+ end
700
+
701
+ #
702
+ # platform method to retrieve the text from a h6
703
+ # See PageObject::Accessors#h6
704
+ #
705
+ def h6_text_for(identifier)
706
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h6')
707
+ switch_to_frame(frame_identifiers)
708
+ value = @browser.find_element(how, what).text
709
+ @browser.switch_to.default_content
710
+ value
711
+ end
712
+
713
+ #
714
+ # platform method to retrieve the h6 element
715
+ # See PageObject::Accessors#h6
716
+ #
717
+ def h6_for(identifier)
718
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h6')
719
+ switch_to_frame(frame_identifiers)
720
+ element = @browser.find_element(how, what)
721
+ @browser.switch_to.default_content unless frame_identifiers.nil?
722
+ ::PageObject::Elements::Heading.new(element, :platform => :selenium_webdriver)
723
+ end
724
+
725
+ #
726
+ # platform method to retrieve the text for a paragraph
727
+ # See PageObject::Accessors#paragraph
728
+ #
729
+ def paragraph_text_for(identifier)
730
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Paragraph, 'p')
731
+ switch_to_frame(frame_identifiers)
732
+ value = @browser.find_element(how, what).text
733
+ @browser.switch_to.default_content
734
+ value
735
+ end
736
+
737
+ #
738
+ # platform method to retrieve the paragraph element
739
+ # See PageObject::Accessors#paragraph
740
+ #
741
+ def paragraph_for(identifier)
742
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'p')
743
+ switch_to_frame(frame_identifiers)
744
+ element = @browser.find_element(how, what)
745
+ @browser.switch_to.default_content unless frame_identifiers.nil?
746
+ ::PageObject::Elements::Paragraph.new(element, :platform => :selenium_webdriver)
747
+ end
748
+
629
749
  private
630
750
 
631
751
  def parse_identifiers(identifier, element, tag_name=nil, additional=nil)
@@ -25,6 +25,14 @@ module PageObject
25
25
  def navigate_to(url)
26
26
  @browser.goto url
27
27
  end
28
+
29
+ #
30
+ # platform method to get the current url
31
+ # See PageObject#current_url
32
+ #
33
+ def current_url
34
+ @browser.url
35
+ end
28
36
 
29
37
  #
30
38
  # platform method to retrieve the text from the current page
@@ -113,6 +121,22 @@ module PageObject
113
121
  def forward
114
122
  @browser.forward
115
123
  end
124
+
125
+ #
126
+ # platform method to clear the cookies from the browser
127
+ # See PageObject#clear_cookies
128
+ #
129
+ def clear_cookies
130
+ @browser.clear_cookies
131
+ end
132
+
133
+ #
134
+ # platform method to save the current screenshot to a file
135
+ # See PageObject#save_screenshot
136
+ #
137
+ def save_screenshot(file_name)
138
+ @browser.wd.save_screenshot(file_name)
139
+ end
116
140
 
117
141
  #
118
142
  # platform method to get the value stored in a text field
@@ -512,6 +536,82 @@ module PageObject
512
536
  Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
513
537
  end
514
538
 
539
+ #
540
+ # platform method to retrieve the text for a h4
541
+ # See PageObject::Accessors#h4
542
+ #
543
+ def h4_text_for(identifier)
544
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h4')
545
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h4(identifier).text"
546
+ end
547
+
548
+ #
549
+ # platform method to retrieve the h4 element
550
+ # See PageObject::Accessors#h4
551
+ #
552
+ def h4_for(identifier)
553
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h4')
554
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h4(identifier)"
555
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
556
+ end
557
+
558
+ #
559
+ # platform method to retrieve the text for a h5
560
+ # See PageObject::Accessors#h5
561
+ #
562
+ def h5_text_for(identifier)
563
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h5')
564
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h5(identifier).text"
565
+ end
566
+
567
+ #
568
+ # platform method to retrieve the h5 element
569
+ # See PageObject::Accessors#h5
570
+ #
571
+ def h5_for(identifier)
572
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h5')
573
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h5(identifier)"
574
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
575
+ end
576
+
577
+ #
578
+ # platform method to retrieve the text for a h6
579
+ # See PageObject::Accessors#h6
580
+ #
581
+ def h6_text_for(identifier)
582
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h6')
583
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}h6(identifier).text"
584
+ end
585
+
586
+ #
587
+ # platform method to retrieve the h6 element
588
+ # See PageObject::Accessors#h6
589
+ #
590
+ def h6_for(identifier)
591
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'h6')
592
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}h6(identifier)"
593
+ Object::PageObject::Elements::Heading.new(element, :platform => :watir_webdriver)
594
+ end
595
+
596
+ #
597
+ # platform method to retrieve the text for a paragraph
598
+ # See PageObject::Accessors#paragraph
599
+ #
600
+ def paragraph_text_for(identifier)
601
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'p')
602
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}p(identifier).text"
603
+ end
604
+
605
+ #
606
+ # platform method to retrieve the paragraph element
607
+ # See PageObject::Accessors#paragraph
608
+ #
609
+ def paragraph_for(identifier)
610
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Heading, 'p')
611
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}p(identifier)"
612
+ Object::PageObject::Elements::Paragraph.new(element, :platform => :watir_webdriver)
613
+ end
614
+
515
615
  private
516
616
 
517
617
  def parse_identifiers(identifier, element, tag_name=nil)
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.3.2"
3
+ VERSION = "0.4.0"
4
4
  end
data/lib/page-object.rb CHANGED
@@ -60,6 +60,13 @@ module PageObject
60
60
  cls.extend PageObject::Accessors
61
61
  end
62
62
 
63
+ #
64
+ # get the current page url
65
+ #
66
+ def current_url
67
+ platform.current_url
68
+ end
69
+
63
70
  #
64
71
  # navigate to the provided url
65
72
  #
@@ -221,6 +228,21 @@ module PageObject
221
228
  def forward
222
229
  platform.forward
223
230
  end
231
+
232
+ #
233
+ # Clear the cookies from the browser
234
+ #
235
+ def clear_cookies
236
+ platform.clear_cookies
237
+ end
238
+
239
+ #
240
+ # Save the current screenshot to the provided url. File
241
+ # is saved as a png file.
242
+ #
243
+ def save_screenshot(file_name)
244
+ platform.save_screenshot file_name
245
+ end
224
246
 
225
247
  private
226
248
 
data/page-object.gemspec CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency 'watir-webdriver', '>= 0.3.3'
23
- s.add_dependency 'selenium-webdriver', '>= 2.6.0'
22
+ s.add_dependency 'watir-webdriver', '>= 0.3.4'
23
+ s.add_dependency 'selenium-webdriver', '>= 2.7.0'
24
+ s.add_dependency 'mixology'
24
25
 
25
26
  s.add_development_dependency 'rspec', '>= 2.6.0'
26
27
  s.add_development_dependency 'cucumber', '>= 1.0.0'