page-object 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -2
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/ChangeLog +23 -0
- data/README.md +2 -0
- data/features/button.feature +37 -0
- data/features/div.feature +45 -0
- data/features/html/static_elements.html +21 -3
- data/features/html/success.html +8 -0
- data/features/link.feature +1 -4
- data/features/step_definitions/accessor_steps.rb +37 -0
- data/features/step_definitions/element_steps.rb +18 -0
- data/features/step_definitions/table_steps.rb +14 -0
- data/features/support/page.rb +26 -1
- data/features/table.feature +52 -0
- data/features/table_cell.feature +45 -0
- data/lib/page-object/accessors.rb +88 -0
- data/lib/page-object/elements/button.rb +4 -7
- data/lib/page-object/elements/check_box.rb +0 -8
- data/lib/page-object/elements/div.rb +12 -0
- data/lib/page-object/elements/element.rb +22 -12
- data/lib/page-object/elements/link.rb +0 -8
- data/lib/page-object/elements/radio_button.rb +0 -8
- data/lib/page-object/elements/select_list.rb +0 -9
- data/lib/page-object/elements/table.rb +26 -0
- data/lib/page-object/elements/table_cell.rb +7 -0
- data/lib/page-object/elements/table_row.rb +26 -0
- data/lib/page-object/elements/text_field.rb +0 -9
- data/lib/page-object/elements.rb +4 -0
- data/lib/page-object/platforms/selenium_element.rb +29 -0
- data/lib/page-object/platforms/selenium_table.rb +24 -0
- data/lib/page-object/platforms/selenium_table_row.rb +16 -0
- data/lib/page-object/platforms/watir_element.rb +29 -0
- data/lib/page-object/platforms/watir_table.rb +15 -0
- data/lib/page-object/platforms/watir_table_row.rb +15 -0
- data/lib/page-object/selenium_page_object.rb +68 -1
- data/lib/page-object/version.rb +1 -1
- data/lib/page-object/watir_page_object.rb +67 -0
- data/spec/page-object/accessors_spec.rb +135 -8
- data/spec/page-object/elements/div_spec.rb +22 -0
- data/spec/page-object/elements/element_spec.rb +10 -1
- data/spec/page-object/elements/table_row_spec.rb +25 -0
- data/spec/page-object/elements/table_spec.rb +45 -0
- metadata +33 -4
- data/lib/page-object/selenium_element.rb +0 -12
- data/lib/page-object/watir_element.rb +0 -12
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format doc
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.2
|
data/ChangeLog
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
=== Version 0.0.2
|
2
|
+
* Enhancements
|
3
|
+
* Added support for the following elements
|
4
|
+
* div
|
5
|
+
* button
|
6
|
+
* table
|
7
|
+
* table row
|
8
|
+
* table cell
|
9
|
+
* added #text to element
|
10
|
+
|
11
|
+
=== Version 0.0.1 / 2011-05-22
|
12
|
+
* Enhancements
|
13
|
+
* Support for the following elements
|
14
|
+
* check box
|
15
|
+
* link
|
16
|
+
* radio button
|
17
|
+
* select list
|
18
|
+
* text field
|
19
|
+
|
20
|
+
* Support for the following page level functions
|
21
|
+
* text
|
22
|
+
* html
|
23
|
+
* title
|
data/README.md
CHANGED
@@ -68,6 +68,8 @@ The rdocs for this project can be found at [rubydoc.info](http://rubydoc.info/gi
|
|
68
68
|
|
69
69
|
If you wish to view the current tracker board you can view it on [Pivotal Tracker](https://www.pivotaltracker.com/projects/289099)
|
70
70
|
|
71
|
+
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/)
|
72
|
+
|
71
73
|
## Known Issues
|
72
74
|
|
73
75
|
See [http://github.com/cheezy/page-object/issues](http://github.com/cheezy/page-object/issues)
|
@@ -0,0 +1,37 @@
|
|
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: Getting the text from a div
|
10
|
+
When I click the button
|
11
|
+
Then I should be on the success page
|
12
|
+
|
13
|
+
Scenario: Retrieve a button element
|
14
|
+
When I retrieve a button element
|
15
|
+
Then I should know it exists
|
16
|
+
And I should know it is visible
|
17
|
+
|
18
|
+
Scenario Outline: Locating buttons on the page
|
19
|
+
When I search for the button by "<search_by>"
|
20
|
+
Then I should be able to click the button
|
21
|
+
|
22
|
+
Scenarios:
|
23
|
+
| search_by |
|
24
|
+
| id |
|
25
|
+
| class |
|
26
|
+
| name |
|
27
|
+
| xpath |
|
28
|
+
|
29
|
+
@watir_only
|
30
|
+
Scenario Outline: Locating check boxes on Watir only
|
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
|
+
| index |
|
37
|
+
| text |
|
@@ -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
|
+
|
28
|
+
@watir_only
|
29
|
+
Scenario Outline: Locating divs on Watir only
|
30
|
+
When I search for the div by "<search_by>"
|
31
|
+
Then the text should be "page-object rocks!"
|
32
|
+
|
33
|
+
Scenarios:
|
34
|
+
| search_by |
|
35
|
+
| index |
|
36
|
+
|
37
|
+
|
38
|
+
@selenium_only
|
39
|
+
Scenario Outline: Locating divs on Watir only
|
40
|
+
When I search for the div by "<search_by>"
|
41
|
+
Then the text should be "page-object rocks!"
|
42
|
+
|
43
|
+
Scenarios:
|
44
|
+
| search_by |
|
45
|
+
| name |
|
@@ -16,11 +16,9 @@
|
|
16
16
|
<option value="option2">Test 2</option>
|
17
17
|
</select>
|
18
18
|
|
19
|
-
<h3>Button</h3>
|
20
|
-
<button id="test_button" onclick="javascript:window.location='http://www.google.com'">Click Me!!</button>
|
21
19
|
|
22
20
|
<h3>Link</h3>
|
23
|
-
<a href="
|
21
|
+
<a href="success.html" id="link_id" name="link_name" class="link_class" >Google Search</a>
|
24
22
|
|
25
23
|
<h3>Check Boxes</h3>
|
26
24
|
<input id="cb_id" name="cb_name" class="cb_class" type="checkbox" value="1" />
|
@@ -28,6 +26,26 @@
|
|
28
26
|
<h3>Radio Buttons</h3>
|
29
27
|
<input type="radio" id="milk_id" name="milk_name" class="milk_class" value="Milk"> Milk <br />
|
30
28
|
<input type="radio" id="butter_id" name="butter_name" class="butter_class" value="Butter">Butter
|
29
|
+
|
30
|
+
<h3>Div</h3>
|
31
|
+
<div id="div_id" name="div_name" class="div_class">
|
32
|
+
page-object rocks!
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<h3>Table</h3>
|
36
|
+
<table id='table_id' name='table_name' class='table_class' border='1'>
|
37
|
+
<tr>
|
38
|
+
<td>Data1</td><td>Data2</td>
|
39
|
+
</tr>
|
40
|
+
<tr>
|
41
|
+
<td>Data3</td><td id='cell_id', name='cell_name' class='cell_class'>Data4</td>
|
42
|
+
</tr>
|
43
|
+
</table>
|
44
|
+
|
45
|
+
<h3>Button</h3>
|
46
|
+
<form method="get" action="success.html">
|
47
|
+
<input id='button_id' name='button_name' class='button_class' type="submit" value="Click Me">
|
48
|
+
</form>
|
31
49
|
</body>
|
32
50
|
</html>
|
33
51
|
|
data/features/link.feature
CHANGED
@@ -2,15 +2,12 @@ Feature: Links
|
|
2
2
|
In order to interact with links
|
3
3
|
Testers will need access and interrogation ability
|
4
4
|
|
5
|
-
Note:
|
6
|
-
Watir supports href
|
7
|
-
|
8
5
|
Background:
|
9
6
|
Given I am on the static elements page
|
10
7
|
|
11
8
|
Scenario: Selecting a link
|
12
9
|
When I select the link labeled "Google Search"
|
13
|
-
Then the page should contain the text "
|
10
|
+
Then the page should contain the text "Success"
|
14
11
|
|
15
12
|
Scenario Outline: Locating links on the Page
|
16
13
|
When I search for the link by "<search_by>"
|
@@ -86,3 +86,40 @@ end
|
|
86
86
|
When /^I select the radio button$/ do
|
87
87
|
@page.send "select_milk_#{@how}".to_sym
|
88
88
|
end
|
89
|
+
|
90
|
+
When /^I get the text from the div$/ do
|
91
|
+
@div_text = @page.div_id
|
92
|
+
end
|
93
|
+
|
94
|
+
Then /^the text should be "([^"]*)"$/ do |expected_text|
|
95
|
+
@div_text.should == expected_text
|
96
|
+
end
|
97
|
+
|
98
|
+
When /^I search for the div by "([^"]*)"$/ do |how|
|
99
|
+
@div_text = @page.send "div_#{how}".to_sym
|
100
|
+
end
|
101
|
+
|
102
|
+
When /^I click the button$/ do
|
103
|
+
@page.button_id
|
104
|
+
end
|
105
|
+
|
106
|
+
Then /^I should be on the success page$/ do
|
107
|
+
@page.text.should include 'Success'
|
108
|
+
@page.title.should == 'Success'
|
109
|
+
end
|
110
|
+
|
111
|
+
When /^I search for the button by "([^"]*)"$/ do |how|
|
112
|
+
@how = how
|
113
|
+
end
|
114
|
+
|
115
|
+
Then /^I should be able to click the button$/ do
|
116
|
+
@page.send "button_#{@how}"
|
117
|
+
end
|
118
|
+
|
119
|
+
When /^I search for the table cell by "([^"]*)"$/ do |how|
|
120
|
+
@cell_data = @page.send "cell_#{how}"
|
121
|
+
end
|
122
|
+
|
123
|
+
When /^I retrieve a table element by "([^"]*)"$/ do |how|
|
124
|
+
@element = @page.send "table_#{how}_table"
|
125
|
+
end
|
@@ -18,6 +18,24 @@ When /^I retrieve a text field$/ do
|
|
18
18
|
@element = @page.text_field_id_text_field
|
19
19
|
end
|
20
20
|
|
21
|
+
When /^I retrieve the div element$/ do
|
22
|
+
@element = @page.div_id_div
|
23
|
+
end
|
24
|
+
|
25
|
+
When /^I retrieve a table element$/ do
|
26
|
+
@element = @page.table_id_table
|
27
|
+
end
|
28
|
+
|
29
|
+
When /^I retrieve a button element$/ do
|
30
|
+
@element = @page.button_id_button
|
31
|
+
end
|
32
|
+
|
33
|
+
When /^I retrieve table cell$/ do
|
34
|
+
@element = @page.cell_id_cell
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
|
21
39
|
Then /^I should know it exists$/ do
|
22
40
|
@element.should exist
|
23
41
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Then /^the data for row "([^"]*)" should be "([^"]*)" and "([^"]*)"$/ do |row, col1, col2|
|
2
|
+
table_row = @element[row.to_i - 1]
|
3
|
+
table_row[0].text.should == col1
|
4
|
+
table_row[1].text.should == col2
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
When /^I retrieve the data from the table cell$/ do
|
9
|
+
@cell_data = @page.cell_id
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /^the cell data should be '([^"]*)'$/ do |expected|
|
13
|
+
@cell_data.should == expected
|
14
|
+
end
|
data/features/support/page.rb
CHANGED
@@ -17,7 +17,7 @@ class Page
|
|
17
17
|
link(:google_search_xpath, :xpath => "//a[text()='Google Search']")
|
18
18
|
link(:google_search_link, :link => "Google Search")
|
19
19
|
link(:google_search_link_text, :link_text => "Google Search")
|
20
|
-
link(:google_search_href, :href => "
|
20
|
+
link(:google_search_href, :href => "success.html")
|
21
21
|
link(:google_search_text, :text => "Google Search")
|
22
22
|
link(:google_search_index, :index => 0)
|
23
23
|
|
@@ -42,4 +42,29 @@ class Page
|
|
42
42
|
radio_button(:milk_xpath, :xpath => "//input[@type='radio']")
|
43
43
|
|
44
44
|
radio_button(:butter_id, :id => 'butter_id')
|
45
|
+
|
46
|
+
div(:div_id, :id => 'div_id')
|
47
|
+
div(:div_name, :name => 'div_name')
|
48
|
+
div(:div_class, :class => 'div_class')
|
49
|
+
div(:div_index, :index => 0)
|
50
|
+
div(:div_xpath, :xpath => '//div')
|
51
|
+
|
52
|
+
table(:table_id, :id => 'table_id')
|
53
|
+
table(:table_name, :name => 'table_name')
|
54
|
+
table(:table_class, :class => 'table_class')
|
55
|
+
table(:table_index, :index => 0)
|
56
|
+
table(:table_xpath, :xpath => '//table')
|
57
|
+
|
58
|
+
cell(:cell_id, :id => 'cell_id')
|
59
|
+
cell(:cell_name, :name => 'cell_name')
|
60
|
+
cell(:cell_class, :class => 'cell_class')
|
61
|
+
cell(:cell_index, :index => 3)
|
62
|
+
cell(:cell_xpath, :xpath => '//table//tr[2]//td[2]')
|
63
|
+
|
64
|
+
button(:button_id, :id => 'button_id')
|
65
|
+
button(:button_name, :name => 'button_name')
|
66
|
+
button(:button_class, :class => 'button_class')
|
67
|
+
button(:button_index, :index => 0)
|
68
|
+
button(:button_xpath, :xpath=> "//input[@type='submit']")
|
69
|
+
button(:button_text, :text => 'Click Me')
|
45
70
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Feature: Table
|
2
|
+
In order to interact with tables
|
3
|
+
Testers will need access and interrogation ability
|
4
|
+
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am on the static elements page
|
8
|
+
|
9
|
+
Scenario: Retrieve a table
|
10
|
+
When I retrieve a table element
|
11
|
+
Then I should know it is visible
|
12
|
+
|
13
|
+
@watir_only
|
14
|
+
Scenario: Determine if a table exists
|
15
|
+
When I retrieve a table element
|
16
|
+
Then I should know it exists
|
17
|
+
|
18
|
+
Scenario: Retrieve the data from a table
|
19
|
+
When I retrieve a table element
|
20
|
+
Then the data for row "1" should be "Data1" and "Data2"
|
21
|
+
And the data for row "2" should be "Data3" and "Data4"
|
22
|
+
|
23
|
+
|
24
|
+
Scenario Outline: Locating table cells on the Page
|
25
|
+
When I retrieve a table element by "<search_by>"
|
26
|
+
Then the data for row "1" should be "Data1" and "Data2"
|
27
|
+
|
28
|
+
Scenarios:
|
29
|
+
| search_by |
|
30
|
+
| id |
|
31
|
+
| class |
|
32
|
+
| xpath |
|
33
|
+
|
34
|
+
|
35
|
+
@watir_only
|
36
|
+
Scenario Outline: Locating table cells on the Page with watir
|
37
|
+
When I retrieve a table element by "<search_by>"
|
38
|
+
Then the data for row "1" should be "Data1" and "Data2"
|
39
|
+
|
40
|
+
Scenarios:
|
41
|
+
| search_by |
|
42
|
+
| index |
|
43
|
+
|
44
|
+
|
45
|
+
@selenium_only
|
46
|
+
Scenario Outline: Locating table cells on the Page with selenium
|
47
|
+
When I retrieve a table element by "<search_by>"
|
48
|
+
Then the data for row "1" should be "Data1" and "Data2"
|
49
|
+
|
50
|
+
Scenarios:
|
51
|
+
| search_by |
|
52
|
+
| name |
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: Table Cell
|
2
|
+
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given I am on the static elements page
|
6
|
+
|
7
|
+
Scenario: Retrieving the text from a table cell
|
8
|
+
When I retrieve the data from the table cell
|
9
|
+
Then the cell data should be 'Data4'
|
10
|
+
|
11
|
+
Scenario Outline: Locating table cells on the Page
|
12
|
+
When I search for the table cell by "<search_by>"
|
13
|
+
Then the cell data should be 'Data4'
|
14
|
+
|
15
|
+
Scenarios:
|
16
|
+
| search_by |
|
17
|
+
| id |
|
18
|
+
| class |
|
19
|
+
| xpath |
|
20
|
+
|
21
|
+
|
22
|
+
@watir_only
|
23
|
+
Scenario Outline: Locating table cells on the Page with watir
|
24
|
+
When I search for the table cell by "<search_by>"
|
25
|
+
Then the cell data should be 'Data4'
|
26
|
+
|
27
|
+
Scenarios:
|
28
|
+
| search_by |
|
29
|
+
| index |
|
30
|
+
|
31
|
+
@selenium_only
|
32
|
+
Scenario Outline: Locating table cells on the Page with watir
|
33
|
+
When I search for the table cell by "<search_by>"
|
34
|
+
Then the cell data should be 'Data4'
|
35
|
+
|
36
|
+
Scenarios:
|
37
|
+
| search_by |
|
38
|
+
| name |
|
39
|
+
|
40
|
+
Scenario: Retrieve a cell from a table by id
|
41
|
+
When I retrieve table cell
|
42
|
+
Then I should know it exists
|
43
|
+
And I should know it is visible
|
44
|
+
|
45
|
+
|
@@ -163,8 +163,96 @@ module PageObject
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
+
#
|
167
|
+
# adds two methods - one to click a button and another to
|
168
|
+
# return the button element.
|
169
|
+
#
|
170
|
+
# Example: button(:purchase, :id => 'purchase')
|
171
|
+
# will generate a 'purchase' and 'purchase_button' methods.
|
172
|
+
#
|
173
|
+
# @param the name used for the generated methods
|
174
|
+
# @param identifier how we find a checkbox. The valid values are:
|
175
|
+
# :class => Watir and Selenium
|
176
|
+
# :id => Watir and Selenium
|
177
|
+
# :index => Watir only
|
178
|
+
# :name => Watir and Selenium
|
179
|
+
# :text => Watir only
|
180
|
+
# :xpath => Watir and Selenium
|
181
|
+
#
|
166
182
|
def button(name, identifier)
|
167
183
|
define_method(name) do
|
184
|
+
platform.click_button_for identifier
|
185
|
+
end
|
186
|
+
define_method("#{name}_button") do
|
187
|
+
platform.button_for identifier
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# adds two methods - one to retrieve the text from a div
|
193
|
+
# and another to return the div element
|
194
|
+
#
|
195
|
+
# Example: div(:message, {:id => 'message'})
|
196
|
+
# will generate a 'message' and 'message_div' methods
|
197
|
+
#
|
198
|
+
# @param the name used for the generated methods
|
199
|
+
# @param identifier how we find a checkbox. The valid values are:
|
200
|
+
# :class => Watir and Selenium
|
201
|
+
# :id => Watir and Selenium
|
202
|
+
# :index => Watir only
|
203
|
+
# :name => Selenium only
|
204
|
+
# :xpath => Watir and Selenium
|
205
|
+
#
|
206
|
+
def div(name, identifier)
|
207
|
+
define_method("#{name}") do
|
208
|
+
platform.div_text_for identifier
|
209
|
+
end
|
210
|
+
define_method("#{name}_div") do
|
211
|
+
platform.div_for identifier
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
#
|
216
|
+
# adds a method to retrieve the table element
|
217
|
+
#
|
218
|
+
# Example: table(:cart, :id => 'shopping_cart')
|
219
|
+
# will generate a 'cart_table' method.
|
220
|
+
#
|
221
|
+
# @param the name used for the generated methods
|
222
|
+
# @param identifier how we find a checkbox. The valid values are:
|
223
|
+
# :class => Watir and Selenium
|
224
|
+
# :id => Watir and Selenium
|
225
|
+
# :index => Watir only
|
226
|
+
# :name => Selenium only
|
227
|
+
# :xpath => Watir and Selenium
|
228
|
+
#
|
229
|
+
def table(name, identifier)
|
230
|
+
define_method("#{name}_table") do
|
231
|
+
platform.table_for identifier
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
#
|
236
|
+
# adds two methods one to retrieve the text from a table cell
|
237
|
+
# and another to return the table cell element
|
238
|
+
#
|
239
|
+
# Example: cell(:total, :id => 'total_cell')
|
240
|
+
# will generate a 'total' and 'total_cell' methods
|
241
|
+
#
|
242
|
+
# @param the name used for the generated methods
|
243
|
+
# @param identifier how we find a checkbox. The valid values are:
|
244
|
+
# :class => Watir and Selenium
|
245
|
+
# :id => Watir and Selenium
|
246
|
+
# :index => Watir only
|
247
|
+
# :name => Selenium only
|
248
|
+
# :xpath => Watir and Selenium
|
249
|
+
#
|
250
|
+
def cell(name, identifier)
|
251
|
+
define_method("#{name}") do
|
252
|
+
platform.cell_text_for identifier
|
253
|
+
end
|
254
|
+
define_method("#{name}_cell") do
|
255
|
+
platform.cell_for identifier
|
168
256
|
end
|
169
257
|
end
|
170
258
|
end
|