page-object 0.5.4 → 0.5.5

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 (67) hide show
  1. data/ChangeLog +10 -0
  2. data/features/check_box.feature +1 -0
  3. data/features/element.feature +13 -0
  4. data/features/hidden_field.feature +1 -0
  5. data/features/html/static_elements.html +7 -0
  6. data/features/nested_elements.feature +1 -1
  7. data/features/step_definitions/element_steps.rb +24 -0
  8. data/features/support/env.rb +0 -25
  9. data/features/support/hooks.rb +7 -0
  10. data/features/support/page.rb +3 -1
  11. data/features/support/persistent_browser.rb +16 -0
  12. data/lib/page-object/accessors.rb +2 -0
  13. data/lib/page-object/elements.rb +29 -0
  14. data/lib/page-object/elements/button.rb +5 -0
  15. data/lib/page-object/elements/check_box.rb +11 -0
  16. data/lib/page-object/elements/div.rb +3 -1
  17. data/lib/page-object/elements/element.rb +2 -1
  18. data/lib/page-object/elements/file_field.rb +3 -0
  19. data/lib/page-object/elements/form.rb +2 -0
  20. data/lib/page-object/elements/heading.rb +9 -1
  21. data/lib/page-object/elements/hidden_field.rb +5 -3
  22. data/lib/page-object/elements/image.rb +3 -1
  23. data/lib/page-object/elements/link.rb +3 -0
  24. data/lib/page-object/elements/list_item.rb +4 -1
  25. data/lib/page-object/elements/option.rb +3 -0
  26. data/lib/page-object/elements/ordered_list.rb +2 -0
  27. data/lib/page-object/elements/paragraph.rb +3 -1
  28. data/lib/page-object/elements/radio_button.rb +2 -0
  29. data/lib/page-object/elements/select_list.rb +2 -0
  30. data/lib/page-object/elements/span.rb +4 -1
  31. data/lib/page-object/elements/table.rb +2 -0
  32. data/lib/page-object/elements/table_cell.rb +5 -1
  33. data/lib/page-object/elements/table_row.rb +2 -0
  34. data/lib/page-object/elements/text_area.rb +3 -0
  35. data/lib/page-object/elements/text_field.rb +3 -0
  36. data/lib/page-object/elements/unordered_list.rb +3 -1
  37. data/lib/page-object/page_populator.rb +7 -3
  38. data/lib/page-object/platforms/selenium_webdriver/element.rb +33 -0
  39. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +10 -8
  40. data/lib/page-object/platforms/watir_webdriver/element.rb +24 -0
  41. data/lib/page-object/platforms/watir_webdriver/file_field.rb +1 -1
  42. data/lib/page-object/version.rb +1 -1
  43. data/spec/page-object/elements/button_spec.rb +16 -0
  44. data/spec/page-object/elements/check_box_spec.rb +5 -2
  45. data/spec/page-object/elements/div_spec.rb +7 -1
  46. data/spec/page-object/elements/file_field_spec.rb +4 -0
  47. data/spec/page-object/elements/form_spec.rb +5 -1
  48. data/spec/page-object/elements/heading_spec.rb +27 -1
  49. data/spec/page-object/elements/hidden_field_spec.rb +9 -3
  50. data/spec/page-object/elements/image_spec.rb +4 -0
  51. data/spec/page-object/elements/link_spec.rb +5 -1
  52. data/spec/page-object/elements/list_item_spec.rb +7 -1
  53. data/spec/page-object/elements/option_spec.rb +11 -0
  54. data/spec/page-object/elements/ordered_list_spec.rb +5 -1
  55. data/spec/page-object/elements/paragraph_spec.rb +28 -0
  56. data/spec/page-object/elements/radio_button_spec.rb +5 -0
  57. data/spec/page-object/elements/select_list_spec.rb +4 -0
  58. data/spec/page-object/elements/selenium_element_spec.rb +24 -1
  59. data/spec/page-object/elements/span_spec.rb +5 -1
  60. data/spec/page-object/elements/table_cell_spec.rb +15 -0
  61. data/spec/page-object/elements/table_row_spec.rb +6 -1
  62. data/spec/page-object/elements/table_spec.rb +4 -0
  63. data/spec/page-object/elements/text_area_spec.rb +6 -1
  64. data/spec/page-object/elements/text_field_spec.rb +8 -0
  65. data/spec/page-object/elements/unordered_list_spec.rb +5 -1
  66. data/spec/page-object/page_populator_spec.rb +31 -2
  67. metadata +22 -12
data/ChangeLog CHANGED
@@ -1,3 +1,13 @@
1
+ === Version 0.5.5 / 2011-12-27
2
+ * Enhancements
3
+ * Added ability to find Checkbox by :value
4
+ * Added ability to find HiddenField by :value
5
+ * Added ability to find a parent of an Element
6
+ * Added #fire_event method to Element
7
+ * Added #focus method to Element
8
+ * Fixes
9
+ * Updated #populate_page_with to no longer attempt to set a value in a field that is disabled
10
+
1
11
  === Version 0.5.4 / 2011-12-18
2
12
  * Enhancements
3
13
  * Added deprecation warning to the method_missing method on Element. This ability will be removed in 0.6
@@ -23,6 +23,7 @@ Feature: Check Box
23
23
  | name |
24
24
  | xpath |
25
25
  | index |
26
+ | value |
26
27
 
27
28
  Scenario Outline: Locating check boxes using multiple parameters
28
29
  When I search for the check box by "<param1>" and "<param2>"
@@ -253,3 +253,16 @@ Feature: Elements
253
253
  And I should know its' tag name is "h1"
254
254
  And I should know the attribute "readonly" is false
255
255
  And I should be able to click it
256
+
257
+ Scenario: Firing an event
258
+ When I set the focus to the test text_field using the onfocus event
259
+ Then I should see the onfocus text "changed by onfocus event"
260
+
261
+ Scenario: Setting focus on an element
262
+ When I set the focus on the test text_field
263
+ Then I should see the onfocus text "changed by onfocus event"
264
+
265
+ Scenario: Finding a parent element
266
+ When I find the child link element
267
+ And ask for the parent element
268
+ Then I should have a div parent
@@ -21,6 +21,7 @@ Feature: Hidden Fields
21
21
  | tag_name |
22
22
  | index |
23
23
  | text |
24
+ | value |
24
25
 
25
26
  Scenario Outline: Locating a hidden field using multiple parameters
26
27
  When I search for the hidden field by "<param1>" and "<param2>"
@@ -87,6 +87,13 @@
87
87
  <h6 id="h6_id" class="h6_class" name="h6_name">h6's are cool</h6>
88
88
 
89
89
  <a href="success.html" target="_blank">New Window</a>
90
+
91
+ <input type="text" id="onfocus_text_field" onfocus="document.getElementById('onfocus_test').innerHTML = 'changed by onfocus event'"/>
92
+ <div id="onfocus_test"></div>
93
+
94
+ <div id="parent_div">
95
+ <a href="success.html" id="child">Success</a>
96
+ </div>
90
97
  </body>
91
98
  </html>
92
99
 
@@ -103,4 +103,4 @@ Feature: Nested Elements
103
103
  Scenario: Finding a paragraph within a div
104
104
  When I search for a paragraph located in a div
105
105
  Then I should see the nested paragraphs text should be "This is a paragraph."
106
-
106
+
@@ -123,3 +123,27 @@ end
123
123
  Then /^it should know it is not enabled$/ do
124
124
  @element.should_not be_enabled
125
125
  end
126
+
127
+ When /^I set the focus to the test text_field using the onfocus event$/ do
128
+ @page.text_field_element(:id => 'onfocus_text_field').fire_event('onfocus')
129
+ end
130
+
131
+ Then /^I should see the onfocus text "([^\"]*)"$/ do |text|
132
+ @page.div_element(:id => 'onfocus_test').text.should == text
133
+ end
134
+
135
+ When /^I set the focus on the test text_field$/ do
136
+ @page.text_field_element(:id => 'onfocus_text_field').focus
137
+ end
138
+
139
+ When /^I find the child link element$/ do
140
+ @element = @page.child_element
141
+ end
142
+
143
+ When /^ask for the parent element$/ do
144
+ @parent = @element.parent
145
+ end
146
+
147
+ Then /^I should have a div parent$/ do
148
+ @parent.should be_instance_of ::PageObject::Elements::Div
149
+ end
@@ -3,30 +3,5 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../../', 'lib'))
3
3
  require 'rspec/expectations'
4
4
  require 'watir-webdriver'
5
5
  require 'selenium-webdriver'
6
-
7
6
  require 'page-object'
8
7
 
9
-
10
-
11
- Before do
12
- @browser = PageObject::PersistantBrowser.get_browser
13
- end
14
- at_exit do
15
- PageObject::PersistantBrowser.quit
16
- end
17
-
18
- module PageObject
19
- module PersistantBrowser
20
- @@browser = false
21
- def self.get_browser
22
- if !@@browser
23
- @@browser = Watir::Browser.new :firefox if ENV['DRIVER'] == 'WATIR'
24
- @@browser = Selenium::WebDriver.for :firefox if ENV['DRIVER'] == 'SELENIUM'
25
- end
26
- @@browser
27
- end
28
- def self.quit
29
- @@browser.quit
30
- end
31
- end
32
- end
@@ -0,0 +1,7 @@
1
+
2
+ Before do
3
+ @browser = PageObject::PersistantBrowser.get_browser
4
+ end
5
+ at_exit do
6
+ PageObject::PersistantBrowser.quit
7
+ end
@@ -38,7 +38,7 @@ class Page
38
38
  hidden_field(:hidden_field_tag_name, :tag_name => "input[type='hidden']")
39
39
  hidden_field(:hidden_field_index, :index => 0)
40
40
  hidden_field(:hidden_field_text, :text => "")
41
- hidden_field(:hidden_field_value, :value => "")
41
+ hidden_field(:hidden_field_value, :value => "12345")
42
42
  hidden_field(:hidden_field_class_index, :class => "hidden_field_class", :index => 0)
43
43
  hidden_field(:hidden_field_name_index, :name => "hidden_field_name", :index => 0)
44
44
 
@@ -67,6 +67,7 @@ class Page
67
67
  checkbox(:cb_class, :class => 'cb_class')
68
68
  checkbox(:cb_index, :index => 0)
69
69
  checkbox(:cb_xpath, :xpath => "//input[@type='checkbox']")
70
+ checkbox(:cb_value, :value => '1')
70
71
  checkbox(:cb_class_index, :class => "cb_class", :index => 0)
71
72
  checkbox(:cb_name_index, :name => "cb_name", :index => 0)
72
73
 
@@ -254,5 +255,6 @@ class Page
254
255
  file_field(:file_field_xpath, :xpath => "//input[@type='file']")
255
256
 
256
257
  link(:open_window, :text => 'New Window')
258
+ link(:child, :id => 'child')
257
259
  end
258
260
 
@@ -0,0 +1,16 @@
1
+
2
+ module PageObject
3
+ module PersistantBrowser
4
+ @@browser = false
5
+ def self.get_browser
6
+ if !@@browser
7
+ @@browser = Watir::Browser.new :firefox if ENV['DRIVER'] == 'WATIR'
8
+ @@browser = Selenium::WebDriver.for :firefox if ENV['DRIVER'] == 'SELENIUM'
9
+ end
10
+ @@browser
11
+ end
12
+ def self.quit
13
+ @@browser.quit
14
+ end
15
+ end
16
+ end
@@ -102,6 +102,7 @@ module PageObject
102
102
  # * :name => Watir and Selenium
103
103
  # * :tag_name => Watir and Selenium
104
104
  # * :text => Watir and Selenium
105
+ # * :value => Watir and Selenium
105
106
  # * :xpath => Watir and Selenium
106
107
  # @param optional block to be invoked when element method is called
107
108
  #
@@ -242,6 +243,7 @@ module PageObject
242
243
  # * :id => Watir and Selenium
243
244
  # * :index => Watir and Selenium
244
245
  # * :name => Watir and Selenium
246
+ # * :value => Watir and Selenium
245
247
  # * :xpath => Watir and Selenium
246
248
  # @param optional block to be invoked when element method is called
247
249
  #
@@ -1,3 +1,31 @@
1
+ module PageObject
2
+ module Elements
3
+ class << self
4
+
5
+ #
6
+ # method to return the collection of tag_name to class mappings
7
+ #
8
+ def tag_to_class
9
+ @tag_to_class ||= {}
10
+ end
11
+
12
+ def type_to_class
13
+ @type_to_class ||= {}
14
+ end
15
+
16
+ #
17
+ # method to return the element for a tag_name
18
+ #
19
+ def element_class_for(tag_name, type=nil)
20
+ return type_to_class[type] if type
21
+ tag_to_class[tag_name.to_sym] || ::PageObject::Elements::Element
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+
28
+
1
29
  require 'page-object/elements/element'
2
30
  require 'page-object/elements/link'
3
31
  require 'page-object/elements/text_field'
@@ -21,3 +49,4 @@ require 'page-object/elements/option'
21
49
  require 'page-object/elements/heading'
22
50
  require 'page-object/elements/paragraph'
23
51
  require 'page-object/elements/file_field'
52
+
@@ -26,5 +26,10 @@ module PageObject
26
26
  end
27
27
  end
28
28
  end
29
+
30
+ ::PageObject::Elements.type_to_class[:submit] = ::PageObject::Elements::Button
31
+ ::PageObject::Elements.type_to_class[:image] = ::PageObject::Elements::Button
32
+ ::PageObject::Elements.type_to_class[:button] = ::PageObject::Elements::Button
33
+ ::PageObject::Elements.type_to_class[:reset] = ::PageObject::Elements::Button
29
34
  end
30
35
  end
@@ -9,6 +9,14 @@ module PageObject
9
9
  end
10
10
 
11
11
  protected
12
+
13
+ def self.watir_finders
14
+ super + [:value]
15
+ end
16
+
17
+ def self.selenium_finders
18
+ super + [:value]
19
+ end
12
20
 
13
21
  def include_platform_for platform
14
22
  super
@@ -23,5 +31,8 @@ module PageObject
23
31
  end
24
32
  end
25
33
  end
34
+
35
+ ::PageObject::Elements.type_to_class[:checkbox] = ::PageObject::Elements::CheckBox
36
+
26
37
  end
27
38
  end
@@ -13,5 +13,7 @@ module PageObject
13
13
  end
14
14
 
15
15
  end
16
+
17
+ ::PageObject::Elements.tag_to_class[:div] = ::PageObject::Elements::Div
16
18
  end
17
- end
19
+ end
@@ -1,3 +1,4 @@
1
+ require 'page-object/nested_elements'
1
2
 
2
3
  module PageObject
3
4
  module Elements
@@ -8,7 +9,7 @@ module PageObject
8
9
  # @see PageObject::Platforms::SeleniumWebDriver::Element for the Selenium version of all common methods
9
10
  #
10
11
  class Element
11
- include Object::PageObject::NestedElements
12
+ include ::PageObject::NestedElements
12
13
 
13
14
  attr_reader :element
14
15
 
@@ -31,5 +31,8 @@ module PageObject
31
31
  end
32
32
  end
33
33
  end
34
+
35
+ ::PageObject::Elements.type_to_class[:file] = ::PageObject::Elements::FileField
36
+
34
37
  end
35
38
  end
@@ -30,5 +30,7 @@ module PageObject
30
30
  end
31
31
  end
32
32
  end
33
+
34
+ ::PageObject::Elements.tag_to_class[:form] = ::PageObject::Elements::Form
33
35
  end
34
36
  end
@@ -3,5 +3,13 @@ module PageObject
3
3
  class Heading < Element
4
4
 
5
5
  end
6
+
7
+ ::PageObject::Elements.tag_to_class[:h1] = ::PageObject::Elements::Heading
8
+ ::PageObject::Elements.tag_to_class[:h2] = ::PageObject::Elements::Heading
9
+ ::PageObject::Elements.tag_to_class[:h3] = ::PageObject::Elements::Heading
10
+ ::PageObject::Elements.tag_to_class[:h4] = ::PageObject::Elements::Heading
11
+ ::PageObject::Elements.tag_to_class[:h5] = ::PageObject::Elements::Heading
12
+ ::PageObject::Elements.tag_to_class[:h6] = ::PageObject::Elements::Heading
13
+
6
14
  end
7
- end
15
+ end
@@ -9,7 +9,7 @@ module PageObject
9
9
  protected
10
10
 
11
11
  def self.watir_finders
12
- super + [:tag_name, :text]
12
+ super + [:tag_name, :text, :value]
13
13
  end
14
14
 
15
15
  def self.watir_mapping
@@ -17,12 +17,14 @@ module PageObject
17
17
  end
18
18
 
19
19
  def self.selenium_finders
20
- super + [:css]
20
+ super + [:css, :value]
21
21
  end
22
22
 
23
23
  def self.selenium_mapping
24
24
  super.merge({:tag_name => :css})
25
25
  end
26
26
  end
27
+
28
+ ::PageObject::Elements.type_to_class[:hidden] = ::PageObject::Elements::HiddenField
27
29
  end
28
- end
30
+ end
@@ -28,7 +28,9 @@ module PageObject
28
28
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
29
29
  end
30
30
  end
31
-
32
31
  end
32
+
33
+ ::PageObject::Elements.tag_to_class[:img] = ::PageObject::Elements::Image
34
+
33
35
  end
34
36
  end
@@ -34,5 +34,8 @@ module PageObject
34
34
  end
35
35
  end
36
36
  end
37
+
38
+ ::PageObject::Elements.tag_to_class[:a] = ::PageObject::Elements::Link
39
+
37
40
  end
38
41
  end
@@ -3,5 +3,8 @@ module PageObject
3
3
  class ListItem < Element
4
4
 
5
5
  end
6
+
7
+ ::PageObject::Elements.tag_to_class[:li] = ::PageObject::Elements::ListItem
8
+
6
9
  end
7
- end
10
+ end
@@ -3,5 +3,8 @@ module PageObject
3
3
  class Option < Element
4
4
 
5
5
  end
6
+
7
+ ::PageObject::Elements.tag_to_class[:option] = ::PageObject::Elements::Option
8
+
6
9
  end
7
10
  end
@@ -44,5 +44,7 @@ module PageObject
44
44
  end
45
45
 
46
46
  end
47
+
48
+ ::PageObject::Elements.tag_to_class[:ol] = ::PageObject::Elements::OrderedList
47
49
  end
48
50
  end
@@ -3,5 +3,7 @@ module PageObject
3
3
  class Paragraph < Element
4
4
 
5
5
  end
6
+
7
+ ::PageObject::Elements.tag_to_class[:p] = ::PageObject::Elements::Paragraph
6
8
  end
7
- end
9
+ end
@@ -31,5 +31,7 @@ module PageObject
31
31
  end
32
32
  end
33
33
  end
34
+
35
+ ::PageObject::Elements.type_to_class[:radio] = ::PageObject::Elements::RadioButton
34
36
  end
35
37
  end
@@ -32,5 +32,7 @@ module PageObject
32
32
  end
33
33
 
34
34
  end
35
+
36
+ ::PageObject::Elements.tag_to_class[:select] = ::PageObject::Elements::SelectList
35
37
  end
36
38
  end