meeane-page-object 0.1.8
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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +10 -0
- data/ChangeLog +790 -0
- data/Gemfile +13 -0
- data/Guardfile +20 -0
- data/LICENSE +20 -0
- data/README.md +141 -0
- data/Rakefile +35 -0
- data/cucumber.yml +10 -0
- data/features/area.feature +35 -0
- data/features/async.feature +30 -0
- data/features/audio.feature +68 -0
- data/features/button.feature +87 -0
- data/features/canvas.feature +37 -0
- data/features/check_box.feature +55 -0
- data/features/div.feature +45 -0
- data/features/element.feature +322 -0
- data/features/file_field.feature +40 -0
- data/features/form.feature +43 -0
- data/features/frames.feature +75 -0
- data/features/generic_elements.feature +29 -0
- data/features/gxt_table_extension.feature +24 -0
- data/features/headings.feature +97 -0
- data/features/hidden_field.feature +45 -0
- data/features/html/04-Death_Becomes_Fur.mp4 +0 -0
- data/features/html/04-Death_Becomes_Fur.oga +0 -0
- data/features/html/async.html +36 -0
- data/features/html/double_click.html +13 -0
- data/features/html/failure.html +8 -0
- data/features/html/frame_1.html +18 -0
- data/features/html/frame_2.html +16 -0
- data/features/html/frame_3.html +14 -0
- data/features/html/frames.html +12 -0
- data/features/html/hover.html +12 -0
- data/features/html/iframes.html +12 -0
- data/features/html/images/circle.png +0 -0
- data/features/html/images/img_pulpit.jpg +0 -0
- data/features/html/images/submit.gif +0 -0
- data/features/html/indexed_property.html +52 -0
- data/features/html/modal.html +17 -0
- data/features/html/modal_1.html +38 -0
- data/features/html/modal_2.html +27 -0
- data/features/html/movie.mp4 +0 -0
- data/features/html/movie.ogg +0 -0
- data/features/html/multi_elements.html +144 -0
- data/features/html/nested_elements.html +77 -0
- data/features/html/nested_frame_1.html +1 -0
- data/features/html/nested_frame_2.html +11 -0
- data/features/html/nested_frame_3.html +14 -0
- data/features/html/nested_frames.html +10 -0
- data/features/html/planets.gif +0 -0
- data/features/html/static_elements.html +206 -0
- data/features/html/success.html +8 -0
- data/features/html/sun.gif +0 -0
- data/features/html/sun.html +7 -0
- data/features/image.feature +50 -0
- data/features/indexed_property.feature +98 -0
- data/features/javascript.feature +28 -0
- data/features/label.feature +46 -0
- data/features/link.feature +52 -0
- data/features/list_item.feature +36 -0
- data/features/modal_dialog.feature +15 -0
- data/features/multi_elements.feature +486 -0
- data/features/nested_elements.feature +117 -0
- data/features/ordered_list.feature +56 -0
- data/features/page_level_actions.feature +90 -0
- data/features/paragraph.feature +35 -0
- data/features/radio_button.feature +58 -0
- data/features/radio_button_group.feature +29 -0
- data/features/sample-app/public/jquery-1.3.2.js +4376 -0
- data/features/sample-app/public/jquery.html +30 -0
- data/features/sample-app/public/prototype-1.6.0.3.js +4320 -0
- data/features/sample-app/public/prototype.html +35 -0
- data/features/sample-app/sample_app.rb +35 -0
- data/features/select_list.feature +86 -0
- data/features/span.feature +37 -0
- data/features/step_definitions/accessor_steps.rb +60 -0
- data/features/step_definitions/area_steps.rb +19 -0
- data/features/step_definitions/async_steps.rb +83 -0
- data/features/step_definitions/audio_steps.rb +27 -0
- data/features/step_definitions/button_steps.rb +43 -0
- data/features/step_definitions/canvas_steps.rb +15 -0
- data/features/step_definitions/check_box_steps.rb +35 -0
- data/features/step_definitions/div_steps.rb +19 -0
- data/features/step_definitions/element_steps.rb +266 -0
- data/features/step_definitions/file_field_steps.rb +19 -0
- data/features/step_definitions/form_steps.rb +19 -0
- data/features/step_definitions/frames_steps.rb +159 -0
- data/features/step_definitions/generic_element_steps.rb +31 -0
- data/features/step_definitions/gxt_table_steps.rb +58 -0
- data/features/step_definitions/headings_steps.rb +12 -0
- data/features/step_definitions/hidden_field_steps.rb +27 -0
- data/features/step_definitions/image_steps.rb +27 -0
- data/features/step_definitions/indexed_property_steps.rb +129 -0
- data/features/step_definitions/javascript_steps.rb +53 -0
- data/features/step_definitions/label_steps.rb +19 -0
- data/features/step_definitions/link_steps.rb +40 -0
- data/features/step_definitions/list_item_steps.rb +19 -0
- data/features/step_definitions/modal_dialog_steps.rb +62 -0
- data/features/step_definitions/multi_elements_steps.rb +528 -0
- data/features/step_definitions/nested_elements_steps.rb +212 -0
- data/features/step_definitions/ordered_list_steps.rb +23 -0
- data/features/step_definitions/page_level_actions_steps.rb +135 -0
- data/features/step_definitions/page_traversal_steps.rb +4 -0
- data/features/step_definitions/paragraph_steps.rb +28 -0
- data/features/step_definitions/radio_button_group_steps.rb +36 -0
- data/features/step_definitions/radio_button_steps.rb +27 -0
- data/features/step_definitions/select_list_steps.rb +65 -0
- data/features/step_definitions/span_steps.rb +19 -0
- data/features/step_definitions/table_cell_steps.rb +15 -0
- data/features/step_definitions/table_steps.rb +66 -0
- data/features/step_definitions/text_area_steps.rb +35 -0
- data/features/step_definitions/text_field_steps.rb +35 -0
- data/features/step_definitions/unordered_list_steps.rb +23 -0
- data/features/step_definitions/video_steps.rb +45 -0
- data/features/support/ajax_text_environment.rb +26 -0
- data/features/support/env.rb +8 -0
- data/features/support/hooks.rb +8 -0
- data/features/support/page.rb +364 -0
- data/features/support/persistent_browser.rb +70 -0
- data/features/support/targets/firefox14_osx.rb +6 -0
- data/features/support/targets/firefox14_windows7.rb +6 -0
- data/features/support/url_helper.rb +57 -0
- data/features/table.feature +114 -0
- data/features/table_cell.feature +45 -0
- data/features/text_area.feature +51 -0
- data/features/text_field.feature +70 -0
- data/features/unordered_list.feature +56 -0
- data/features/video.feature +73 -0
- data/lib/page-object/accessors.rb +1313 -0
- data/lib/page-object/core_ext/string.rb +5 -0
- data/lib/page-object/element_locators.rb +21 -0
- data/lib/page-object/elements/area.rb +31 -0
- data/lib/page-object/elements/audio.rb +9 -0
- data/lib/page-object/elements/button.rb +35 -0
- data/lib/page-object/elements/canvas.rb +23 -0
- data/lib/page-object/elements/check_box.rb +37 -0
- data/lib/page-object/elements/div.rb +19 -0
- data/lib/page-object/elements/element.rb +226 -0
- data/lib/page-object/elements/file_field.rb +38 -0
- data/lib/page-object/elements/form.rb +36 -0
- data/lib/page-object/elements/heading.rb +15 -0
- data/lib/page-object/elements/hidden_field.rb +22 -0
- data/lib/page-object/elements/image.rb +36 -0
- data/lib/page-object/elements/label.rb +36 -0
- data/lib/page-object/elements/link.rb +46 -0
- data/lib/page-object/elements/list_item.rb +19 -0
- data/lib/page-object/elements/media.rb +45 -0
- data/lib/page-object/elements/option.rb +10 -0
- data/lib/page-object/elements/ordered_list.rb +50 -0
- data/lib/page-object/elements/paragraph.rb +9 -0
- data/lib/page-object/elements/radio_button.rb +37 -0
- data/lib/page-object/elements/select_list.rb +42 -0
- data/lib/page-object/elements/span.rb +19 -0
- data/lib/page-object/elements/table.rb +68 -0
- data/lib/page-object/elements/table_cell.rb +28 -0
- data/lib/page-object/elements/table_row.rb +50 -0
- data/lib/page-object/elements/text_area.rb +38 -0
- data/lib/page-object/elements/text_field.rb +42 -0
- data/lib/page-object/elements/unordered_list.rb +51 -0
- data/lib/page-object/elements/video.rb +18 -0
- data/lib/page-object/elements.rb +59 -0
- data/lib/page-object/indexed_properties.rb +36 -0
- data/lib/page-object/javascript/jquery.rb +14 -0
- data/lib/page-object/javascript/prototype.rb +14 -0
- data/lib/page-object/javascript/yui.rb +19 -0
- data/lib/page-object/javascript_framework_facade.rb +78 -0
- data/lib/page-object/loads_platform.rb +26 -0
- data/lib/page-object/locator_generator.rb +129 -0
- data/lib/page-object/nested_elements.rb +17 -0
- data/lib/page-object/page_factory.rb +108 -0
- data/lib/page-object/page_populator.rb +92 -0
- data/lib/page-object/platforms/selenium_webdriver/button.rb +15 -0
- data/lib/page-object/platforms/selenium_webdriver/check_box.rb +29 -0
- data/lib/page-object/platforms/selenium_webdriver/element.rb +291 -0
- data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
- data/lib/page-object/platforms/selenium_webdriver/form.rb +16 -0
- data/lib/page-object/platforms/selenium_webdriver/image.rb +28 -0
- data/lib/page-object/platforms/selenium_webdriver/label.rb +17 -0
- data/lib/page-object/platforms/selenium_webdriver/link.rb +23 -0
- data/lib/page-object/platforms/selenium_webdriver/ordered_list.rb +39 -0
- data/lib/page-object/platforms/selenium_webdriver/page_object.rb +1136 -0
- data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +22 -0
- data/lib/page-object/platforms/selenium_webdriver/select_list.rb +93 -0
- data/lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb +42 -0
- data/lib/page-object/platforms/selenium_webdriver/table.rb +42 -0
- data/lib/page-object/platforms/selenium_webdriver/table_row.rb +43 -0
- data/lib/page-object/platforms/selenium_webdriver/text_area.rb +17 -0
- data/lib/page-object/platforms/selenium_webdriver/text_field.rb +17 -0
- data/lib/page-object/platforms/selenium_webdriver/unordered_list.rb +39 -0
- data/lib/page-object/platforms/selenium_webdriver.rb +18 -0
- data/lib/page-object/platforms/watir_webdriver/check_box.rb +29 -0
- data/lib/page-object/platforms/watir_webdriver/element.rb +249 -0
- data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
- data/lib/page-object/platforms/watir_webdriver/form.rb +16 -0
- data/lib/page-object/platforms/watir_webdriver/image.rb +22 -0
- data/lib/page-object/platforms/watir_webdriver/label.rb +17 -0
- data/lib/page-object/platforms/watir_webdriver/link.rb +15 -0
- data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +35 -0
- data/lib/page-object/platforms/watir_webdriver/page_object.rb +1029 -0
- data/lib/page-object/platforms/watir_webdriver/radio_button.rb +22 -0
- data/lib/page-object/platforms/watir_webdriver/select_list.rb +74 -0
- data/lib/page-object/platforms/watir_webdriver/table.rb +38 -0
- data/lib/page-object/platforms/watir_webdriver/table_row.rb +37 -0
- data/lib/page-object/platforms/watir_webdriver/text_area.rb +23 -0
- data/lib/page-object/platforms/watir_webdriver/text_field.rb +16 -0
- data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +36 -0
- data/lib/page-object/platforms/watir_webdriver.rb +18 -0
- data/lib/page-object/platforms.rb +18 -0
- data/lib/page-object/version.rb +4 -0
- data/lib/page-object/widgets.rb +133 -0
- data/lib/page-object.rb +408 -0
- data/meeane-page-object.gemspec +32 -0
- data/pageobject.gems +1 -0
- data/spec/page-object/element_locators_spec.rb +1065 -0
- data/spec/page-object/elements/area_spec.rb +45 -0
- data/spec/page-object/elements/button_spec.rb +50 -0
- data/spec/page-object/elements/canvas_spec.rb +40 -0
- data/spec/page-object/elements/check_box_spec.rb +49 -0
- data/spec/page-object/elements/div_spec.rb +28 -0
- data/spec/page-object/elements/element_spec.rb +114 -0
- data/spec/page-object/elements/file_field_spec.rb +39 -0
- data/spec/page-object/elements/form_spec.rb +28 -0
- data/spec/page-object/elements/heading_spec.rb +48 -0
- data/spec/page-object/elements/hidden_field_spec.rb +28 -0
- data/spec/page-object/elements/image_spec.rb +66 -0
- data/spec/page-object/elements/label_spec.rb +29 -0
- data/spec/page-object/elements/link_spec.rb +49 -0
- data/spec/page-object/elements/list_item_spec.rb +28 -0
- data/spec/page-object/elements/nested_element_spec.rb +254 -0
- data/spec/page-object/elements/option_spec.rb +11 -0
- data/spec/page-object/elements/ordered_list_spec.rb +94 -0
- data/spec/page-object/elements/paragraph_spec.rb +28 -0
- data/spec/page-object/elements/select_list_spec.rb +142 -0
- data/spec/page-object/elements/selenium/radio_button_spec.rb +44 -0
- data/spec/page-object/elements/selenium/text_field_spec.rb +49 -0
- data/spec/page-object/elements/selenium_element_spec.rb +172 -0
- data/spec/page-object/elements/span_spec.rb +26 -0
- data/spec/page-object/elements/table_cell_spec.rb +21 -0
- data/spec/page-object/elements/table_row_spec.rb +70 -0
- data/spec/page-object/elements/table_spec.rb +98 -0
- data/spec/page-object/elements/text_area_spec.rb +39 -0
- data/spec/page-object/elements/unordered_list_spec.rb +95 -0
- data/spec/page-object/elements/watir_element_spec.rb +142 -0
- data/spec/page-object/javascript_framework_facade_spec.rb +61 -0
- data/spec/page-object/loads_platform_spec.rb +53 -0
- data/spec/page-object/page-object_spec.rb +405 -0
- data/spec/page-object/page_factory_spec.rb +256 -0
- data/spec/page-object/page_populator_spec.rb +122 -0
- data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +68 -0
- data/spec/page-object/platforms/selenium_webdriver_spec.rb +29 -0
- data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
- data/spec/page-object/platforms/watir_webdriver_spec.rb +9 -0
- data/spec/page-object/selenium_accessors_spec.rb +589 -0
- data/spec/page-object/watir_accessors_spec.rb +1107 -0
- data/spec/page-object/widget_spec.rb +226 -0
- data/spec/spec_helper.rb +44 -0
- metadata +404 -0
@@ -0,0 +1,256 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'page-object/page_factory'
|
3
|
+
|
4
|
+
class FactoryTestPage
|
5
|
+
include PageObject
|
6
|
+
page_url "http://google.com"
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestPageWithDirectUrl
|
10
|
+
include PageObject
|
11
|
+
direct_url "http//google.com"
|
12
|
+
end
|
13
|
+
|
14
|
+
class AnotherPage
|
15
|
+
include PageObject
|
16
|
+
end
|
17
|
+
|
18
|
+
class YetAnotherPage
|
19
|
+
include PageObject
|
20
|
+
end
|
21
|
+
|
22
|
+
module ContainingModule
|
23
|
+
class PageInsideModule
|
24
|
+
include PageObject
|
25
|
+
page_url "http://google.co.uk"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class WorldSuper
|
30
|
+
attr_reader :super_called
|
31
|
+
def on_page(cls, params={}, visit=false, &block)
|
32
|
+
@super_called = true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
class TestWorld < WorldSuper
|
38
|
+
include PageObject::PageFactory
|
39
|
+
attr_accessor :browser
|
40
|
+
attr_accessor :current_page
|
41
|
+
end
|
42
|
+
|
43
|
+
describe PageObject::PageFactory do
|
44
|
+
before(:each) do
|
45
|
+
@world = TestWorld.new
|
46
|
+
@world.browser = mock_watir_browser
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should call super when non page-object class passed " do
|
50
|
+
class NoPO
|
51
|
+
end
|
52
|
+
@world.on(NoPO)
|
53
|
+
@world.super_called.should be true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create a new page object and execute a block" do
|
57
|
+
@world.browser.should_not_receive(:goto)
|
58
|
+
@world.on_page FactoryTestPage do |page|
|
59
|
+
page.should be_instance_of FactoryTestPage
|
60
|
+
end
|
61
|
+
@world.on_page "FactoryTestPage" do |page|
|
62
|
+
page.should be_instance_of FactoryTestPage
|
63
|
+
end
|
64
|
+
@world.on_page "ContainingModule::PageInsideModule" do |page|
|
65
|
+
page.should be_instance_of ContainingModule::PageInsideModule
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should create a new page object and execute a block using 'on'" do
|
70
|
+
@world.browser.should_not_receive(:goto)
|
71
|
+
@world.on FactoryTestPage do |page|
|
72
|
+
page.should be_instance_of FactoryTestPage
|
73
|
+
end
|
74
|
+
@world.on "FactoryTestPage" do |page|
|
75
|
+
page.should be_instance_of FactoryTestPage
|
76
|
+
end
|
77
|
+
@world.on "ContainingModule::PageInsideModule" do |page|
|
78
|
+
page.should be_instance_of ContainingModule::PageInsideModule
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should create and visit a new page" do
|
83
|
+
@world.browser.should_receive(:goto).exactly(3).times
|
84
|
+
@world.visit_page FactoryTestPage do |page|
|
85
|
+
page.should be_instance_of FactoryTestPage
|
86
|
+
end
|
87
|
+
@world.visit_page "FactoryTestPage" do |page|
|
88
|
+
page.should be_instance_of FactoryTestPage
|
89
|
+
end
|
90
|
+
@world.visit_page "ContainingModule::PageInsideModule" do |page|
|
91
|
+
page.should be_instance_of ContainingModule::PageInsideModule
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should merge params with the class level params if provided when visiting" do
|
96
|
+
@world.browser.should_receive(:goto)
|
97
|
+
FactoryTestPage.params = {:initial => :value}
|
98
|
+
@world.visit_page(FactoryTestPage, :using_params => {:new_value => :merged})
|
99
|
+
merged = FactoryTestPage.instance_variable_get("@merged_params")
|
100
|
+
merged[:initial].should == :value
|
101
|
+
merged[:new_value].should == :merged
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should use the params in the url when they are provided" do
|
105
|
+
class PageUsingParams
|
106
|
+
include PageObject
|
107
|
+
page_url "http://google.com/<%=params[:value]%>"
|
108
|
+
end
|
109
|
+
@world.browser.should_receive(:goto).with("http://google.com/PageObject")
|
110
|
+
@world.visit_page(PageUsingParams, :using_params => {:value => 'PageObject'})
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should use the params as well as interpolated values" do
|
114
|
+
class PageUsingParmsAndInterpolated
|
115
|
+
include PageObject
|
116
|
+
page_url "http://google.com/#{1+2}/<%=params[:value]%>"
|
117
|
+
end
|
118
|
+
@world.browser.should_receive(:goto).with("http://google.com/3/PageObject")
|
119
|
+
@world.visit_page(PageUsingParmsAndInterpolated, :using_params => {:value => 'PageObject'})
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should create and visit a new page using 'visit'" do
|
123
|
+
@world.browser.should_receive(:goto).exactly(3).times
|
124
|
+
@world.visit FactoryTestPage do |page|
|
125
|
+
page.should be_instance_of FactoryTestPage
|
126
|
+
end
|
127
|
+
@world.visit "FactoryTestPage" do |page|
|
128
|
+
page.should be_instance_of FactoryTestPage
|
129
|
+
end
|
130
|
+
@world.visit "ContainingModule::PageInsideModule" do |page|
|
131
|
+
page.should be_instance_of ContainingModule::PageInsideModule
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should create and visit a new page when url is defined as 'direct_url'" do
|
136
|
+
@world.browser.should_receive(:goto)
|
137
|
+
@world.visit TestPageWithDirectUrl do |page|
|
138
|
+
page.should be_instance_of TestPageWithDirectUrl
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should set an instance variable that can be used outside of the block" do
|
143
|
+
page = @world.on_page FactoryTestPage
|
144
|
+
current_page = @world.instance_variable_get "@current_page"
|
145
|
+
current_page.should === page
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should not execute block if page is not @current_page" do
|
149
|
+
@world.instance_variable_set "@current_page", TestPageWithDirectUrl.new(@world.browser)
|
150
|
+
@world.if_page(FactoryTestPage) do |page|
|
151
|
+
fail
|
152
|
+
end
|
153
|
+
@world.if_page("FactoryTestPage") do |page|
|
154
|
+
fail
|
155
|
+
end
|
156
|
+
@world.if_page("ContainingModule::PageInsideModule") do |page|
|
157
|
+
fail
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should return the @current_page if asking for another page" do
|
162
|
+
expected = TestPageWithDirectUrl.new(@world.browser)
|
163
|
+
@world.instance_variable_set "@current_page", expected
|
164
|
+
@world.if_page(FactoryTestPage).should == expected
|
165
|
+
@world.if_page("FactoryTestPage").should == expected
|
166
|
+
@world.if_page("ContainingModule::PageInsideModule").should == expected
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should execute the block when we ask if it is the correct page" do
|
170
|
+
@world.instance_variable_set "@current_page", FactoryTestPage.new(@world.browser)
|
171
|
+
|
172
|
+
done = false
|
173
|
+
@world.if_page(FactoryTestPage) do |page|
|
174
|
+
page.should be_instance_of FactoryTestPage
|
175
|
+
done = true
|
176
|
+
end
|
177
|
+
done.should be true
|
178
|
+
|
179
|
+
done = false
|
180
|
+
@world.if_page("FactoryTestPage") do |page|
|
181
|
+
page.should be_instance_of FactoryTestPage
|
182
|
+
done = true
|
183
|
+
end
|
184
|
+
done.should be true
|
185
|
+
|
186
|
+
done = false
|
187
|
+
@world.instance_variable_set "@current_page", ContainingModule::PageInsideModule.new(@world.browser)
|
188
|
+
@world.if_page("ContainingModule::PageInsideModule") do |page|
|
189
|
+
page.should be_instance_of ContainingModule::PageInsideModule
|
190
|
+
done = true
|
191
|
+
end
|
192
|
+
done.should be true
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should raise an error when you do not provide a default route" do
|
196
|
+
expect { PageObject::PageFactory.routes = {:another => []} }.to raise_error
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should store the routes" do
|
200
|
+
routes = ['a', 'b', 'c']
|
201
|
+
PageObject::PageFactory.routes = {:default => routes}
|
202
|
+
PageObject::PageFactory.routes[:default].should == routes
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should navigate to a page calling the default methods" do
|
206
|
+
pages = [[FactoryTestPage, :a_method], [AnotherPage, :b_method]]
|
207
|
+
PageObject::PageFactory.routes = {:default => pages}
|
208
|
+
fake_page = double('a_page')
|
209
|
+
FactoryTestPage.should_receive(:new).and_return(fake_page)
|
210
|
+
fake_page.should_receive(:a_method)
|
211
|
+
@world.navigate_to(AnotherPage).class.should == AnotherPage
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should pass parameters to methods when navigating" do
|
215
|
+
pages = [[FactoryTestPage, :a_method, 'blah'], [AnotherPage, :b_method]]
|
216
|
+
PageObject::PageFactory.routes = {:default => pages}
|
217
|
+
fake_page = double('a_page')
|
218
|
+
FactoryTestPage.should_receive(:new).and_return(fake_page)
|
219
|
+
fake_page.should_receive(:a_method).with('blah')
|
220
|
+
@world.navigate_to(AnotherPage).class.should == AnotherPage
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should fail when it does not find a proper route" do
|
224
|
+
PageObject::PageFactory.routes = {:default => ['a'], :another => ['b']}
|
225
|
+
expect { @world.navigate_to(AnotherPage, :using => :no_route) }.to raise_error
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should fail when no default method specified" do
|
229
|
+
PageObject::PageFactory.routes = {
|
230
|
+
:default => [[FactoryTestPage, :a_method], [AnotherPage, :b_method]]
|
231
|
+
}
|
232
|
+
fake_page = double('a_page')
|
233
|
+
FactoryTestPage.should_receive(:new).and_return(fake_page)
|
234
|
+
fake_page.should_receive(:respond_to?).with(:a_method).and_return(false)
|
235
|
+
expect { @world.navigate_to(AnotherPage) }.to raise_error
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should know how to continue routing from a location" do
|
239
|
+
PageObject::PageFactory.routes = {
|
240
|
+
:default => [[FactoryTestPage, :a_method],
|
241
|
+
[AnotherPage, :b_method],
|
242
|
+
[YetAnotherPage, :c_method]]
|
243
|
+
}
|
244
|
+
|
245
|
+
@world.current_page = FactoryTestPage.new(@world.browser)
|
246
|
+
f_page = FactoryTestPage.new(@world.browser)
|
247
|
+
FactoryTestPage.should_receive(:new).and_return(f_page)
|
248
|
+
f_page.should_receive(:respond_to?).with(:a_method).and_return(true)
|
249
|
+
f_page.should_receive(:a_method)
|
250
|
+
a_page = AnotherPage.new(@world.browser)
|
251
|
+
AnotherPage.should_receive(:new).and_return(a_page)
|
252
|
+
a_page.should_receive(:respond_to?).with(:b_method).and_return(true)
|
253
|
+
a_page.should_receive(:b_method)
|
254
|
+
@world.continue_navigation_to(YetAnotherPage).class.should == YetAnotherPage
|
255
|
+
end
|
256
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class PageObjectTestPageObject
|
4
|
+
include PageObject
|
5
|
+
|
6
|
+
text_field(:tf, :id => 'id')
|
7
|
+
text_area(:ta, :id => 'id')
|
8
|
+
select_list(:sl, :id => 'id')
|
9
|
+
file_field(:ff, :id => 'id')
|
10
|
+
checkbox(:cb, :id => 'id')
|
11
|
+
radio_button(:rb, :id => 'id')
|
12
|
+
radio_button_group(:rbg, :id => 'id')
|
13
|
+
end
|
14
|
+
|
15
|
+
describe PageObject::PagePopulator do
|
16
|
+
let(:browser) { mock_watir_browser }
|
17
|
+
let(:page_object) { PageObjectTestPageObject.new(browser) }
|
18
|
+
|
19
|
+
it "should set a value in a text field" do
|
20
|
+
page_object.should_receive(:tf=).with('value')
|
21
|
+
page_object.stub(:is_enabled?).and_return(true)
|
22
|
+
page_object.populate_page_with('tf' => 'value')
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not set a value in a text field if it is not found on the page" do
|
26
|
+
browser.should_not_receive(:text_field)
|
27
|
+
page_object.populate_page_with('coffee' => 'value')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not populate a text field when it is disabled" do
|
31
|
+
page_object.should_not_receive(:tf=)
|
32
|
+
page_object.should_receive(:tf_element).twice.and_return(browser)
|
33
|
+
browser.should_receive(:enabled?).and_return(false)
|
34
|
+
browser.should_receive(:tag_name).and_return('input')
|
35
|
+
page_object.populate_page_with('tf' => true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not populate a text field when it is not visible" do
|
39
|
+
page_object.should_not_receive(:tf=)
|
40
|
+
page_object.should_receive(:tf_element).twice.and_return(browser)
|
41
|
+
browser.should_receive(:enabled?).and_return(true)
|
42
|
+
browser.should_receive(:visible?).and_return(false)
|
43
|
+
browser.should_receive(:tag_name).and_return('input')
|
44
|
+
page_object.populate_page_with('tf' => true)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should set a value in a text area" do
|
48
|
+
page_object.should_receive(:ta=).with('value')
|
49
|
+
page_object.should_receive(:ta_element).and_return(browser)
|
50
|
+
browser.should_receive(:tag_name).and_return('textarea')
|
51
|
+
page_object.populate_page_with('ta' => 'value')
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should set a value in a select list" do
|
55
|
+
page_object.should_receive(:sl=).with('value')
|
56
|
+
page_object.stub(:is_enabled?).and_return(true)
|
57
|
+
page_object.populate_page_with('sl' => 'value')
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should set a value in a file field" do
|
61
|
+
page_object.should_receive(:ff=).with('value')
|
62
|
+
page_object.stub(:is_enabled?).and_return(true)
|
63
|
+
page_object.populate_page_with('ff' => 'value')
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should check a checkbox to true is specified" do
|
67
|
+
page_object.should_receive(:check_cb)
|
68
|
+
page_object.stub(:is_enabled?).and_return(true)
|
69
|
+
page_object.populate_page_with('cb' => true)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should uncheck a checkbox to false is specified" do
|
73
|
+
page_object.should_receive(:uncheck_cb)
|
74
|
+
page_object.stub(:is_enabled?).and_return(true)
|
75
|
+
page_object.populate_page_with('cb' => false)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should select a radio button when true is specified" do
|
79
|
+
page_object.should_receive(:select_rb)
|
80
|
+
page_object.stub(:is_enabled?).and_return(true)
|
81
|
+
page_object.populate_page_with('rb' => true)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should select the correct element from a radio button group" do
|
85
|
+
page_object.should_receive(:select_rbg).with('blah')
|
86
|
+
page_object.populate_page_with('rbg' => 'blah')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not populate a checkbox if it is disabled" do
|
90
|
+
page_object.should_not_receive(:check_cb)
|
91
|
+
page_object.should_receive(:cb_element).twice.and_return(browser)
|
92
|
+
browser.should_receive(:enabled?).and_return(false)
|
93
|
+
browser.should_receive(:tag_name).and_return('input')
|
94
|
+
page_object.populate_page_with('cb' => true)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should not populate a checkbox if it is not visible" do
|
98
|
+
page_object.should_not_receive(:check_cb)
|
99
|
+
page_object.should_receive(:cb_element).twice.and_return(browser)
|
100
|
+
browser.should_receive(:enabled?).and_return(true)
|
101
|
+
browser.should_receive(:visible?).and_return(false)
|
102
|
+
browser.should_receive(:tag_name).and_return('input')
|
103
|
+
page_object.populate_page_with('cb' => true)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should not populate a radio button when it is disabled" do
|
107
|
+
page_object.should_not_receive(:select_rb)
|
108
|
+
page_object.should_receive(:rb_element).twice.and_return(browser)
|
109
|
+
browser.should_receive(:enabled?).and_return(false)
|
110
|
+
browser.should_receive(:tag_name).and_return('input')
|
111
|
+
page_object.populate_page_with('rb' => true)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should not populate a radio button when it is not visible" do
|
115
|
+
page_object.should_not_receive(:select_rb)
|
116
|
+
page_object.should_receive(:rb_element).twice.and_return(browser)
|
117
|
+
browser.should_receive(:enabled?).and_return(true)
|
118
|
+
browser.should_receive(:visible?).and_return(false)
|
119
|
+
browser.should_receive(:tag_name).and_return('input')
|
120
|
+
page_object.populate_page_with('rb' => true)
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'page-object/platforms/selenium_webdriver/page_object'
|
3
|
+
require 'page-object/elements'
|
4
|
+
|
5
|
+
class SeleniumTestPageObject
|
6
|
+
include PageObject
|
7
|
+
end
|
8
|
+
|
9
|
+
describe PageObject::Platforms::SeleniumWebDriver::PageObject do
|
10
|
+
let(:selenium_browser) { mock_selenium_browser }
|
11
|
+
let(:selenium_page_object) { SeleniumTestPageObject.new(selenium_browser) }
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
selenium_browser.stub(:switch_to).and_return(selenium_browser)
|
15
|
+
selenium_browser.stub(:default_content)
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when building identifiers hash" do
|
19
|
+
it "should add tag_name when identifying by text for hidden_field" do
|
20
|
+
expected_identifier = {:text => 'foo', :tag_name => 'input', :type => 'hidden'}
|
21
|
+
PageObject::Elements::HiddenField.should_receive(:selenium_identifier_for).with(expected_identifier)
|
22
|
+
selenium_browser.should_receive(:find_element)
|
23
|
+
selenium_page_object.platform.hidden_field_for(:text => 'foo')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should add tag_name when identifying by href for anchor" do
|
27
|
+
expected_identifier = {:href => 'foo', :tag_name => 'a'}
|
28
|
+
PageObject::Elements::Link.should_receive(:selenium_identifier_for).with(expected_identifier)
|
29
|
+
selenium_browser.should_receive(:find_element)
|
30
|
+
selenium_page_object.platform.link_for(:href => 'foo')
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should add tag_name when identifying by text for div" do
|
34
|
+
expected_identifier = {:text => 'foo', :tag_name => 'div'}
|
35
|
+
PageObject::Elements::Div.should_receive(:selenium_identifier_for).with(expected_identifier)
|
36
|
+
selenium_browser.should_receive(:find_element)
|
37
|
+
selenium_page_object.platform.div_for(:text => 'foo')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when trying to find an element that does not exist" do
|
42
|
+
it "should return a surogate selenium object" do
|
43
|
+
selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
44
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
45
|
+
element = page.link_element(:text => 'blah')
|
46
|
+
element.element.should be_instance_of PageObject::Platforms::SeleniumWebDriver::SurrogateSeleniumElement
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should know it is not exist" do
|
50
|
+
selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
51
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
52
|
+
page.link_element(:text => 'blah').element.exists?.should be false
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should know it is not visible" do
|
56
|
+
selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
57
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
58
|
+
page.link_element(:text => 'blah').element.should_not be_visible
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should raise an error when actions are requested" do
|
62
|
+
selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
63
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
64
|
+
element = page.link_element(:text => 'blah')
|
65
|
+
expect { element.text }.to raise_error
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe PageObject::Platforms::SeleniumWebDriver do
|
5
|
+
|
6
|
+
it "should be registered as an adapter" do
|
7
|
+
PageObject::Platforms.get[:selenium_webdriver].should be PageObject::Platforms::SeleniumWebDriver
|
8
|
+
|
9
|
+
end
|
10
|
+
describe 'create page object' do
|
11
|
+
let(:browser) { double('browser') }
|
12
|
+
let(:subject) { PageObject::Platforms::SeleniumWebDriver.create_page_object(browser) }
|
13
|
+
|
14
|
+
it "should create a SeleniumPageObject" do
|
15
|
+
subject.should be_kind_of PageObject::Platforms::SeleniumWebDriver::PageObject
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "is for?" do
|
20
|
+
it "should be true when the browser is a selenium driver" do
|
21
|
+
browser = mock_selenium_browser()
|
22
|
+
PageObject::Platforms::SeleniumWebDriver.is_for?(browser).should == true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be false when the browser is anything else" do
|
26
|
+
PageObject::Platforms::SeleniumWebDriver.is_for?("asdf").should == false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PageObject::Platforms::WatirWebDriver do
|
4
|
+
describe "create page object" do
|
5
|
+
let(:browser) { double('browser') }
|
6
|
+
let(:subject) { PageObject::Platforms::WatirWebDriver.create_page_object(browser) }
|
7
|
+
|
8
|
+
it "should create a WatirPageObject" do
|
9
|
+
subject.should be_kind_of PageObject::Platforms::WatirWebDriver::PageObject
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should give the watir page object the browser" do
|
13
|
+
subject.browser.should be browser
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "is for?" do
|
18
|
+
it "should be true when the browser is Watir::Browser" do
|
19
|
+
browser = mock_watir_browser()
|
20
|
+
PageObject::Platforms::WatirWebDriver.is_for?(browser).should be true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be false at any other point" do
|
24
|
+
browser = 'asdf'
|
25
|
+
PageObject::Platforms::WatirWebDriver.is_for?('asdf').should be false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|