page-object 0.6.3 → 0.6.4

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 (50) hide show
  1. data/ChangeLog +15 -0
  2. data/features/button.feature +1 -0
  3. data/features/element.feature +60 -56
  4. data/features/frames.feature +1 -0
  5. data/features/generic_elements.feature +24 -0
  6. data/features/html/multi_elements.html +4 -0
  7. data/features/html/nested_elements.html +4 -1
  8. data/features/html/static_elements.html +15 -1
  9. data/features/label.feature +44 -0
  10. data/features/link.feature +1 -0
  11. data/features/sample-app/public/prototype.html +1 -0
  12. data/features/step_definitions/element_steps.rb +22 -6
  13. data/features/step_definitions/frames_steps.rb +4 -0
  14. data/features/step_definitions/generic_element_steps.rb +19 -0
  15. data/features/step_definitions/label_steps.rb +19 -0
  16. data/features/support/page.rb +17 -0
  17. data/lib/page-object.rb +7 -0
  18. data/lib/page-object/accessors.rb +73 -1
  19. data/lib/page-object/element_locators.rb +36 -0
  20. data/lib/page-object/elements.rb +2 -1
  21. data/lib/page-object/elements/button.rb +2 -2
  22. data/lib/page-object/elements/element.rb +6 -6
  23. data/lib/page-object/elements/label.rb +19 -0
  24. data/lib/page-object/elements/link.rb +2 -2
  25. data/lib/page-object/elements/text_field.rb +1 -1
  26. data/lib/page-object/nested_elements.rb +8 -0
  27. data/lib/page-object/page_factory.rb +6 -0
  28. data/lib/page-object/platforms/selenium_webdriver/element.rb +17 -17
  29. data/lib/page-object/platforms/selenium_webdriver/form.rb +2 -2
  30. data/lib/page-object/platforms/selenium_webdriver/image.rb +2 -2
  31. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +54 -1
  32. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +2 -2
  33. data/lib/page-object/platforms/selenium_webdriver/table.rb +2 -2
  34. data/lib/page-object/platforms/watir_webdriver/element.rb +14 -14
  35. data/lib/page-object/platforms/watir_webdriver/form.rb +2 -2
  36. data/lib/page-object/platforms/watir_webdriver/image.rb +2 -2
  37. data/lib/page-object/platforms/watir_webdriver/page_object.rb +72 -9
  38. data/lib/page-object/platforms/watir_webdriver/select_list.rb +5 -5
  39. data/lib/page-object/platforms/watir_webdriver/table.rb +2 -2
  40. data/lib/page-object/version.rb +1 -1
  41. data/page-object.gemspec +1 -1
  42. data/spec/page-object/accessors_spec.rb +15 -3
  43. data/spec/page-object/element_locators_spec.rb +24 -0
  44. data/spec/page-object/elements/button_spec.rb +2 -2
  45. data/spec/page-object/elements/label_spec.rb +29 -0
  46. data/spec/page-object/elements/link_spec.rb +2 -2
  47. data/spec/page-object/page-object_spec.rb +7 -1
  48. data/spec/page-object/page_factory_spec.rb +26 -0
  49. data/spec/page-object/platforms/watir_webdriver_spec.rb +1 -0
  50. metadata +26 -15
@@ -24,6 +24,7 @@ Feature: Links
24
24
  | text |
25
25
  | index |
26
26
  | href |
27
+ | css |
27
28
 
28
29
  Scenario: Support for multiple parameters
29
30
  When I select a link labeled "Hello" and index "0"
@@ -32,3 +32,4 @@
32
32
  </div>
33
33
 
34
34
  </body>
35
+ </html>
@@ -58,19 +58,19 @@ Then /^I should know it is not visible$/ do
58
58
  @element.should_not be_visible
59
59
  end
60
60
 
61
- Then /^I should know its' text is "([^"]*)"$/ do |text|
61
+ Then /^I should know the text is "(.*)"$/ do |text|
62
62
  @element.text.should == text
63
63
  end
64
64
 
65
- Then /^I should know its' text includes "([^"]*)"$/ do |text|
65
+ Then /^I should know the text includes "(.*)"$/ do |text|
66
66
  @element.text.should include text
67
67
  end
68
68
 
69
- Then /^I should know its' value is "([^"]*)"$/ do |value|
69
+ Then /^I should know the value is "(.*)"$/ do |value|
70
70
  @element.value.should == value
71
71
  end
72
72
 
73
- Then /^I should know its' value is nil$/ do
73
+ Then /^I should know the value is nil$/ do
74
74
  @element.value.should be_nil
75
75
  end
76
76
 
@@ -78,11 +78,11 @@ Then /^I should know it is equal to itself$/ do
78
78
  @element.should == @element
79
79
  end
80
80
 
81
- Then /^I should know its' tag name is "([^"]*)"$/ do |tagname|
81
+ Then /^I should know the tag name is "(.+)"$/ do |tagname|
82
82
  @element.tag_name.should == tagname
83
83
  end
84
84
 
85
- Then /^I should know the attribute "([^"]*)" is false$/ do |attr_name|
85
+ Then /^I should know the attribute "(.+)" is false$/ do |attr_name|
86
86
  @attr = @element.attribute(attr_name)
87
87
  @attr.should be_false if @attr.is_a? FalseClass
88
88
  @attr.should == "false" if @attr.is_a? String
@@ -155,3 +155,19 @@ end
155
155
  Then /^I should have a div parent$/ do
156
156
  @parent.should be_instance_of ::PageObject::Elements::Div
157
157
  end
158
+
159
+ Then /^I should know that the text_field has the focus$/ do
160
+ element = @page.element_with_focus
161
+ element.should_not be_nil
162
+ element.class.should == PageObject::Elements::TextField
163
+ end
164
+
165
+ When /^I set the focus to the test text_field$/ do
166
+ @page.text_field_element(:id => 'onfocus_text_field').focus
167
+ end
168
+
169
+ When /^I retrieve the label element$/ do
170
+ @element = @page.label_id_element
171
+ end
172
+
173
+
@@ -42,6 +42,10 @@ Then /^I should verify "([^\"]*)" is in the text field for frame 2 using "([^\"]
42
42
  result.should == text
43
43
  end
44
44
 
45
+ #Then /^I should be able to get the text fields text from frame 2 using "([^\"]*)"$/ do |arg_type|
46
+ # @page.send("text_field_2_#{arg_type}_element").text
47
+ #end
48
+
45
49
  When /^I type "([^\"]*)" into the text field from frame 1 using "([^\"]*)"$/ do |text, arg_type|
46
50
  @page.send "text_field_1_#{arg_type}=".to_sym, text
47
51
  end
@@ -0,0 +1,19 @@
1
+ When /^I get the text from the article$/ do
2
+ @text = @page.article_id
3
+ end
4
+
5
+ When /^I get the text from the header$/ do
6
+ @text = @page.header_id
7
+ end
8
+
9
+ When /^I get the text from the footer$/ do
10
+ @text = @page.footer_id
11
+ end
12
+
13
+ When /^I get the text from the summary$/ do
14
+ @text = @page.summary_id
15
+ end
16
+
17
+ When /^I get the text from the details$/ do
18
+ @text = @page.details_id
19
+ end
@@ -0,0 +1,19 @@
1
+ When /^I get the text from the label$/ do
2
+ @text = @page.label_id
3
+ end
4
+
5
+ When /^I search for the label by "([^\"]*)"$/ do |how|
6
+ @text = @page.send "label_#{how}".to_sym
7
+ end
8
+
9
+ When /^I search for the label by "(.*)" and "(.*)"$/ do |param1, param2|
10
+ @text = @page.send "label_#{param1}_#{param2}".to_sym
11
+ end
12
+
13
+ When /^I get the text from a label while the script is executing$/ do
14
+ @text = @page.label_element(:id => 'label_id').text
15
+ end
16
+
17
+ Then /^I should see that the label exists$/ do
18
+ @page.label_id?.should be_true
19
+ end
@@ -54,6 +54,7 @@ class Page
54
54
  link(:google_search_href, :href => "success.html")
55
55
  link(:google_search_text, :text => "Google Search")
56
56
  link(:google_search_index, :index => 0)
57
+ link(:google_search_css, :css => "a.link_class")
57
58
 
58
59
  select_list(:sel_list_id, :id => "sel_list_id")
59
60
  select_list(:sel_list_class, :class => "sel_list_class")
@@ -127,6 +128,7 @@ class Page
127
128
  button(:button_xpath, :xpath=> "//input[@type='submit']")
128
129
  button(:button_text, :text => 'Click Me')
129
130
  button(:button_value, :value => 'Click Me')
131
+ button(:button_css, :css => "input[type='submit']")
130
132
  button(:button_class_index, :class => "button_class", :index => 0)
131
133
  button(:button_name_index, :name => "button_name", :index => 0)
132
134
 
@@ -256,8 +258,23 @@ class Page
256
258
  file_field(:file_field_class_index, :class => 'file_field_class', :index => 0)
257
259
  file_field(:file_field_name_index, :name => 'file_field_name', :index => 0)
258
260
  file_field(:file_field_xpath, :xpath => "//input[@type='file']")
261
+
262
+ label(:label_id, :id => 'label_id')
263
+ label(:label_name, :name => 'label_name')
264
+ label(:label_class, :class => 'label_class')
265
+ label(:label_text, :text => 'page-object is the best!')
266
+ label(:label_index, :index => 0)
267
+ label(:label_xpath, :xpath => '//label')
268
+ label(:label_class_index, :class => "label_class", :index => 0)
269
+ label(:label_name_index, :name => "label_name", :index => 0)
259
270
 
260
271
  link(:open_window, :text => 'New Window')
261
272
  link(:child, :id => 'child')
273
+
274
+ element(:article_id, :article, :id => 'article_id')
275
+ element(:header_id, :header, :id => 'header_id')
276
+ element(:footer_id, :footer, :id => 'footer_id')
277
+ element(:summary_id, :summary, :id => 'summary_id')
278
+ element(:details_id, :details, :id => 'details_id')
262
279
  end
263
280
 
data/lib/page-object.rb CHANGED
@@ -283,6 +283,13 @@ module PageObject
283
283
  platform.attach_to_window(identifier, &block)
284
284
  end
285
285
  end
286
+
287
+ #
288
+ # Find the element that has focus on the page
289
+ #
290
+ def element_with_focus
291
+ platform.element_with_focus
292
+ end
286
293
 
287
294
  #
288
295
  # Refresh to current page
@@ -14,12 +14,15 @@ module PageObject
14
14
  # 'goto' method to take you to the page.
15
15
  #
16
16
  # @param [String] the url for the page.
17
+ # @param [Symbol] a method name to call to get the url
17
18
  #
18
19
  def page_url(url)
19
20
  define_method("goto") do
21
+ url = url.kind_of?(Symbol) ? self.send(url) : url
20
22
  platform.navigate_to url
21
23
  end
22
24
  end
25
+ alias_method :direct_url, :page_url
23
26
 
24
27
  #
25
28
  # Creates a method that compares the expected_title of a page against the actual.
@@ -111,7 +114,7 @@ module PageObject
111
114
  self.send("#{name}_element").value
112
115
  end
113
116
  define_method("#{name}=") do |value|
114
- return platform.text_field_value_set(identifier.clone, value) unless block_given?
117
+ return platform.text_field_value_set(identifier.clone, value) unless block_given?
115
118
  self.send("#{name}_element").value = value
116
119
  end
117
120
  define_method("#{name}_element") do
@@ -261,6 +264,7 @@ module PageObject
261
264
  # @param [Hash] identifier how we find a link. You can use a multiple paramaters
262
265
  # by combining of any of the following except xpath. The valid keys are:
263
266
  # * :class => Watir and Selenium
267
+ # * :css => Watir and Selenium
264
268
  # * :href => Watir and Selenium
265
269
  # * :id => Watir and Selenium
266
270
  # * :index => Watir and Selenium
@@ -392,6 +396,7 @@ module PageObject
392
396
  # @param [Hash] identifier how we find a button. You can use a multiple paramaters
393
397
  # by combining of any of the following except xpath. The valid keys are:
394
398
  # * :class => Watir and Selenium
399
+ # * :css => Watir and Selenium
395
400
  # * :id => Watir and Selenium
396
401
  # * :index => Watir and Selenium
397
402
  # * :name => Watir and Selenium
@@ -982,5 +987,72 @@ module PageObject
982
987
  platform.file_field_for(identifier.clone).exists?
983
988
  end
984
989
  end
990
+
991
+ #
992
+ # adds three methods - one to retrieve the text from a label,
993
+ # another to return the label element, and another to check the label's existence.
994
+ #
995
+ # @example
996
+ # label(:message, :id => 'message')
997
+ # # will generate 'message', 'message_element', and 'message?' methods
998
+ #
999
+ # @param [String] the name used for the generated methods
1000
+ # @param [Hash] identifier how we find a label. You can use a multiple paramaters
1001
+ # by combining of any of the following except xpath. The valid keys are:
1002
+ # * :class => Watir and Selenium
1003
+ # * :id => Watir and Selenium
1004
+ # * :index => Watir and Selenium
1005
+ # * :name => Watir and Selenium
1006
+ # * :text => Watir and Selenium
1007
+ # * :xpath => Watir and Selenium
1008
+ # @param optional block to be invoked when element method is called
1009
+ #
1010
+ def label(name, identifier=nil, &block)
1011
+ define_method(name) do
1012
+ return platform.label_text_for identifier.clone unless block_given?
1013
+ self.send("#{name}_element").text
1014
+ end
1015
+ define_method("#{name}_element") do
1016
+ return call_block(&block) if block_given?
1017
+ platform.label_for(identifier.clone)
1018
+ end
1019
+ define_method("#{name}?") do
1020
+ return call_block(&block).exists? if block_given?
1021
+ platform.label_for(identifier.clone).exists?
1022
+ end
1023
+ alias_method "#{name}_label".to_sym, "#{name}_element".to_sym
1024
+ end
1025
+
1026
+ #
1027
+ # adds three methods - one to retrieve the text of an element, another
1028
+ # to retrieve an element, and another to check the element's existence.
1029
+ #
1030
+ # @example
1031
+ # element(:title, :id => 'title')
1032
+ # # will generate 'title', 'title_element', and 'title?' methods
1033
+ #
1034
+ # @param [String] the name used for the generated methods
1035
+ # @param [Hash] identifier how we find an element. You can use a multiple paramaters
1036
+ # by combining of any of the following except xpath. The valid keys are:
1037
+ # * :class => Watir and Selenium
1038
+ # * :id => Watir and Selenium
1039
+ # * :index => Watir and Selenium
1040
+ # * :name => Watir and Selenium
1041
+ # * :xpath => Watir and Selenium
1042
+ # @param optional block to be invoked when element method is called
1043
+ #
1044
+ def element(name, tag, identifier=nil, &block)
1045
+ define_method("#{name}") do
1046
+ self.send("#{name}_element").text
1047
+ end
1048
+ define_method("#{name}_element") do
1049
+ return call_block(&block) if block_given?
1050
+ platform.element_for(tag, identifier.clone)
1051
+ end
1052
+ define_method("#{name}?") do
1053
+ self.send("#{name}_element").exists?
1054
+ end
1055
+ end
1056
+
985
1057
  end
986
1058
  end
@@ -7,6 +7,7 @@ module PageObject
7
7
  # @param [Hash] identifier how we find a button. You can use a multiple paramaters
8
8
  # by combining of any of the following except xpath. The valid keys are:
9
9
  # * :class => Watir and Selenium
10
+ # * :css => Watir and Selenium
10
11
  # * :id => Watir and Selenium
11
12
  # * :index => Watir and Selenium
12
13
  # * :name => Watir and Selenium
@@ -26,6 +27,7 @@ module PageObject
26
27
  # @param [Hash] identifier how we find a button. You can use a multiple paramaters
27
28
  # by combining of any of the following except xpath. The valid keys are:
28
29
  # * :class => Watir and Selenium
30
+ # * :css => Watir and Selenium
29
31
  # * :id => Watir and Selenium
30
32
  # * :index => Watir and Selenium
31
33
  # * :name => Watir and Selenium
@@ -189,6 +191,7 @@ module PageObject
189
191
  # @param [Hash] identifier how we find a link. You can use a multiple paramaters
190
192
  # by combining of any of the following except xpath. The valid keys are:
191
193
  # * :class => Watir and Selenium
194
+ # * :css => Watir and Selenium
192
195
  # * :href => Watir and Selenium
193
196
  # * :id => Watir and Selenium
194
197
  # * :index => Watir and Selenium
@@ -208,6 +211,7 @@ module PageObject
208
211
  # @param [Hash] identifier how we find a link. You can use a multiple paramaters
209
212
  # by combining of any of the following except xpath. The valid keys are:
210
213
  # * :class => Watir and Selenium
214
+ # * :css => Watir and Selenium
211
215
  # * :href => Watir and Selenium
212
216
  # * :id => Watir and Selenium
213
217
  # * :index => Watir and Selenium
@@ -763,6 +767,38 @@ module PageObject
763
767
  platform.paragraphs_for(identifier.clone)
764
768
  end
765
769
 
770
+ #
771
+ # Finds a label
772
+ #
773
+ # @param [Hash] identifier how we find a label. You can use a multiple paramaters
774
+ # by combining of any of the following except xpath. The valid keys are:
775
+ # * :class => Watir and Selenium
776
+ # * :id => Watir and Selenium
777
+ # * :index => Watir and Selenium
778
+ # * :name => Watir and Selenium
779
+ # * :text => Watir and Selenium
780
+ # * :xpath => Watir and Selenium
781
+ #
782
+ def label_element(identifier)
783
+ platform.label_for(identifier.clone)
784
+ end
785
+
786
+ #
787
+ # Finds all labels that match the provided identifier
788
+ #
789
+ # @param [Hash] identifier how we find a label. You can use a multiple paramaters
790
+ # by combining of any of the following except xpath. The valid keys are:
791
+ # * :class => Watir and Selenium
792
+ # * :id => Watir and Selenium
793
+ # * :index => Watir and Selenium
794
+ # * :name => Watir and Selenium
795
+ # * :text => Watir and Selenium
796
+ # * :xpath => Watir and Selenium
797
+ #
798
+ def label_elements(identifier)
799
+ platform.labels_for(identifier.clone)
800
+ end
801
+
766
802
  #
767
803
  # Finds a paragraph
768
804
  #
@@ -17,7 +17,7 @@ module PageObject
17
17
  # method to return the element for a tag_name
18
18
  #
19
19
  def element_class_for(tag_name, type=nil)
20
- return type_to_class[type] if type
20
+ return type_to_class[type.to_sym] if type
21
21
  tag_to_class[tag_name.to_sym] || ::PageObject::Elements::Element
22
22
  end
23
23
 
@@ -48,5 +48,6 @@ require 'page-object/elements/ordered_list'
48
48
  require 'page-object/elements/option'
49
49
  require 'page-object/elements/heading'
50
50
  require 'page-object/elements/paragraph'
51
+ require 'page-object/elements/label'
51
52
  require 'page-object/elements/file_field'
52
53
 
@@ -11,11 +11,11 @@ module PageObject
11
11
  protected
12
12
 
13
13
  def self.watir_finders
14
- super + [:text, :value, :src, :alt]
14
+ super + [:text, :value, :src, :alt, :css]
15
15
  end
16
16
 
17
17
  def self.selenium_finders
18
- super + [:value, :src, :alt]
18
+ super + [:value, :src, :alt, :css]
19
19
  end
20
20
 
21
21
  def include_platform_for platform
@@ -22,21 +22,21 @@ module PageObject
22
22
  # click the element
23
23
  #
24
24
  def click
25
- @element.click
25
+ element.click
26
26
  end
27
27
 
28
28
  #
29
29
  # double click the element
30
30
  #
31
31
  def double_click
32
- @element.double_click
32
+ element.double_click
33
33
  end
34
34
 
35
35
  #
36
36
  # return true if the element is enabled
37
37
  #
38
38
  def enabled?
39
- @element.enabled?
39
+ element.enabled?
40
40
  end
41
41
 
42
42
  #
@@ -50,11 +50,11 @@ module PageObject
50
50
  # get the value of the given CSS property
51
51
  #
52
52
  def style(property)
53
- @element.style property
53
+ element.style property
54
54
  end
55
55
 
56
56
  def inspect
57
- @element.inspect
57
+ element.inspect
58
58
  end
59
59
 
60
60
  # @private
@@ -105,7 +105,7 @@ module PageObject
105
105
  protected
106
106
 
107
107
  def self.should_build_watir_xpath identifier
108
- ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'].include? identifier[:tag_name] and identifier[:name]
108
+ ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label'].include? identifier[:tag_name] and identifier[:name]
109
109
  end
110
110
 
111
111
  def self.build_xpath_for identifier
@@ -0,0 +1,19 @@
1
+ module PageObject
2
+ module Elements
3
+ class Label < Element
4
+
5
+ protected
6
+
7
+ def self.watir_finders
8
+ super + [:text]
9
+ end
10
+
11
+ def self.selenium_finders
12
+ super + [:text]
13
+ end
14
+
15
+ end
16
+
17
+ ::PageObject::Elements.tag_to_class[:label] = ::PageObject::Elements::Label
18
+ end
19
+ end