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
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# adding rake so travis-ci will build properly
|
4
|
+
gem 'rake'
|
5
|
+
gem 'fuubar'
|
6
|
+
gem 'fuubar-cucumber'
|
7
|
+
gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
|
8
|
+
gem 'growl'
|
9
|
+
gem 'guard-rspec'
|
10
|
+
gem 'guard-cucumber'
|
11
|
+
gem 'net-http-persistent'
|
12
|
+
|
13
|
+
gemspec
|
data/Guardfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
|
5
|
+
guard :rspec, cmd: 'rspec --color --format Fuubar' do
|
6
|
+
watch(%r{^spec/.+_spec\.rb$})
|
7
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
8
|
+
watch(%r{^lib/page-object/platforms/(.+)/.+\.rb$}) do |m|
|
9
|
+
["spec/page-object/platforms/#{m[1]}/", "spec/page-object/page-object_spec.rb"]
|
10
|
+
end
|
11
|
+
watch('spec/spec_helper.rb') { "spec" }
|
12
|
+
end
|
13
|
+
|
14
|
+
guard 'cucumber', notification: true, all_after_pass: false, cli: '--profile focus' do
|
15
|
+
watch(%r{^features/.+\.feature$})
|
16
|
+
watch(%r{^features/support/.+$}) { "features" }
|
17
|
+
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
18
|
+
watch(%r{^lib/.+\.rb$}) { "features" }
|
19
|
+
watch(%r{^cucumber.yml$}) { "features" }
|
20
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011-2012 Jeff Morgan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
# meeane-page-object
|
2
|
+
|
3
|
+
A simple fork of Jeff Morgan's page-object gem that assists in creating flexible page objects for testing Columbus Direct websites. The goal is to facilitate creating abstraction layers in your tests to decouple the tests from the items they are testing and to provide a simple interface to the elements on a page. It works with both watir-webdriver and selenium-webdriver.
|
4
|
+
|
5
|
+
The main additions over the original page-object gem are to extend the accessors to find and interact with the particular style of radio buttons used on the Columbus Direct websites. Also, I have extended the _populate_page_with_ method to work with these page element and wait for any AJAX requests these initiate. They work in the same way as the normal radio buttons but rather than using _select_ we use _choose_.
|
6
|
+
|
7
|
+
## Additional Methods Added
|
8
|
+
|
9
|
+
You can declare these label elements using:
|
10
|
+
|
11
|
+
````ruby
|
12
|
+
label(:has_legal_expenses_cover_yes, :for => 'HasLegalExpensesCover_Yes')
|
13
|
+
````
|
14
|
+
|
15
|
+
This will add a _choose_ method in addition to the usual methods PageObjects creates for labels which allow you to select the element as you would a normal radio button. Call this using:
|
16
|
+
|
17
|
+
````ruby
|
18
|
+
choose_has_legal_expenses_cover_yes
|
19
|
+
````
|
20
|
+
|
21
|
+
The _populate_page_with method will pick these elements in exactly the same way as normal radio buttons. This means you can complete each page in the normal way using _populate_page_with_ without having to write any extra code.
|
22
|
+
|
23
|
+
````ruby
|
24
|
+
populate_page_with = data_for(:my_details, data)
|
25
|
+
````
|
26
|
+
|
27
|
+
#### Additional Setup
|
28
|
+
Many of the labels on the Columbus Direct websites (including Household & Travel) initiate an AJAX call using jQuery so the _choose_ methods generated call _wait_for_ajax_ to check the page has been updated before moving on. For this to work you need to declare the javascript library your website is using. Add the following to your env.rb file for the Columbus Direct websites:
|
29
|
+
|
30
|
+
````ruby
|
31
|
+
PageObject.javascript_framework = :jquery
|
32
|
+
````
|
33
|
+
|
34
|
+
## Improvements
|
35
|
+
|
36
|
+
Suggested improvements would be to add a facility to interact with the address widgets on the Columbus Direct pages. I'll look to add these at a later date but will use a different approach rather than forking the master as page-object gem already has an extension point that allows us to define our own Element types and register them with the gem. This would seem a better approach.
|
37
|
+
|
38
|
+
## Documentation
|
39
|
+
|
40
|
+
The project [wiki](https://github.com/cheezy/page-object/wiki/page-object) is the first place to go to learn about how to use page-object.
|
41
|
+
|
42
|
+
The rdocs for this project can be found at [rubydoc.info](http://rubydoc.info/gems/page-object/frames).
|
43
|
+
|
44
|
+
To see the changes from release to release please look at the [ChangeLog](https://raw.github.com/cheezy/page-object/master/ChangeLog)
|
45
|
+
|
46
|
+
To read about the motivation for this gem please read this [blog entry](http://www.cheezyworld.com/2010/11/19/ui-tests-introducing-a-simple-dsl/)
|
47
|
+
|
48
|
+
There is a book that describes in detail how to use this gem and others to create a complete view of testing web and other types of applications. The book is named [Cucumber & Cheese](http://leanpub.com/cucumber_and_cheese)
|
49
|
+
|
50
|
+
## Support
|
51
|
+
|
52
|
+
If you need help using the page-object gem please ask your questions on [Stack Overflow](http://stackoverflow.com). Please be sure to use the [page-object-gem](http://stackoverflow.com/questions/tagged/page-object-gem) tag. If you wish to report an issue or request a new feature use the [github issue tracking page](http://github.com/cheezy/page-object/issues).
|
53
|
+
|
54
|
+
## Basic Usage
|
55
|
+
|
56
|
+
### Defining your page object
|
57
|
+
|
58
|
+
You define a new page object by including the PageObject module:
|
59
|
+
|
60
|
+
````ruby
|
61
|
+
class LoginPage
|
62
|
+
include PageObject
|
63
|
+
end
|
64
|
+
````
|
65
|
+
|
66
|
+
When you include this module numerous methods are added to your class that allow you to easily define your page. For the login page you might add the following:
|
67
|
+
|
68
|
+
````ruby
|
69
|
+
class LoginPage
|
70
|
+
include PageObject
|
71
|
+
|
72
|
+
_(:username, :id => 'username')
|
73
|
+
text_field(:password, :id => 'password')
|
74
|
+
button(:login, :id => 'login')
|
75
|
+
end
|
76
|
+
````
|
77
|
+
|
78
|
+
Calling the _text_field_ and _button_ methods adds several methods to our page object that allow us to interact with the items on the page. To login using this page we could simply write the following code:
|
79
|
+
|
80
|
+
````ruby
|
81
|
+
login_page.username = 'cheezy'
|
82
|
+
login_page.password = 'secret'
|
83
|
+
login_page.login
|
84
|
+
````
|
85
|
+
|
86
|
+
Another approach might be to create higher level methods on our page object that hide the implementation details even further. Our page object might look like this:
|
87
|
+
|
88
|
+
````ruby
|
89
|
+
class LoginPage
|
90
|
+
include PageObject
|
91
|
+
|
92
|
+
text_field(:username, :id => 'username')
|
93
|
+
text_field(:password, :id => 'password')
|
94
|
+
button(:login, :id => 'login')
|
95
|
+
|
96
|
+
def login_with(username, password)
|
97
|
+
self.username = username
|
98
|
+
self.password = password
|
99
|
+
login
|
100
|
+
end
|
101
|
+
end
|
102
|
+
````
|
103
|
+
|
104
|
+
and your usage of the page would become:
|
105
|
+
|
106
|
+
````ruby
|
107
|
+
login_page.login_with 'cheezy', 'secret'
|
108
|
+
````
|
109
|
+
|
110
|
+
### Creating your page object
|
111
|
+
page-object supports both [watir-webdriver](https://github.com/jarib/watir-webdriver) and [selenium-webdriver](http://seleniumhq.org/docs/03_webdriver.html). The one used will be determined by which driver you pass into the constructor of your page object. The page object can be created like this:
|
112
|
+
|
113
|
+
````ruby
|
114
|
+
browser = Watir::Browser.new :firefox
|
115
|
+
my_page_object = MyPageObject.new(browser)
|
116
|
+
````
|
117
|
+
|
118
|
+
or
|
119
|
+
|
120
|
+
````ruby
|
121
|
+
browser = Selenium::WebDriver.for :firefox
|
122
|
+
my_page_object = MyPageObject.new(browser)
|
123
|
+
````
|
124
|
+
|
125
|
+
## Known Issues
|
126
|
+
|
127
|
+
See [http://github.com/cheezy/page-object/issues](http://github.com/cheezy/page-object/issues)
|
128
|
+
|
129
|
+
## Contribute
|
130
|
+
|
131
|
+
* Fork the project.
|
132
|
+
* Test drive your feature addition or bug fix. Adding specs is important and I will not accept a pull request that does not have tests.
|
133
|
+
* Make sure you describe your new feature with a cucumber scenario.
|
134
|
+
* Make sure you provide RDoc comments for any new public method you add. Remember, others will be using this gem.
|
135
|
+
* Commit, do not mess with Rakefile, version, or ChangeLog.
|
136
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
137
|
+
* Send me a pull request. Bonus points for topic branches.
|
138
|
+
|
139
|
+
## Copyright
|
140
|
+
|
141
|
+
Copyright (c) 2011-2012 Jeffrey S. Morgan. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'cucumber'
|
5
|
+
require 'cucumber/rake/task'
|
6
|
+
|
7
|
+
Bundler::GemHelper.install_tasks
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
10
|
+
spec.ruby_opts = "-I lib:spec"
|
11
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
12
|
+
end
|
13
|
+
task :spec
|
14
|
+
|
15
|
+
namespace :features do
|
16
|
+
Cucumber::Rake::Task.new(:watir_webdriver, "Run features with Watir") do |t|
|
17
|
+
t.profile = "watir_webdriver"
|
18
|
+
end
|
19
|
+
|
20
|
+
Cucumber::Rake::Task.new(:selenium_webdriver, "Run features with Selenium") do |t|
|
21
|
+
t.profile = "selenium_webdriver"
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Run all features'
|
25
|
+
task :all => [:watir_webdriver, :selenium_webdriver]
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'Run all specs and cukes'
|
29
|
+
task :test => ['spec', 'features:all']
|
30
|
+
|
31
|
+
task :lib do
|
32
|
+
$LOAD_PATH.unshift(File.expand_path("lib", File.dirname(__FILE__)))
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :test
|
data/cucumber.yml
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
<%
|
2
|
+
std_opts = "--no-source --color --format pretty" # Cucumber::Formatter::Fuubar"
|
3
|
+
%>
|
4
|
+
|
5
|
+
default: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only
|
6
|
+
watir_webdriver: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only
|
7
|
+
selenium_webdriver: DRIVER=SELENIUM <%= std_opts %> --tags ~@watir_only
|
8
|
+
focus: DRIVER=WATIR <%= std_opts %> --tags ~@selenium_only --tags @focus
|
9
|
+
#focus: DRIVER=SELENIUM <%= std_opts %> --tags ~@watir_only --tags @focus
|
10
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Feature: Area
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I am on the static elements page
|
5
|
+
|
6
|
+
Scenario: Retrieve an area element
|
7
|
+
When I retrieve the area element
|
8
|
+
Then I should know it exists
|
9
|
+
And I should know it is visible
|
10
|
+
|
11
|
+
Scenario Outline: Locating areas on the page
|
12
|
+
When I search for the area by "<search_by>"
|
13
|
+
Then I should be able to click the area
|
14
|
+
|
15
|
+
Examples:
|
16
|
+
| search_by |
|
17
|
+
| id |
|
18
|
+
| class |
|
19
|
+
| name |
|
20
|
+
| xpath |
|
21
|
+
| index |
|
22
|
+
| css |
|
23
|
+
|
24
|
+
Scenario: Getting the coordinates for the area
|
25
|
+
When I retrieve the area element
|
26
|
+
Then I should see the coordinates are "0,0,82,126"
|
27
|
+
|
28
|
+
Scenario: Getting the shape for the area
|
29
|
+
When I retrieve the area element
|
30
|
+
Then I should see the shape is "rect"
|
31
|
+
|
32
|
+
Scenario: Getting the href from the area
|
33
|
+
When I retrieve the area element
|
34
|
+
Then I should see the href is "sun.html"
|
35
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Feature: Handling Asynch calls
|
2
|
+
|
3
|
+
Scenario: Link element methods
|
4
|
+
Given I am on the static elements page
|
5
|
+
When I retrieve a link element
|
6
|
+
Then I should be able to wait until it is present
|
7
|
+
And I should be able to wait until it is visible
|
8
|
+
And I should be able to wait until it is not visible
|
9
|
+
And I should be able to wait until a block returns true
|
10
|
+
|
11
|
+
Scenario: Click a button when it is visible
|
12
|
+
Given I am on the async elements page
|
13
|
+
When I make the button invisible
|
14
|
+
Then I should be able to click it when it becomses visible
|
15
|
+
|
16
|
+
Scenario: Wait until something is not visible
|
17
|
+
Given I am on the async elements page
|
18
|
+
Then I should be able to wait until the button becomes invisible
|
19
|
+
|
20
|
+
Scenario: Wait for an element to appear on the page
|
21
|
+
Given I am on the async elements page
|
22
|
+
When I add a button a few seconds from now
|
23
|
+
Then I should be able to click it when it gets added
|
24
|
+
|
25
|
+
Scenario: Wait for an element to disappear from the page
|
26
|
+
Given I am on the async elements page
|
27
|
+
When I add a button a few seconds from now
|
28
|
+
And I remove a button a few seconds from now
|
29
|
+
Then I should not be able to find the button
|
30
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
Feature: Support for the audio element
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I am on the static elements page
|
5
|
+
|
6
|
+
Scenario: finding an audio element
|
7
|
+
When I retrieve the audio element
|
8
|
+
Then I should know it exists
|
9
|
+
And I should know it is visible
|
10
|
+
|
11
|
+
Scenario Outline: Locating an audio element on the page
|
12
|
+
When I search for the audio element by "<search_by>"
|
13
|
+
Then I should know it is visible
|
14
|
+
|
15
|
+
Examples:
|
16
|
+
| search_by |
|
17
|
+
| id |
|
18
|
+
| class |
|
19
|
+
| name |
|
20
|
+
| xpath |
|
21
|
+
| index |
|
22
|
+
| css |
|
23
|
+
|
24
|
+
Scenario Outline: Locating audios using multiple parameters
|
25
|
+
When I search for the audio element by "<param1>" and "<param2>"
|
26
|
+
Then I should know it is visible
|
27
|
+
|
28
|
+
Examples:
|
29
|
+
| param1 | param2 |
|
30
|
+
| class | index |
|
31
|
+
| name | index |
|
32
|
+
|
33
|
+
Scenario: Should know if it is autoplay
|
34
|
+
When I retrieve the audio element
|
35
|
+
Then I should know the audio is not autoplay
|
36
|
+
|
37
|
+
Scenario: Should know if the controls are displayed
|
38
|
+
When I retrieve the audio element
|
39
|
+
Then I should know that the controls are displayed
|
40
|
+
|
41
|
+
Scenario: Should know if it is paused
|
42
|
+
When I retrieve the audio element
|
43
|
+
Then I should know that the audio is paused
|
44
|
+
|
45
|
+
Scenario: Should know its duration
|
46
|
+
When I retrieve the audio element
|
47
|
+
Then I should know that the duration is greater than 74 seconds
|
48
|
+
|
49
|
+
Scenario: Should know its volume
|
50
|
+
When I retrieve the audio element
|
51
|
+
Then I should know that its volume is 1
|
52
|
+
|
53
|
+
Scenario: Should know if it has ended
|
54
|
+
When I retrieve the audio element
|
55
|
+
Then I should know that it has not ended
|
56
|
+
|
57
|
+
Scenario: Should know if it is seeking
|
58
|
+
When I retrieve the audio element
|
59
|
+
Then I should know that it is not seeking
|
60
|
+
|
61
|
+
Scenario: Should know if it is in a loop
|
62
|
+
When I retrieve the audio element
|
63
|
+
Then I should know that it is not in a loop
|
64
|
+
|
65
|
+
Scenario: Should know if it is muted
|
66
|
+
When I retrieve the audio element
|
67
|
+
Then I should know that it is muted
|
68
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
Feature: Button
|
2
|
+
In order to interact with buttons
|
3
|
+
Testers will need access and interrogation ability
|
4
|
+
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am on the static elements page
|
8
|
+
|
9
|
+
Scenario: Clicking a button (type=submit)
|
10
|
+
When I click the button
|
11
|
+
Then I should be on the success page
|
12
|
+
|
13
|
+
Scenario: Clicking a button (type=image)
|
14
|
+
When I click the button with type image
|
15
|
+
Then I should be on the success page
|
16
|
+
|
17
|
+
Scenario: Clicking an image button by src
|
18
|
+
When I click the image button using src
|
19
|
+
Then I should be on the success page
|
20
|
+
|
21
|
+
Scenario: Clicking an image button by alt
|
22
|
+
When I click the image button using alt
|
23
|
+
Then I should be on the success page
|
24
|
+
|
25
|
+
Scenario: Retrieve a button element
|
26
|
+
When I retrieve a button element
|
27
|
+
Then I should know it exists
|
28
|
+
And I should know it is visible
|
29
|
+
|
30
|
+
Scenario Outline: Locating buttons on the page
|
31
|
+
When I search for the button by "<search_by>"
|
32
|
+
Then I should be able to click the button
|
33
|
+
|
34
|
+
Scenarios:
|
35
|
+
| search_by |
|
36
|
+
| id |
|
37
|
+
| class |
|
38
|
+
| name |
|
39
|
+
| xpath |
|
40
|
+
| index |
|
41
|
+
| value |
|
42
|
+
| css |
|
43
|
+
|
44
|
+
Scenario Outline: Locating real buttons on the page
|
45
|
+
When I search for the button by "<search_by>"
|
46
|
+
Then I should be able to click the real button
|
47
|
+
|
48
|
+
Scenarios:
|
49
|
+
| search_by |
|
50
|
+
| id |
|
51
|
+
| class |
|
52
|
+
| name |
|
53
|
+
| index |
|
54
|
+
| value |
|
55
|
+
|
56
|
+
@watir_only
|
57
|
+
Scenario Outline: Locating buttons on Watir only
|
58
|
+
When I search for the button by "<search_by>"
|
59
|
+
Then I should be able to click the button
|
60
|
+
|
61
|
+
Scenarios:
|
62
|
+
| search_by |
|
63
|
+
| text |
|
64
|
+
|
65
|
+
Scenario Outline: Locating button using multiple parameters
|
66
|
+
When I search for the button by "<param1>" and "<param2>"
|
67
|
+
Then I should be able to click the button
|
68
|
+
|
69
|
+
Scenarios:
|
70
|
+
| param1 | param2 |
|
71
|
+
| class | index |
|
72
|
+
| name | index |
|
73
|
+
|
74
|
+
Scenario Outline: Locating real button using multiple parameters
|
75
|
+
When I search for the button by "<param1>" and "<param2>"
|
76
|
+
Then I should be able to click the real button
|
77
|
+
|
78
|
+
Scenarios:
|
79
|
+
| param1 | param2 |
|
80
|
+
| class | index |
|
81
|
+
| name | index |
|
82
|
+
|
83
|
+
Scenario: Finding a button dynamically
|
84
|
+
When I find a button while the script is executing
|
85
|
+
Then I should see that the button exists
|
86
|
+
And I should be able to click the button element
|
87
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Feature: Support for the canvas element
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I am on the static elements page
|
5
|
+
|
6
|
+
Scenario: Retrieve a canvas element
|
7
|
+
When I retrieve the canvas element
|
8
|
+
Then I should know it exists
|
9
|
+
And I should know it is visible
|
10
|
+
|
11
|
+
Scenario Outline: Locating a canvas on the page
|
12
|
+
When I search for the canvas by "<search_by>"
|
13
|
+
Then I should know it is visible
|
14
|
+
|
15
|
+
Examples:
|
16
|
+
| search_by |
|
17
|
+
| id |
|
18
|
+
| class |
|
19
|
+
| name |
|
20
|
+
| xpath |
|
21
|
+
| index |
|
22
|
+
| css |
|
23
|
+
|
24
|
+
Scenario: Determining the width and height of the canvas
|
25
|
+
When I retrieve the canvas element
|
26
|
+
Then I should see that the canvas width is "200"
|
27
|
+
And I should see that the canvas height is "100"
|
28
|
+
|
29
|
+
Scenario Outline: Locating canvases using multiple parameters
|
30
|
+
When I search for the canvas element by "<param1>" and "<param2>"
|
31
|
+
Then I should know it is visible
|
32
|
+
|
33
|
+
Scenarios:
|
34
|
+
| param1 | param2 |
|
35
|
+
| class | index |
|
36
|
+
| name | index |
|
37
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
Feature: Check Box
|
2
|
+
In order to interact with check boxes
|
3
|
+
Testers will need access and interrogation ability
|
4
|
+
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am on the static elements page
|
8
|
+
|
9
|
+
Scenario: Selecting a check box
|
10
|
+
When I select the First check box
|
11
|
+
Then the First check box should be selected
|
12
|
+
When I unselect the First check box
|
13
|
+
Then the First check box should not be selected
|
14
|
+
|
15
|
+
Scenario Outline: Locating check boxes on the page
|
16
|
+
When I search for the check box by "<search_by>"
|
17
|
+
Then I should be able to check the check box
|
18
|
+
|
19
|
+
Scenarios:
|
20
|
+
| search_by |
|
21
|
+
| id |
|
22
|
+
| class |
|
23
|
+
| name |
|
24
|
+
| xpath |
|
25
|
+
| index |
|
26
|
+
| value |
|
27
|
+
| label |
|
28
|
+
|
29
|
+
@selenium_only
|
30
|
+
Scenario Outline: Locating check boxes on the page
|
31
|
+
When I search for the check box by "<search_by>"
|
32
|
+
Then I should be able to check the check box
|
33
|
+
|
34
|
+
Scenarios:
|
35
|
+
| search_by |
|
36
|
+
| css |
|
37
|
+
|
38
|
+
Scenario Outline: Locating check boxes using multiple parameters
|
39
|
+
When I search for the check box by "<param1>" and "<param2>"
|
40
|
+
Then I should be able to check the check box
|
41
|
+
|
42
|
+
Scenarios:
|
43
|
+
| param1 | param2 |
|
44
|
+
| class | index |
|
45
|
+
| name | index |
|
46
|
+
|
47
|
+
Scenario: Retrieve a CheckBox
|
48
|
+
When I retrieve a check box element
|
49
|
+
Then I should know it exists
|
50
|
+
And I should know it is visible
|
51
|
+
|
52
|
+
Scenario: Finding a check box dynamically
|
53
|
+
When I select the first check box while the script is executing
|
54
|
+
Then I should see that the checkbox exists
|
55
|
+
And the First check box should be selected
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: Div
|
2
|
+
In order to interact with divs
|
3
|
+
Testers will need access and interrogation ability
|
4
|
+
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am on the static elements page
|
8
|
+
|
9
|
+
Scenario: Getting the text from a div
|
10
|
+
When I get the text from the div
|
11
|
+
Then the text should be "page-object rocks!"
|
12
|
+
|
13
|
+
Scenario: Getting the div element
|
14
|
+
When I retrieve the div element
|
15
|
+
Then I should know it exists
|
16
|
+
And I should know it is visible
|
17
|
+
|
18
|
+
Scenario Outline: Locating divs on the page
|
19
|
+
When I search for the div by "<search_by>"
|
20
|
+
Then the text should be "page-object rocks!"
|
21
|
+
|
22
|
+
Scenarios:
|
23
|
+
| search_by |
|
24
|
+
| id |
|
25
|
+
| class |
|
26
|
+
| xpath |
|
27
|
+
| index |
|
28
|
+
| name |
|
29
|
+
| text |
|
30
|
+
| title |
|
31
|
+
| css |
|
32
|
+
|
33
|
+
Scenario Outline: Locating divs using multiple parameters
|
34
|
+
When I search for the div by "<param1>" and "<param2>"
|
35
|
+
Then the text should be "page-object rocks!"
|
36
|
+
|
37
|
+
Scenarios:
|
38
|
+
| param1 | param2 |
|
39
|
+
| class | index |
|
40
|
+
| name | index |
|
41
|
+
|
42
|
+
Scenario: Finding a div dynamically
|
43
|
+
When I get the text from a div while the script is executing
|
44
|
+
Then I should see that the div exists
|
45
|
+
And the text should be "page-object rocks!"
|