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,21 @@
|
|
1
|
+
require 'page-object/locator_generator'
|
2
|
+
|
3
|
+
module PageObject
|
4
|
+
module ElementLocators
|
5
|
+
|
6
|
+
def self.included(cls)
|
7
|
+
::PageObject::LocatorGenerator.generate_locators(cls)
|
8
|
+
end
|
9
|
+
|
10
|
+
def element(tag, identifier={:index => 0})
|
11
|
+
platform.element_for(tag, identifier.clone)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def locator(identifier)
|
17
|
+
identifier[0] ? identifier[0] : {:index => 0}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class Area < Element
|
5
|
+
|
6
|
+
#
|
7
|
+
# return the coordinates of the area
|
8
|
+
#
|
9
|
+
def coords
|
10
|
+
attribute(:coords)
|
11
|
+
end
|
12
|
+
|
13
|
+
#
|
14
|
+
# return the shape of the area
|
15
|
+
#
|
16
|
+
def shape
|
17
|
+
attribute(:shape)
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# return the href of the area
|
22
|
+
#
|
23
|
+
def href
|
24
|
+
attribute(:href)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
::PageObject::Elements.type_to_class[:area] = ::PageObject::Elements::Area
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class Button < Element
|
5
|
+
|
6
|
+
def initialize(element, platform)
|
7
|
+
@element = element
|
8
|
+
include_platform_for platform
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def self.watir_finders
|
14
|
+
super + [:text, :value, :src, :alt, :css]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.selenium_finders
|
18
|
+
super + [:value, :src, :alt]
|
19
|
+
end
|
20
|
+
|
21
|
+
def include_platform_for platform
|
22
|
+
super
|
23
|
+
if platform[:platform] == :selenium_webdriver
|
24
|
+
require 'page-object/platforms/selenium_webdriver/button'
|
25
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Button
|
26
|
+
end
|
27
|
+
end
|
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
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class Canvas < Element
|
5
|
+
#
|
6
|
+
# return the width of the canvas
|
7
|
+
#
|
8
|
+
def width
|
9
|
+
attribute(:width).to_i
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# return the height of the canvas
|
14
|
+
#
|
15
|
+
def height
|
16
|
+
attribute(:height).to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
::PageObject::Elements.type_to_class[:canvas] = ::PageObject::Elements::Canvas
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class CheckBox < Element
|
4
|
+
|
5
|
+
def initialize(element, platform)
|
6
|
+
@element = element
|
7
|
+
include_platform_for platform
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def self.watir_finders
|
13
|
+
super + [:value, :label]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.selenium_finders
|
17
|
+
super + [:value, :label, :css]
|
18
|
+
end
|
19
|
+
|
20
|
+
def include_platform_for platform
|
21
|
+
super
|
22
|
+
if platform[:platform] == :watir_webdriver
|
23
|
+
require 'page-object/platforms/watir_webdriver/check_box'
|
24
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::CheckBox
|
25
|
+
elsif platform[:platform] == :selenium_webdriver
|
26
|
+
require 'page-object/platforms/selenium_webdriver/check_box'
|
27
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::CheckBox
|
28
|
+
else
|
29
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
::PageObject::Elements.type_to_class[:checkbox] = ::PageObject::Elements::CheckBox
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class Div < Element
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def self.watir_finders
|
8
|
+
super + [:text, :title]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.selenium_finders
|
12
|
+
super + [:text, :title]
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
::PageObject::Elements.tag_to_class[:div] = ::PageObject::Elements::Div
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
require 'page-object/nested_elements'
|
2
|
+
|
3
|
+
module PageObject
|
4
|
+
module Elements
|
5
|
+
#
|
6
|
+
# Contains functionality that is common across all elements.
|
7
|
+
#
|
8
|
+
# @see PageObject::Platforms::WatirWebDriver::Element for the Watir version of all common methods
|
9
|
+
# @see PageObject::Platforms::SeleniumWebDriver::Element for the Selenium version of all common methods
|
10
|
+
#
|
11
|
+
class Element
|
12
|
+
include ::PageObject::NestedElements
|
13
|
+
|
14
|
+
attr_reader :element
|
15
|
+
|
16
|
+
def initialize(element, platform)
|
17
|
+
@element = element
|
18
|
+
include_platform_for platform
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# click the element
|
23
|
+
#
|
24
|
+
def click
|
25
|
+
element.click
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
#
|
31
|
+
# return true if the element is enabled
|
32
|
+
#
|
33
|
+
def enabled?
|
34
|
+
element.enabled?
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# return true if the element is not enabled
|
39
|
+
#
|
40
|
+
def disabled?
|
41
|
+
not enabled?
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# get the value of the given CSS property
|
46
|
+
#
|
47
|
+
def style(property)
|
48
|
+
element.style property
|
49
|
+
end
|
50
|
+
|
51
|
+
def inspect
|
52
|
+
element.inspect
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# retrieve the class name for an element
|
57
|
+
#
|
58
|
+
def class_name
|
59
|
+
attribute 'class'
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# specify plural form of element
|
64
|
+
#
|
65
|
+
def self.plural_form
|
66
|
+
"#{self.to_s.split('::')[-1].
|
67
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
68
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
69
|
+
tr("-", "_").
|
70
|
+
downcase}s"
|
71
|
+
end
|
72
|
+
|
73
|
+
# @private
|
74
|
+
def self.watir_identifier_for identifier
|
75
|
+
if should_build_watir_xpath(identifier)
|
76
|
+
how = :xpath
|
77
|
+
what = build_xpath_for(identifier)
|
78
|
+
return how => what
|
79
|
+
end
|
80
|
+
all_identities = {}
|
81
|
+
identifier.each do |key, value|
|
82
|
+
each = {key => value}
|
83
|
+
ident = identifier_for each, watir_finders, watir_mapping
|
84
|
+
all_identities[ident.keys.first] = ident.values.first
|
85
|
+
end
|
86
|
+
all_identities
|
87
|
+
end
|
88
|
+
|
89
|
+
# @private
|
90
|
+
def self.selenium_identifier_for identifier
|
91
|
+
if identifier.length == 1
|
92
|
+
identifier = identifier_for identifier, selenium_finders, selenium_mapping
|
93
|
+
return identifier.keys.first, identifier.values.first
|
94
|
+
elsif identifier.length > 1
|
95
|
+
how = :xpath
|
96
|
+
what = build_xpath_for identifier
|
97
|
+
return how, what
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# @private
|
102
|
+
# delegate calls to driver element
|
103
|
+
def method_missing(*args, &block)
|
104
|
+
m = args.shift
|
105
|
+
$stderr.puts "*** DEPRECATION WARNING"
|
106
|
+
$stderr.puts "*** You are calling a method named #{m} at #{caller[0]}."
|
107
|
+
$stderr.puts "*** This method does not exist in page-object so it is being passed to the driver."
|
108
|
+
$stderr.puts "*** This feature will be removed in the near future."
|
109
|
+
$stderr.puts "*** Please change your code to call the correct page-object method."
|
110
|
+
$stderr.puts "*** If you are using functionality that does not exist in page-object please request it be added."
|
111
|
+
begin
|
112
|
+
element.send m, *args, &block
|
113
|
+
rescue Exception => e
|
114
|
+
raise
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
protected
|
119
|
+
|
120
|
+
def self.should_build_watir_xpath identifier
|
121
|
+
['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label', 'area', 'canvas', 'audio', 'video'].include? identifier[:tag_name] and identifier[:name]
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.build_xpath_for identifier
|
125
|
+
tag_locator = identifier.delete(:tag_name)
|
126
|
+
idx = identifier.delete(:index)
|
127
|
+
if tag_locator == 'input' and identifier[:type] == 'submit'
|
128
|
+
identifier.delete(:type)
|
129
|
+
btn_ident = identifier.clone
|
130
|
+
if btn_ident[:value]
|
131
|
+
btn_ident[:text] = btn_ident[:value]
|
132
|
+
btn_ident.delete(:value)
|
133
|
+
end
|
134
|
+
xpath = ".//button"
|
135
|
+
xpath << "[#{attribute_expression(btn_ident)}]" unless btn_ident.empty?
|
136
|
+
xpath = "(#{xpath})[#{idx+1}]" if idx
|
137
|
+
identifier[:type] = %w[button reset submit image]
|
138
|
+
xpath << " | .//input"
|
139
|
+
else
|
140
|
+
xpath = ".//#{tag_locator}"
|
141
|
+
end
|
142
|
+
xpath << "[#{attribute_expression(identifier)}]" unless identifier.empty?
|
143
|
+
xpath = "(#{xpath})[#{idx+1}]" if idx
|
144
|
+
xpath
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.attribute_expression(identifier)
|
148
|
+
identifier.map do |key, value|
|
149
|
+
if value.kind_of?(Array)
|
150
|
+
"(" + value.map { |v| equal_pair(key, v) }.join(" or ") + ")"
|
151
|
+
else
|
152
|
+
equal_pair(key, value)
|
153
|
+
end
|
154
|
+
end.join(" and ")
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.equal_pair(key, value)
|
158
|
+
if key == :label
|
159
|
+
"@id=//label[normalize-space()=#{xpath_string(value)}]/@for"
|
160
|
+
else
|
161
|
+
"#{lhs_for(key)}=#{xpath_string(value)}"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.lhs_for(key)
|
166
|
+
case key
|
167
|
+
when :text, 'text'
|
168
|
+
'normalize-space()'
|
169
|
+
when :href
|
170
|
+
'normalize-space(@href)'
|
171
|
+
else
|
172
|
+
"@#{key.to_s.gsub("_", "-")}"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def self.xpath_string(value)
|
177
|
+
if value.include? "'"
|
178
|
+
parts = value.split("'", -1).map { |part| "'#{part}'" }
|
179
|
+
string = parts.join(%{,"'",})
|
180
|
+
"concat(#{string})"
|
181
|
+
else
|
182
|
+
"'#{value}'"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.identifier_for identifier, find_by, find_by_mapping
|
187
|
+
how, what = identifier.keys.first, identifier.values.first
|
188
|
+
return how => what if find_by.include? how or how == :tag_name
|
189
|
+
return find_by_mapping[how] => what if find_by_mapping[how]
|
190
|
+
identifier
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.watir_finders
|
194
|
+
[:class, :id, :index, :name, :xpath]
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.watir_mapping
|
198
|
+
{}
|
199
|
+
end
|
200
|
+
|
201
|
+
def self.selenium_finders
|
202
|
+
[:class, :css, :id, :index, :name, :xpath]
|
203
|
+
end
|
204
|
+
|
205
|
+
def self.selenium_mapping
|
206
|
+
{}
|
207
|
+
end
|
208
|
+
|
209
|
+
def include_platform_for platform
|
210
|
+
if platform[:platform] == :watir_webdriver
|
211
|
+
require 'page-object/platforms/watir_webdriver/element'
|
212
|
+
require 'page-object/platforms/watir_webdriver/page_object'
|
213
|
+
self.class.send :include, ::PageObject::Platforms::WatirWebDriver::Element
|
214
|
+
@platform = ::PageObject::Platforms::WatirWebDriver::PageObject.new(@element)
|
215
|
+
elsif platform[:platform] == :selenium_webdriver
|
216
|
+
require 'page-object/platforms/selenium_webdriver/element'
|
217
|
+
require 'page-object/platforms/selenium_webdriver/page_object'
|
218
|
+
self.class.send :include, ::PageObject::Platforms::SeleniumWebDriver::Element
|
219
|
+
@platform = ::PageObject::Platforms::SeleniumWebDriver::PageObject.new(@element)
|
220
|
+
else
|
221
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class FileField < Element
|
5
|
+
|
6
|
+
def initialize(element, platform)
|
7
|
+
@element = element
|
8
|
+
include_platform_for platform
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def self.watir_finders
|
14
|
+
super + [:title, :label]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.selenium_finders
|
18
|
+
super + [:title, :label]
|
19
|
+
end
|
20
|
+
|
21
|
+
def include_platform_for platform
|
22
|
+
super
|
23
|
+
if platform[:platform] == :watir_webdriver
|
24
|
+
require 'page-object/platforms/watir_webdriver/file_field'
|
25
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::FileField
|
26
|
+
elsif platform[:platform] == :selenium_webdriver
|
27
|
+
require 'page-object/platforms/selenium_webdriver/file_field'
|
28
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::FileField
|
29
|
+
else
|
30
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
::PageObject::Elements.type_to_class[:file] = ::PageObject::Elements::FileField
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class Form < Element
|
5
|
+
def initialize(element, platform)
|
6
|
+
@element = element
|
7
|
+
include_platform_for platform
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def self.watir_finders
|
13
|
+
super + [:action]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.selenium_finders
|
17
|
+
super + [:action]
|
18
|
+
end
|
19
|
+
|
20
|
+
def include_platform_for platform
|
21
|
+
super
|
22
|
+
if platform[:platform] == :watir_webdriver
|
23
|
+
require 'page-object/platforms/watir_webdriver/form'
|
24
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::Form
|
25
|
+
elsif platform[:platform] == :selenium_webdriver
|
26
|
+
require 'page-object/platforms/selenium_webdriver/form'
|
27
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Form
|
28
|
+
else
|
29
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
::PageObject::Elements.tag_to_class[:form] = ::PageObject::Elements::Form
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class Heading < Element
|
4
|
+
|
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
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class HiddenField < Element
|
4
|
+
|
5
|
+
def click
|
6
|
+
raise "click is not available on hidden field element with Selenium or Watir"
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def self.watir_finders
|
12
|
+
super + [:text, :value]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.selenium_finders
|
16
|
+
super + [:value]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
::PageObject::Elements.type_to_class[:hidden] = ::PageObject::Elements::HiddenField
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class Image < Element
|
4
|
+
def initialize(element, platform)
|
5
|
+
@element = element
|
6
|
+
include_platform_for platform
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def self.watir_finders
|
12
|
+
super + [:alt, :src]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.selenium_finders
|
16
|
+
super + [:alt, :src, :css]
|
17
|
+
end
|
18
|
+
|
19
|
+
def include_platform_for platform
|
20
|
+
super
|
21
|
+
if platform[:platform] == :watir_webdriver
|
22
|
+
require 'page-object/platforms/watir_webdriver/image'
|
23
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::Image
|
24
|
+
elsif platform[:platform] == :selenium_webdriver
|
25
|
+
require 'page-object/platforms/selenium_webdriver/image'
|
26
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Image
|
27
|
+
else
|
28
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
::PageObject::Elements.tag_to_class[:img] = ::PageObject::Elements::Image
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class Label < Element
|
4
|
+
|
5
|
+
def initialize(element, platform)
|
6
|
+
@element = element
|
7
|
+
include_platform_for platform
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def self.watir_finders
|
13
|
+
super + [:text]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.selenium_finders
|
17
|
+
super + [:text]
|
18
|
+
end
|
19
|
+
|
20
|
+
def include_platform_for platform
|
21
|
+
super
|
22
|
+
if platform[:platform] == :watir_webdriver
|
23
|
+
require 'page-object/platforms/watir_webdriver/label'
|
24
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::Label
|
25
|
+
elsif platform[:platform] == :selenium_webdriver
|
26
|
+
require 'page-object/platforms/selenium_webdriver/radio_button'
|
27
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Label
|
28
|
+
else
|
29
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
::PageObject::Elements.tag_to_class[:label] = ::PageObject::Elements::Label
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
module PageObject
|
3
|
+
module Elements
|
4
|
+
class Link < Element
|
5
|
+
|
6
|
+
def initialize(element, platform)
|
7
|
+
@element = element
|
8
|
+
include_platform_for platform
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def self.watir_finders
|
14
|
+
super + [:href, :text, :css, :title]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.watir_mapping
|
18
|
+
super.merge({:link => :text, :link_text => :text})
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.selenium_finders
|
22
|
+
super + [:link, :link_text, :title]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.selenium_mapping
|
26
|
+
super.merge(:text => :link_text)
|
27
|
+
end
|
28
|
+
|
29
|
+
def include_platform_for platform
|
30
|
+
super
|
31
|
+
if platform[:platform] == :watir_webdriver
|
32
|
+
require 'page-object/platforms/watir_webdriver/link'
|
33
|
+
self.class.send :include, PageObject::Platforms::WatirWebDriver::Link
|
34
|
+
elsif platform[:platform] == :selenium_webdriver
|
35
|
+
require 'page-object/platforms/selenium_webdriver/link'
|
36
|
+
self.class.send :include, PageObject::Platforms::SeleniumWebDriver::Link
|
37
|
+
else
|
38
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
::PageObject::Elements.tag_to_class[:a] = ::PageObject::Elements::Link
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PageObject
|
2
|
+
module Elements
|
3
|
+
class ListItem < Element
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def self.watir_finders
|
8
|
+
super + [:text]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.selenium_finders
|
12
|
+
super + [:text]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
::PageObject::Elements.tag_to_class[:li] = ::PageObject::Elements::ListItem
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|