page-object 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
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