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
@@ -12,5 +12,8 @@ module PageObject
12
12
  [:class, :id, :name, :text, :xpath, :index]
13
13
  end
14
14
  end
15
+
16
+ ::PageObject::Elements.tag_to_class[:span] = ::PageObject::Elements::Span
17
+
15
18
  end
16
- end
19
+ end
@@ -57,5 +57,7 @@ module PageObject
57
57
  end
58
58
  end
59
59
  end
60
+
61
+ ::PageObject::Elements.tag_to_class[:table] = ::PageObject::Elements::Table
60
62
  end
61
63
  end
@@ -13,5 +13,9 @@ module PageObject
13
13
  end
14
14
 
15
15
  end
16
+
17
+ ::PageObject::Elements.tag_to_class[:td] = ::PageObject::Elements::TableCell
18
+ ::PageObject::Elements.tag_to_class[:th] = ::PageObject::Elements::TableCell
19
+
16
20
  end
17
- end
21
+ end
@@ -39,5 +39,7 @@ module PageObject
39
39
  end
40
40
  end
41
41
  end
42
+
43
+ ::PageObject::Elements.tag_to_class[:tr] = ::PageObject::Elements::TableRow
42
44
  end
43
45
  end
@@ -39,5 +39,8 @@ module PageObject
39
39
  end
40
40
  end
41
41
  end
42
+
43
+ ::PageObject::Elements.tag_to_class[:textarea] = ::PageObject::Elements::TextArea
44
+
42
45
  end
43
46
  end
@@ -39,5 +39,8 @@ module PageObject
39
39
  end
40
40
  end
41
41
  end
42
+
43
+ ::PageObject::Elements.type_to_class[:text] = ::PageObject::Elements::TextField
44
+ ::PageObject::Elements.type_to_class[:password] = ::PageObject::Elements::TextField
42
45
  end
43
46
  end
@@ -43,7 +43,9 @@ module PageObject
43
43
  raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
44
44
  end
45
45
  end
46
-
47
46
  end
47
+
48
+ ::PageObject::Elements.tag_to_class[:ul] = ::PageObject::Elements::UnorderedList
49
+
48
50
  end
49
51
  end
@@ -31,9 +31,9 @@ module PageObject
31
31
  #
32
32
  def populate_page_with(data)
33
33
  data.each do |key, value|
34
- populate_checkbox(key, value) if is_checkbox?(key)
35
- populate_radiobutton(key, value) if is_radiobutton?(key)
36
- populate_text(key, value) if is_text?(key)
34
+ populate_checkbox(key, value) if is_checkbox?(key) and is_enabled?(key)
35
+ populate_radiobutton(key, value) if is_radiobutton?(key) and is_enabled?(key)
36
+ populate_text(key, value) if is_text?(key) and is_enabled?(key)
37
37
  end
38
38
  end
39
39
 
@@ -64,5 +64,9 @@ module PageObject
64
64
  def is_radiobutton?(key)
65
65
  respond_to?("select_#{key}".to_sym)
66
66
  end
67
+
68
+ def is_enabled?(key)
69
+ self.send("#{key}_element").enabled?
70
+ end
67
71
  end
68
72
  end
@@ -1,3 +1,5 @@
1
+ require 'watir-webdriver/atoms'
2
+
1
3
  module PageObject
2
4
  module Platforms
3
5
  #
@@ -5,6 +7,7 @@ module PageObject
5
7
  #
6
8
  module SeleniumWebDriver
7
9
  module Element
10
+ include Watir::Atoms
8
11
 
9
12
  #
10
13
  # return true if an element is visible
@@ -88,6 +91,36 @@ module PageObject
88
91
  @element.attribute attribute_name
89
92
  end
90
93
 
94
+ #
95
+ # Fire the provided event on the current element
96
+ #
97
+ def fire_event(event_name)
98
+ event_name = event_name.to_s.sub(/^on/, '').downcase
99
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:fireEvent)
100
+ bridge = @element.instance_variable_get(:@bridge)
101
+ bridge.executeScript(script, @element, event_name)
102
+ end
103
+
104
+ #
105
+ # find the parent element
106
+ #
107
+ def parent
108
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:getParentElement)
109
+ bridge = @element.instance_variable_get(:@bridge)
110
+ parent = bridge.executeScript(script, @element)
111
+ type = @element.type if parent.tag_name.to_sym == :input
112
+ cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
113
+ cls.new(parent, :platform => :selenium_webdriver)
114
+ end
115
+
116
+ #
117
+ # Set the focus to the current element
118
+ #
119
+ def focus
120
+ bridge = @element.instance_variable_get(:@bridge)
121
+ bridge.executeScript("return arguments[0].focus()", @element)
122
+ end
123
+
91
124
  #
92
125
  # Click this element
93
126
  #
@@ -800,18 +800,20 @@ module PageObject
800
800
 
801
801
  def supported_identifier(identifier, tag, additional)
802
802
  return false if identifier[:index]
803
- return false if identifier[:text] and tag == 'input' and additional[:type] == 'hidden'
803
+ return false if identifier[:action] and tag == 'form'
804
+ return false if identifier[:alt] and tag == 'img'
805
+ return false if identifier[:alt] and tag == 'input' and
806
+ ['submit', 'image', 'button', 'reset'].include? additional[:type]
804
807
  return false if identifier[:href] and tag == 'a'
808
+ return false if identifier[:src] and tag == 'input' and
809
+ ['submit', 'image', 'button', 'reset'].include? additional[:type]
810
+ return false if identifier[:src] and tag == 'img'
811
+ return false if identifier[:text] and tag == 'input' and additional[:type] == 'hidden'
805
812
  return false if identifier[:text] and ['div', 'span', 'td'].include? tag
806
- return false if identifier[:value] and tag == 'input' and additional[:type] == 'submit'
807
- return false if identifier[:src] and tag == 'input' and additional[:type] == 'submit'
808
- return false if identifier[:alt] and tag == 'input' and additional[:type] == 'submit'
809
813
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'text'
810
- return false if identifier[:value] and tag == 'input' and additional[:type] == 'radio'
811
814
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'file'
812
- return false if identifier[:action] and tag == 'form'
813
- return false if identifier[:alt] and tag == 'img'
814
- return false if identifier[:src] and tag == 'img'
815
+ return false if identifier[:value] and tag == 'input' and
816
+ ['radio', 'submit', 'image', 'button', 'reset', 'checkbox', 'hidden'].include? additional[:type]
815
817
  true
816
818
  end
817
819
 
@@ -88,6 +88,30 @@ module PageObject
88
88
  @element.attribute_value attribute_name
89
89
  end
90
90
 
91
+ #
92
+ # Fire the provided event on the current element
93
+ #
94
+ def fire_event(event_name)
95
+ @element.fire_event(event_name)
96
+ end
97
+
98
+ #
99
+ # find the parent element
100
+ #
101
+ def parent
102
+ parent = @element.parent
103
+ type = @element.type if parent.tag_name.to_sym == :input
104
+ cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
105
+ cls.new(parent, :platform => :watir_webdriver)
106
+ end
107
+
108
+ #
109
+ # Set the focus to the current element
110
+ #
111
+ def focus
112
+ @element.focus
113
+ end
114
+
91
115
  #
92
116
  # Waits until the element is present
93
117
  #
@@ -5,7 +5,7 @@ module PageObject
5
5
  module FileField
6
6
 
7
7
  #
8
- # Set the value of the Fileield
8
+ # Set the value of the FileField
9
9
  #
10
10
  def value=(new_value)
11
11
  element.set(new_value)
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.5.4"
3
+ VERSION = "0.5.5"
4
4
  end
@@ -23,6 +23,22 @@ describe PageObject::Elements::Button do
23
23
  describe "interface" do
24
24
  let(:button_element) { double('button_element') }
25
25
 
26
+ it "should register with type :submit" do
27
+ ::PageObject::Elements.element_class_for(:input, :submit).should == ::PageObject::Elements::Button
28
+ end
29
+
30
+ it "should register with type :image" do
31
+ ::PageObject::Elements.element_class_for(:input, :image).should == ::PageObject::Elements::Button
32
+ end
33
+
34
+ it "should register with type :button" do
35
+ ::PageObject::Elements.element_class_for(:input, :button).should == ::PageObject::Elements::Button
36
+ end
37
+
38
+ it "should retisger with type :reset" do
39
+ ::PageObject::Elements.element_class_for(:input, :reset).should == ::PageObject::Elements::Button
40
+ end
41
+
26
42
  context "for selenium" do
27
43
  it "should return error when asked for its' text" do
28
44
  button = PageObject::Elements::Button.new(button_element, :platform => :selenium_webdriver)
@@ -6,13 +6,13 @@ describe PageObject::Elements::CheckBox do
6
6
 
7
7
  describe "when mapping how to find an element" do
8
8
  it "should map watir types to same" do
9
- [:class, :id, :index, :name, :xpath].each do |t|
9
+ [:class, :id, :index, :name, :xpath, :value].each do |t|
10
10
  identifier = checkbox.watir_identifier_for t => 'value'
11
11
  identifier.keys.first.should == t
12
12
  end
13
13
  end
14
14
  it "should map selenium types to same" do
15
- [:class, :id, :name, :xpath, :index].each do |t|
15
+ [:class, :id, :name, :xpath, :index, :value].each do |t|
16
16
  key, value = checkbox.selenium_identifier_for t => 'value'
17
17
  key.should == t
18
18
  end
@@ -23,6 +23,9 @@ describe PageObject::Elements::CheckBox do
23
23
  let(:check_box) { double('check_box') }
24
24
  let(:selenium_cb) { PageObject::Elements::CheckBox.new(check_box, :platform => :selenium_webdriver) }
25
25
 
26
+ it "should register with type :checkbox" do
27
+ ::PageObject::Elements.element_class_for(:input, :checkbox).should == ::PageObject::Elements::CheckBox
28
+ end
26
29
 
27
30
  context "for selenium" do
28
31
  it "should check" do
@@ -18,5 +18,11 @@ describe PageObject::Elements::Div do
18
18
  key.should == t
19
19
  end
20
20
  end
21
+
22
+ describe "interface" do
23
+ it "should register with tag :div" do
24
+ ::PageObject::Elements.element_class_for(:div).should == ::PageObject::Elements::Div
25
+ end
26
+ end
21
27
  end
22
- end
28
+ end
@@ -23,6 +23,10 @@ describe PageObject::Elements::FileField do
23
23
 
24
24
  describe "interface" do
25
25
  let(:filefield) { double('file_field') }
26
+
27
+ it "should register as type :file" do
28
+ ::PageObject::Elements.element_class_for(:input, :file).should == ::PageObject::Elements::FileField
29
+ end
26
30
 
27
31
  context "for selenium" do
28
32
  it "should set its' value" do
@@ -5,6 +5,10 @@ describe PageObject::Elements::Form do
5
5
  describe "interface" do
6
6
  let(:form_element) { double('form_element') }
7
7
 
8
+ it "should register with tag_name :form" do
9
+ ::PageObject::Elements.element_class_for(:form).should == ::PageObject::Elements::Form
10
+ end
11
+
8
12
  context "for watir" do
9
13
  it "should submit a form" do
10
14
  form = PageObject::Elements::Form.new(form_element, :platform => :watir_webdriver)
@@ -21,4 +25,4 @@ describe PageObject::Elements::Form do
21
25
  end
22
26
  end
23
27
  end
24
- end
28
+ end
@@ -19,4 +19,30 @@ describe PageObject::Elements::Heading do
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+
23
+ describe "interface" do
24
+ it "should register with tag :h1" do
25
+ ::PageObject::Elements.element_class_for(:h1).should == ::PageObject::Elements::Heading
26
+ end
27
+
28
+ it "should register with tag :h2" do
29
+ ::PageObject::Elements.element_class_for(:h2).should == ::PageObject::Elements::Heading
30
+ end
31
+
32
+ it "should register with tag :h3" do
33
+ ::PageObject::Elements.element_class_for(:h3).should == ::PageObject::Elements::Heading
34
+ end
35
+
36
+ it "should register with tag :h4" do
37
+ ::PageObject::Elements.element_class_for(:h4).should == ::PageObject::Elements::Heading
38
+ end
39
+
40
+ it "should register with tag :h5" do
41
+ ::PageObject::Elements.element_class_for(:h5).should == ::PageObject::Elements::Heading
42
+ end
43
+
44
+ it "should register with tag :h6" do
45
+ ::PageObject::Elements.element_class_for(:h6).should == ::PageObject::Elements::Heading
46
+ end
47
+ end
48
+ end
@@ -6,7 +6,7 @@ describe PageObject::Elements::HiddenField do
6
6
 
7
7
  describe "when mapping how to find an element" do
8
8
  it "should map watir types to same" do
9
- [:class, :id, :index, :name, :tag_name, :text, :xpath].each do |t|
9
+ [:class, :id, :index, :name, :tag_name, :text, :xpath, :value].each do |t|
10
10
  identifier = hiddenfield.watir_identifier_for t => 'value'
11
11
  identifier.keys.first.should == t
12
12
  end
@@ -18,7 +18,7 @@ describe PageObject::Elements::HiddenField do
18
18
  end
19
19
 
20
20
  it "should map selenium types to same" do
21
- [:class, :css, :id, :name, :xpath, :index].each do |t|
21
+ [:class, :css, :id, :name, :xpath, :index, :value].each do |t|
22
22
  key, value = hiddenfield.selenium_identifier_for t => 'value'
23
23
  key.should == t
24
24
  end
@@ -29,4 +29,10 @@ describe PageObject::Elements::HiddenField do
29
29
  key.should == :css
30
30
  end
31
31
  end
32
- end
32
+
33
+ describe "interface" do
34
+ it "should register with type :hidden" do
35
+ ::PageObject::Elements.element_class_for(:input, :hidden).should == ::PageObject::Elements::HiddenField
36
+ end
37
+ end
38
+ end
@@ -27,6 +27,10 @@ describe PageObject::Elements::Image do
27
27
  image_element.stub(:size).and_return(image_element)
28
28
  end
29
29
 
30
+ it "should register with tag_name :img" do
31
+ ::PageObject::Elements.element_class_for(:img).should == ::PageObject::Elements::Image
32
+ end
33
+
30
34
  context "for watir" do
31
35
  it "should know the images width" do
32
36
  image = PageObject::Elements::Image.new(image_element, :platform => :watir_webdriver)
@@ -35,6 +35,10 @@ describe PageObject::Elements::Link do
35
35
  describe "interface" do
36
36
  let(:link_element) { double('link_element') }
37
37
 
38
+ it "should register with tag :a" do
39
+ ::PageObject::Elements.element_class_for(:a).should == ::PageObject::Elements::Link
40
+ end
41
+
38
42
  context "for selenium" do
39
43
  it "should return error when asked for its' value" do
40
44
  link = PageObject::Elements::Link.new(link_element, :platform => :selenium_webdriver)
@@ -42,4 +46,4 @@ describe PageObject::Elements::Link do
42
46
  end
43
47
  end
44
48
  end
45
- end
49
+ end
@@ -18,5 +18,11 @@ describe PageObject::Elements::ListItem do
18
18
  key.should == t
19
19
  end
20
20
  end
21
+
22
+ describe "interface" do
23
+ it "should register as tag_name :li" do
24
+ ::PageObject::Elements.element_class_for(:li).should == ::PageObject::Elements::ListItem
25
+ end
26
+ end
21
27
  end
22
- end
28
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Option do
5
+
6
+ describe "interface" do
7
+ it "should register as tag_name :option" do
8
+ ::PageObject::Elements.element_class_for(:option).should == ::PageObject::Elements::Option
9
+ end
10
+ end
11
+ end
@@ -23,6 +23,10 @@ describe PageObject::Elements::OrderedList do
23
23
  describe "interface" do
24
24
  let(:ol_element) { double('ol_element') }
25
25
 
26
+ it "should register as tag_name :ol" do
27
+ ::PageObject::Elements.element_class_for(:ol).should == ::PageObject::Elements::OrderedList
28
+ end
29
+
26
30
  context "for watir" do
27
31
  it "should return a list item when indexed" do
28
32
  ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
@@ -76,4 +80,4 @@ describe PageObject::Elements::OrderedList do
76
80
  end
77
81
  end
78
82
  end
79
- end
83
+ end