page_object 1.1.1
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 +7 -0
- data/ChangeLog +809 -0
- data/Gemfile +14 -0
- data/Guardfile +20 -0
- data/LICENSE +20 -0
- data/README.md +111 -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/bold.feature +21 -0
- data/features/button.feature +98 -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 +55 -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 +207 -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 +117 -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 +492 -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/section.feature +132 -0
- data/features/select_list.feature +86 -0
- data/features/span.feature +37 -0
- data/features/step_definitions/accessor_steps.rb +64 -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/bold_steps.rb +12 -0
- data/features/step_definitions/button_steps.rb +48 -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 +163 -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 +541 -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/section_steps.rb +268 -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_row_steps.rb +23 -0
- data/features/step_definitions/table_steps.rb +70 -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 +382 -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 +122 -0
- data/features/table_cell.feature +45 -0
- data/features/table_row.feature +43 -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.rb +421 -0
- data/lib/page-object/accessors.rb +1412 -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.rb +60 -0
- data/lib/page-object/elements/area.rb +31 -0
- data/lib/page-object/elements/audio.rb +9 -0
- data/lib/page-object/elements/bold.rb +11 -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 +19 -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 +79 -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/indexed_properties.rb +40 -0
- data/lib/page-object/javascript/angularjs.rb +14 -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 +80 -0
- data/lib/page-object/loads_platform.rb +45 -0
- data/lib/page-object/locator_generator.rb +131 -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 +83 -0
- data/lib/page-object/platforms.rb +18 -0
- data/lib/page-object/platforms/selenium_webdriver.rb +30 -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/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 +1237 -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/watir_webdriver.rb +30 -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/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 +1082 -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/sections.rb +29 -0
- data/lib/page-object/version.rb +4 -0
- data/lib/page-object/widgets.rb +133 -0
- data/page_object.gemspec +31 -0
- data/pageobject.gems +1 -0
- data/spec/page-object/accessors_spec.rb +40 -0
- data/spec/page-object/element_locators_spec.rb +1122 -0
- data/spec/page-object/elements/area_spec.rb +45 -0
- data/spec/page-object/elements/bold_spec.rb +29 -0
- data/spec/page-object/elements/button_spec.rb +64 -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 +29 -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 +27 -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 +177 -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 +94 -0
- data/spec/page-object/elements/watir_element_spec.rb +145 -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 +407 -0
- data/spec/page-object/page_factory_spec.rb +238 -0
- data/spec/page-object/page_populator_spec.rb +122 -0
- data/spec/page-object/page_section_spec.rb +73 -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 +609 -0
- data/spec/page-object/watir_accessors_spec.rb +1134 -0
- data/spec/page-object/widget_spec.rb +226 -0
- data/spec/spec_helper.rb +47 -0
- metadata +601 -0
|
@@ -0,0 +1,238 @@
|
|
|
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
|
+
expect(@world.super_called).to be true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should create a new page object and execute a block" do
|
|
57
|
+
expect(@world.browser).not_to receive(:goto)
|
|
58
|
+
@world.on_page FactoryTestPage do |page|
|
|
59
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
60
|
+
end
|
|
61
|
+
@world.on_page "FactoryTestPage" do |page|
|
|
62
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
63
|
+
end
|
|
64
|
+
@world.on_page "ContainingModule::PageInsideModule" do |page|
|
|
65
|
+
expect(page).to 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
|
+
expect(@world.browser).not_to receive(:goto)
|
|
71
|
+
@world.on FactoryTestPage do |page|
|
|
72
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
73
|
+
end
|
|
74
|
+
@world.on "FactoryTestPage" do |page|
|
|
75
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
76
|
+
end
|
|
77
|
+
@world.on "ContainingModule::PageInsideModule" do |page|
|
|
78
|
+
expect(page).to be_instance_of ContainingModule::PageInsideModule
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should create and visit a new page" do
|
|
83
|
+
expect(@world.browser).to receive(:goto).exactly(3).times
|
|
84
|
+
@world.visit_page FactoryTestPage do |page|
|
|
85
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
86
|
+
end
|
|
87
|
+
@world.visit_page "FactoryTestPage" do |page|
|
|
88
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
89
|
+
end
|
|
90
|
+
@world.visit_page "ContainingModule::PageInsideModule" do |page|
|
|
91
|
+
expect(page).to 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
|
+
expect(@world.browser).to 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
|
+
expect(merged[:initial]).to eql :value
|
|
101
|
+
expect(merged[:new_value]).to eql :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
|
+
expect(@world.browser).to 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
|
+
expect(@world.browser).to 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
|
+
expect(@world.browser).to receive(:goto).exactly(3).times
|
|
124
|
+
@world.visit FactoryTestPage do |page|
|
|
125
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
126
|
+
end
|
|
127
|
+
@world.visit "FactoryTestPage" do |page|
|
|
128
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
129
|
+
end
|
|
130
|
+
@world.visit "ContainingModule::PageInsideModule" do |page|
|
|
131
|
+
expect(page).to 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
|
+
expect(@world.browser).to receive(:goto)
|
|
137
|
+
@world.visit TestPageWithDirectUrl do |page|
|
|
138
|
+
expect(page).to 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
|
+
expect(current_page).to equal 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
|
+
expect(@world.if_page(FactoryTestPage)).to eql expected
|
|
165
|
+
expect(@world.if_page("FactoryTestPage")).to eql expected
|
|
166
|
+
expect(@world.if_page("ContainingModule::PageInsideModule")).to eql 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
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
175
|
+
done = true
|
|
176
|
+
end
|
|
177
|
+
expect(done).to be true
|
|
178
|
+
|
|
179
|
+
done = false
|
|
180
|
+
@world.if_page("FactoryTestPage") do |page|
|
|
181
|
+
expect(page).to be_instance_of FactoryTestPage
|
|
182
|
+
done = true
|
|
183
|
+
end
|
|
184
|
+
expect(done).to 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
|
+
expect(page).to be_instance_of ContainingModule::PageInsideModule
|
|
190
|
+
done = true
|
|
191
|
+
end
|
|
192
|
+
expect(done).to 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
|
+
expect(PageObject::PageFactory.routes[:default]).to eql 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
|
+
expect(FactoryTestPage).to receive(:new).and_return(fake_page)
|
|
210
|
+
expect(fake_page).to receive(:a_method)
|
|
211
|
+
expect(@world.navigate_to(AnotherPage).class).to eql 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
|
+
expect(FactoryTestPage).to receive(:new).and_return(fake_page)
|
|
219
|
+
expect(fake_page).to receive(:a_method).with('blah')
|
|
220
|
+
expect(@world.navigate_to(AnotherPage).class).to eql 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
|
+
expect(FactoryTestPage).to receive(:new).and_return(fake_page)
|
|
234
|
+
expect(fake_page).to receive(:respond_to?).with(:a_method).and_return(false)
|
|
235
|
+
expect { @world.navigate_to(AnotherPage) }.to raise_error
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
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
|
+
expect(page_object).to receive(:tf=).with('value')
|
|
21
|
+
allow(page_object).to receive(: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
|
+
expect(browser).not_to 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
|
+
expect(page_object).not_to receive(:tf=)
|
|
32
|
+
expect(page_object).to receive(:tf_element).twice.and_return(browser)
|
|
33
|
+
expect(browser).to receive(:enabled?).and_return(false)
|
|
34
|
+
expect(browser).to 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
|
+
expect(page_object).not_to receive(:tf=)
|
|
40
|
+
expect(page_object).to receive(:tf_element).twice.and_return(browser)
|
|
41
|
+
expect(browser).to receive(:enabled?).and_return(true)
|
|
42
|
+
expect(browser).to receive(:visible?).and_return(false)
|
|
43
|
+
expect(browser).to 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
|
+
expect(page_object).to receive(:ta=).with('value')
|
|
49
|
+
expect(page_object).to receive(:ta_element).and_return(browser)
|
|
50
|
+
expect(browser).to 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
|
+
expect(page_object).to receive(:sl=).with('value')
|
|
56
|
+
allow(page_object).to receive(: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
|
+
expect(page_object).to receive(:ff=).with('value')
|
|
62
|
+
allow(page_object).to receive(: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
|
+
expect(page_object).to receive(:check_cb)
|
|
68
|
+
allow(page_object).to receive(: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
|
+
expect(page_object).to receive(:uncheck_cb)
|
|
74
|
+
allow(page_object).to receive(: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
|
+
expect(page_object).to receive(:select_rb)
|
|
80
|
+
allow(page_object).to receive(: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
|
+
expect(page_object).to 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
|
+
expect(page_object).not_to receive(:check_cb)
|
|
91
|
+
expect(page_object).to receive(:cb_element).twice.and_return(browser)
|
|
92
|
+
expect(browser).to receive(:enabled?).and_return(false)
|
|
93
|
+
expect(browser).to 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
|
+
expect(page_object).not_to receive(:check_cb)
|
|
99
|
+
expect(page_object).to receive(:cb_element).twice.and_return(browser)
|
|
100
|
+
expect(browser).to receive(:enabled?).and_return(true)
|
|
101
|
+
expect(browser).to receive(:visible?).and_return(false)
|
|
102
|
+
expect(browser).to 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
|
+
expect(page_object).not_to receive(:select_rb)
|
|
108
|
+
expect(page_object).to receive(:rb_element).twice.and_return(browser)
|
|
109
|
+
expect(browser).to receive(:enabled?).and_return(false)
|
|
110
|
+
expect(browser).to 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
|
+
expect(page_object).not_to receive(:select_rb)
|
|
116
|
+
expect(page_object).to receive(:rb_element).twice.and_return(browser)
|
|
117
|
+
expect(browser).to receive(:enabled?).and_return(true)
|
|
118
|
+
expect(browser).to receive(:visible?).and_return(false)
|
|
119
|
+
expect(browser).to receive(:tag_name).and_return('input')
|
|
120
|
+
page_object.populate_page_with('rb' => true)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'page-object/elements'
|
|
3
|
+
|
|
4
|
+
class Container
|
|
5
|
+
include PageObject
|
|
6
|
+
end
|
|
7
|
+
class SectionsPage
|
|
8
|
+
include PageObject
|
|
9
|
+
|
|
10
|
+
page_section(:container, Container, :id => 'blah')
|
|
11
|
+
page_sections(:containers, Container, :class => 'foo')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe PageObject::Accessors do
|
|
15
|
+
context 'when using watir' do
|
|
16
|
+
let(:watir_browser) { mock_watir_browser }
|
|
17
|
+
let(:watir_page_object) { SectionsPage.new(watir_browser) }
|
|
18
|
+
|
|
19
|
+
it 'it should find a page section' do
|
|
20
|
+
expect(watir_browser).to receive(:element).with(:id => 'blah').and_return(watir_browser)
|
|
21
|
+
section = watir_page_object.container
|
|
22
|
+
expect(section).to be_instance_of Container
|
|
23
|
+
end
|
|
24
|
+
it 'it should find page sections' do
|
|
25
|
+
expect(watir_browser).to receive(:elements).with(:class => 'foo').and_return([watir_browser, watir_browser])
|
|
26
|
+
sections = watir_page_object.containers
|
|
27
|
+
expect(sections).to be_instance_of(PageObject::SectionCollection)
|
|
28
|
+
sections.each do |section|
|
|
29
|
+
expect(section).to be_instance_of(Container)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
context 'when using selenium' do
|
|
34
|
+
let(:selenium_browser) { mock_selenium_browser }
|
|
35
|
+
let(:selenium_page_object) { SectionsPage.new(selenium_browser) }
|
|
36
|
+
|
|
37
|
+
it 'it should find a page section' do
|
|
38
|
+
expect(selenium_browser).to receive(:find_element).with(:id, 'blah').and_return(selenium_browser)
|
|
39
|
+
section = selenium_page_object.container
|
|
40
|
+
expect(section).to be_instance_of Container
|
|
41
|
+
end
|
|
42
|
+
it 'it should find page sections' do
|
|
43
|
+
expect(selenium_browser).to receive(:find_elements).with(:class, 'foo').and_return([selenium_browser, selenium_browser])
|
|
44
|
+
sections = selenium_page_object.containers
|
|
45
|
+
expect(sections).to be_instance_of(PageObject::SectionCollection)
|
|
46
|
+
sections.each do |section|
|
|
47
|
+
expect(section).to be_instance_of(Container)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
describe PageObject::SectionCollection do
|
|
53
|
+
ContainedItem = Struct.new(:type, :name)
|
|
54
|
+
let(:section_collection) do
|
|
55
|
+
contained_items = [ContainedItem.new(:sandwich, :reuben), ContainedItem.new(:soup, :lobster_bisque), ContainedItem.new(:sandwich, :dagwood)]
|
|
56
|
+
PageObject::SectionCollection.new(contained_items)
|
|
57
|
+
end
|
|
58
|
+
it 'should be indexed to the sections' do
|
|
59
|
+
expect(section_collection[0]).to be_an_instance_of ContainedItem
|
|
60
|
+
expect(section_collection[-1]).to be_an_instance_of ContainedItem
|
|
61
|
+
end
|
|
62
|
+
it 'should be able to iterate over the sections' do
|
|
63
|
+
section_collection.each do |section|
|
|
64
|
+
expect(section).to be_an_instance_of ContainedItem
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
it 'should find a section by one of its values' do
|
|
68
|
+
expect(section_collection.find_by(name: :dagwood).name).to eq :dagwood
|
|
69
|
+
end
|
|
70
|
+
it 'should find all sections matching a value' do
|
|
71
|
+
expect(section_collection.select_by(type: :sandwich).map(&:type)).to eq [:sandwich, :sandwich]
|
|
72
|
+
end
|
|
73
|
+
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
|
+
allow(selenium_browser).to receive(:switch_to).and_return(selenium_browser)
|
|
15
|
+
allow(selenium_browser).to receive(: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
|
+
expect(PageObject::Elements::HiddenField).to receive(:selenium_identifier_for).with(expected_identifier)
|
|
22
|
+
expect(selenium_browser).to 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
|
+
expect(PageObject::Elements::Link).to receive(:selenium_identifier_for).with(expected_identifier)
|
|
29
|
+
expect(selenium_browser).to 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
|
+
expect(PageObject::Elements::Div).to receive(:selenium_identifier_for).with(expected_identifier)
|
|
36
|
+
expect(selenium_browser).to 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
|
+
expect(selenium_browser).to receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
|
44
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
|
45
|
+
element = page.link_element(:text => 'blah')
|
|
46
|
+
expect(element.element).to be_instance_of PageObject::Platforms::SeleniumWebDriver::SurrogateSeleniumElement
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should know it is not exist" do
|
|
50
|
+
expect(selenium_browser).to receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
|
51
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
|
52
|
+
expect(page.link_element(:text => 'blah').element.exists?).to be false
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should know it is not visible" do
|
|
56
|
+
expect(selenium_browser).to receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
|
|
57
|
+
page = SeleniumTestPageObject.new(selenium_browser)
|
|
58
|
+
expect(page.link_element(:text => 'blah').element).not_to be_visible
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should raise an error when actions are requested" do
|
|
62
|
+
expect(selenium_browser).to 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
|