page-object 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -0
  4. data/ChangeLog +10 -0
  5. data/README.md +1 -1
  6. data/features/bold.feature +21 -0
  7. data/features/html/indexed_property.html +14 -0
  8. data/features/html/multi_elements.html +1 -1
  9. data/features/html/static_elements.html +1 -2
  10. data/features/indexed_property.feature +15 -0
  11. data/features/multi_elements.feature +6 -0
  12. data/features/step_definitions/async_steps.rb +1 -1
  13. data/features/step_definitions/bold_steps.rb +12 -0
  14. data/features/step_definitions/check_box_steps.rb +2 -2
  15. data/features/step_definitions/indexed_property_steps.rb +47 -1
  16. data/features/step_definitions/label_steps.rb +1 -1
  17. data/features/step_definitions/multi_elements_steps.rb +13 -0
  18. data/features/step_definitions/select_list_steps.rb +1 -1
  19. data/features/step_definitions/table_steps.rb +4 -0
  20. data/features/support/page.rb +9 -0
  21. data/features/table.feature +12 -4
  22. data/lib/page-object.rb +6 -5
  23. data/lib/page-object/accessors.rb +78 -58
  24. data/lib/page-object/elements.rb +1 -0
  25. data/lib/page-object/elements/bold.rb +11 -0
  26. data/lib/page-object/elements/element.rb +12 -1
  27. data/lib/page-object/elements/table.rb +12 -1
  28. data/lib/page-object/indexed_properties.rb +20 -21
  29. data/lib/page-object/javascript/angularjs.rb +14 -0
  30. data/lib/page-object/javascript_framework_facade.rb +4 -2
  31. data/lib/page-object/locator_generator.rb +1 -0
  32. data/lib/page-object/page_populator.rb +0 -1
  33. data/lib/page-object/platforms/selenium_webdriver/button.rb +1 -1
  34. data/lib/page-object/platforms/selenium_webdriver/element.rb +1 -1
  35. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +26 -10
  36. data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +0 -7
  37. data/lib/page-object/platforms/watir_webdriver/element.rb +1 -1
  38. data/lib/page-object/platforms/watir_webdriver/page_object.rb +23 -8
  39. data/lib/page-object/platforms/watir_webdriver/radio_button.rb +0 -7
  40. data/lib/page-object/version.rb +1 -1
  41. data/lib/page-object/widgets.rb +7 -0
  42. data/page-object.gemspec +3 -3
  43. data/spec/page-object/accessors_spec.rb +40 -0
  44. data/spec/page-object/element_locators_spec.rb +340 -305
  45. data/spec/page-object/elements/area_spec.rb +8 -8
  46. data/spec/page-object/elements/bold_spec.rb +29 -0
  47. data/spec/page-object/elements/button_spec.rb +7 -7
  48. data/spec/page-object/elements/canvas_spec.rb +6 -6
  49. data/spec/page-object/elements/check_box_spec.rb +9 -9
  50. data/spec/page-object/elements/div_spec.rb +3 -3
  51. data/spec/page-object/elements/element_spec.rb +21 -21
  52. data/spec/page-object/elements/file_field_spec.rb +4 -4
  53. data/spec/page-object/elements/form_spec.rb +3 -3
  54. data/spec/page-object/elements/heading_spec.rb +8 -8
  55. data/spec/page-object/elements/hidden_field_spec.rb +3 -3
  56. data/spec/page-object/elements/image_spec.rb +14 -14
  57. data/spec/page-object/elements/label_spec.rb +3 -3
  58. data/spec/page-object/elements/link_spec.rb +6 -6
  59. data/spec/page-object/elements/list_item_spec.rb +4 -3
  60. data/spec/page-object/elements/nested_element_spec.rb +47 -47
  61. data/spec/page-object/elements/option_spec.rb +1 -1
  62. data/spec/page-object/elements/ordered_list_spec.rb +33 -33
  63. data/spec/page-object/elements/paragraph_spec.rb +3 -4
  64. data/spec/page-object/elements/select_list_spec.rb +52 -52
  65. data/spec/page-object/elements/selenium/radio_button_spec.rb +7 -13
  66. data/spec/page-object/elements/selenium/text_field_spec.rb +7 -7
  67. data/spec/page-object/elements/selenium_element_spec.rb +53 -53
  68. data/spec/page-object/elements/span_spec.rb +3 -3
  69. data/spec/page-object/elements/table_cell_spec.rb +3 -3
  70. data/spec/page-object/elements/table_row_spec.rb +22 -22
  71. data/spec/page-object/elements/table_spec.rb +28 -28
  72. data/spec/page-object/elements/text_area_spec.rb +5 -5
  73. data/spec/page-object/elements/unordered_list_spec.rb +33 -34
  74. data/spec/page-object/elements/watir_element_spec.rb +47 -48
  75. data/spec/page-object/javascript_framework_facade_spec.rb +6 -6
  76. data/spec/page-object/loads_platform_spec.rb +4 -4
  77. data/spec/page-object/page-object_spec.rb +103 -102
  78. data/spec/page-object/page_factory_spec.rb +43 -61
  79. data/spec/page-object/page_populator_spec.rb +44 -50
  80. data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +15 -15
  81. data/spec/page-object/platforms/selenium_webdriver_spec.rb +6 -6
  82. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +4 -4
  83. data/spec/page-object/platforms/watir_webdriver_spec.rb +1 -1
  84. data/spec/page-object/selenium_accessors_spec.rb +166 -153
  85. data/spec/page-object/watir_accessors_spec.rb +265 -245
  86. data/spec/page-object/widget_spec.rb +62 -30
  87. data/spec/spec_helper.rb +8 -8
  88. metadata +20 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8826d6f078421cd039c214d90e20423cb348a223
4
- data.tar.gz: c17ebadedafc8bd8ef1ad9f9cfc040378d341cc4
3
+ metadata.gz: 10f43de4180ab498bb6929df07232deeee0ab0fb
4
+ data.tar.gz: fd5f9cb5d67e7af41c90a645e32e33a6babf2a2a
5
5
  SHA512:
6
- metadata.gz: 914761fe9b6dcdc4db770bdc2b25e16f616fb9162635037539a8405f887695c4cb3c084c54d3447647a70872e17d1015482d842b1d14ad7ec05dcfb10421f218
7
- data.tar.gz: 9a24a8127ba2f34183d77018ca89df9ccb7d0c7ed528fcee0040e8712060bbe6823387bdd3d2514d2fbde25e7b2f2c54867325d5898fc7ae829fe90fe4d63306
6
+ metadata.gz: 76cbc1ff4202177c001c56f574395cb7c233eca802acb1c7e448c709536c5af68cea6cb77be1bdbbf327ead2cc67f920de58da9513e218cf773b5ade4fd14fe5
7
+ data.tar.gz: eeca209c3157f4d49d6458952546f5130127c342f38d1515fb3c95e4bfaf81479c3147e8fb9ad0255d13ed98bb3e083bed1dc3b38890cf02a262305f49f98e44
@@ -1 +1 @@
1
- ruby-2.1.1
1
+ ruby-2.1.2
@@ -2,6 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.2
5
6
  - jruby-19mode
6
7
 
7
8
  before_script:
data/ChangeLog CHANGED
@@ -1,3 +1,13 @@
1
+ === Version 1.0.3 / 2014-12-9
2
+ * Enhancements
3
+ * Added support for the bold tag (Thanks sedx)
4
+ * Added support for angularjs in wait_for_ajax (Thanks Owen Housden)
5
+ * Added hashes method to Table to return table contents as a Hash (Thanks Tobi)
6
+ * Fixed wait_for_expected_title so it detects if the title changes (Thanks Levi Wilson)
7
+ * Fixes
8
+ * Fixed issue that allows access to elements on other indexed properties (Thanks Dane Andersen)
9
+ * Removed the method to clear radio buttons. It didn't work on selenium and threw an exception on watir. (Thanks Justin Ko)
10
+
1
11
  === Version 1.0.2 / 2014-7-21
2
12
  * Enhancements
3
13
  * Added support to use multiple identifiers when locating nested frames / iframes (Thanks Justin Ko)
data/README.md CHANGED
@@ -78,7 +78,7 @@ login_page.login_with 'cheezy', 'secret'
78
78
  ````
79
79
 
80
80
  ### Creating your page object
81
- 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 create like this:
81
+ 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:
82
82
 
83
83
  ````ruby
84
84
  browser = Watir::Browser.new :firefox
@@ -0,0 +1,21 @@
1
+ Feature: Bold
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: Getting the text of headings
7
+ When I get the bold text for the "b" element
8
+ Then I should see "some text in bold" in bold
9
+
10
+ Scenario Outline: Locating b on the Page
11
+ When I search bold text for the b by "<search_by>"
12
+ Then I should see "some text in bold" in bold
13
+
14
+ Scenarios:
15
+ | search_by |
16
+ | id |
17
+ | class |
18
+ | name |
19
+ | xpath |
20
+ | index |
21
+ | css |
@@ -11,6 +11,7 @@
11
11
  <td><input type="checkbox" id="table[123].check" value="1"/></td>
12
12
  <td><textarea id="table[123].area" rows="2" cols="20"></textarea></td>
13
13
  <td><input id="table[123].button" type="submit" value="Click 123"/></td>
14
+ <td><div id="table[123].content">123!</div></td>
14
15
  </tr>
15
16
  <tr>
16
17
  <td><input type="text" id="table[foo].text" name="tableName[foo].text" size="20"/></td>
@@ -18,6 +19,7 @@
18
19
  <td><input type="checkbox" id="table[foo].check" value="2"/></td>
19
20
  <td><textarea id="table[foo].area" rows="2" cols="20"></textarea></td>
20
21
  <td><input id="table[foo].button" type="submit" value="Click foo"/></td>
22
+ <td><div id="table[foo].content">foo!</div></td>
21
23
  </tr>
22
24
  <tr>
23
25
  <td><input type="text" id="table[12test].text" name="tableName[12test].text" size="20"/></td>
@@ -25,6 +27,18 @@
25
27
  <td><input type="checkbox" id="table[12test].check" value="3"/></td>
26
28
  <td><textarea id="table[12test].area" rows="2" cols="20"></textarea></td>
27
29
  <td><input id="table[12test].button" type="submit" value="Click 12test"/></td>
30
+ <td><div id="table[12test].content">12test!</div></td>
31
+ </tr>
32
+ </table>
33
+
34
+ <table id="other_table_id" name align="table_name" class="table_class" border="1">
35
+ <tr>
36
+ <td><input type="text" id="other_table[foo].text" name="otherTableName[foo].text" size="20"/></td>
37
+ <td><div id="other_table[foo].content">foo2!</div></td>
38
+ </tr>
39
+ <tr>
40
+ <td><input type="text" id="other_table[bar].text" name="otherTableName[bar].text" size="20"/></td>
41
+ <td><div id="other_table[bar].content">bar!</div></td>
28
42
  </tr>
29
43
  </table>
30
44
 
@@ -139,6 +139,6 @@
139
139
  <input type="file" class="file_field_class" title="File Field 1" />
140
140
  <input type="file" class="file_field_class" title="File Field 2" />
141
141
  <input type="file" class="file_field_class" title="File Field 3" />
142
-
142
+ In bold <b>One B</b> and <b>Two B</b> for example text
143
143
  </body>
144
144
  </html>
@@ -176,7 +176,6 @@
176
176
  <h4 id="h4_id" class="h4_class" name="h4_name">h4's are cool</h4>
177
177
  <h5 id="h5_id" class="h5_class" name="h5_name">h5's are cool</h5>
178
178
  <h6 id="h6_id" class="h6_class" name="h6_name">h6's are cool</h6>
179
-
180
179
  <a href="success.html" target="_blank">New Window</a>
181
180
  <a href="failure.html" target="_blank">Another New Window</a>
182
181
 
@@ -199,7 +198,7 @@
199
198
  <figure id='figure_id'>
200
199
  <img src="images/img_pulpit.jpg" alt="The Pulpit Rock" width="304" height="228">
201
200
  </figure>
202
-
201
+ This text have <b id="b_id" class="b_class" name="b_name">some text in bold</b>
203
202
  </body>
204
203
  </html>
205
204
 
@@ -81,3 +81,18 @@ Feature: Indexed Property
81
81
  | foo |
82
82
  | 123 |
83
83
  | 12test |
84
+
85
+ Scenario: Element on first indexed property but not second
86
+ When I search for an element that is on an indexed property
87
+ And I search for the element on another indexed property it is not on
88
+ Then I should see that the element doesn't exist
89
+
90
+ Scenario: Index on first indexed property but not on second
91
+ When I search for an element by an index on an indexed property
92
+ And I search using the index which is not on another indexed property
93
+ Then I should see that the element doesn't exist for that index
94
+
95
+ Scenario: Index on first indexed property and different on second
96
+ When I search for an element with text by an index on an indexed property
97
+ And I search using an index which is on another indexed property
98
+ Then I should see the content of the element on the second indexed property
@@ -484,3 +484,9 @@ Feature: Multi Elements
484
484
  And the text for label 1 should be "Label 1"
485
485
  And the text for label 2 should be "Label 2"
486
486
  And the text for label 3 should be "Label 3"
487
+
488
+ Scenario: Selecting bs using an identifier
489
+ When I select the bs
490
+ Then I should have 2 bs
491
+ And the text for b 1 should be "One B"
492
+ And the text for b 2 should be "Two B"
@@ -79,5 +79,5 @@ end
79
79
 
80
80
  Then /^I should not be able to find the button$/ do
81
81
  @page.created_button_element.when_not_present
82
- @page.created_button_element.exists?.should be_false
82
+ @page.created_button_element.exists?.should be false
83
83
  end
@@ -0,0 +1,12 @@
1
+ When /^I get the bold text for the "([^\"]*)" element$/ do |el|
2
+ @b = @page.send "#{el}_id"
3
+ end
4
+
5
+ Then /^I should see "([^\"]*)" in bold$/ do |text|
6
+ @b.should == text
7
+ end
8
+
9
+ When /^I search bold text for the (\w+) by "([^"]*)"$/ do |text_decorator, type|
10
+ @b = @page.send "#{text_decorator}_#{type}"
11
+ end
12
+
@@ -3,7 +3,7 @@ When /^I select the First check box$/ do
3
3
  end
4
4
 
5
5
  Then /^the First check box should be selected$/ do
6
- @page.cb_id_checked?.should be_true
6
+ @page.cb_id_checked?.should be true
7
7
  end
8
8
 
9
9
  When /^I unselect the First check box$/ do
@@ -11,7 +11,7 @@ When /^I unselect the First check box$/ do
11
11
  end
12
12
 
13
13
  Then /^the First check box should not be selected$/ do
14
- @page.cb_id_checked?.should be_false
14
+ @page.cb_id_checked?.should be false
15
15
  end
16
16
 
17
17
  When /^I search for the check box by "([^\"]*)"$/ do |how|
@@ -6,10 +6,16 @@ class IndexedPropertyPage
6
6
  [:radio_button, :radio, {:id => 'table[%s].radio'}],
7
7
  [:checkbox, :check, {:id => 'table[%s].check'}],
8
8
  [:text_area, :area, {:id => 'table[%s].area'}],
9
- [:button, :button, {:id => 'table[%s].button'}]]
9
+ [:button, :button, {:id => 'table[%s].button'}],
10
+ [:div, :content, {:id => 'table[%s].content'}]]
10
11
 
11
12
  indexed_property :nottable, [[:text_field, :text_nottable, {:id => 'nottable[%s].text'}]]
12
13
 
14
+ indexed_property :other_table, [
15
+ [:text_field, :text_table, {:id => 'other_table[%s].text'}],
16
+ [:div, :content, {:id => 'other_table[%s].content'}]
17
+ ]
18
+
13
19
  end
14
20
 
15
21
  def page
@@ -81,3 +87,43 @@ Then /^The regular indexed text field by id should contain "([^\"]*)"$/ do |val|
81
87
  page.nottable[@index].text_nottable.should == val
82
88
  end
83
89
 
90
+
91
+ When(/^I search for an element not on my indexed property but on another$/) do
92
+ @index = 'foo'
93
+ end
94
+
95
+ Then(/^I should see that the element doesn't exist$/) do
96
+ expect { page.other_table[@index].radio_element.value }.to raise_error(NoMethodError)
97
+ end
98
+
99
+ When(/^I search for an element that is on an indexed property$/) do
100
+ page.table['foo'].radio_element
101
+ end
102
+
103
+ And(/^I search for the element on another indexed property it is not on$/) do
104
+ @index = 'foo'
105
+ end
106
+
107
+ When(/^I search using the index which is not on another indexed property$/) do
108
+ @index = '123'
109
+ end
110
+
111
+ Then(/^I should see that the element doesn't exist for that index/) do
112
+ expect { page.other_table[@index].text_table_element.text }.to raise_error /unable to locate element|Selenium::WebDriver::Error::NoSuchElementError/
113
+ end
114
+
115
+ When(/^I search for an element by an index on an indexed property$/) do
116
+ page.table['123'].text_table_element.html
117
+ end
118
+
119
+ And(/^I search using an index which is on another indexed property$/) do
120
+ @index = 'bar'
121
+ end
122
+
123
+ Then(/^I should see the content of the element on the second indexed property$/) do
124
+ expect(page.other_table['bar'].content).to eq 'bar!'
125
+ end
126
+
127
+ When(/^I search for an element with text by an index on an indexed property$/) do
128
+ expect(page.table['123'].content).to eq '123!'
129
+ end
@@ -15,5 +15,5 @@ When /^I get the text from a label while the script is executing$/ do
15
15
  end
16
16
 
17
17
  Then /^I should see that the label exists$/ do
18
- @page.label_id?.should be_true
18
+ @page.label_id?.should be true
19
19
  end
@@ -31,6 +31,7 @@ class MultiElementsPage
31
31
  labels(:the_labels, :class => 'label')
32
32
  file_fields(:the_file_fields, :class => 'file_field_class')
33
33
  elements(:generic_label, :label, :class => 'label')
34
+ b(:bs)
34
35
  end
35
36
 
36
37
 
@@ -526,3 +527,15 @@ end
526
527
  When(/^I select the multiple elements with a tag label$/) do
527
528
  @elements = @page.generic_label_elements
528
529
  end
530
+
531
+ When /^I select the bs$/ do
532
+ @elements = @page.b_elements
533
+ end
534
+
535
+ Then /^I should have (\d+) bs$/ do |num_bs|
536
+ @elements.size.should == num_bs.to_i
537
+ end
538
+
539
+ Then /^the text for b (\d+) should be "([^\"]*)"$/ do |b_num, text|
540
+ @elements[b_num.to_i - 1].text.should == text
541
+ end
@@ -40,7 +40,7 @@ Then /^the select list should include "([^\"]*)"$/ do |text|
40
40
  end
41
41
 
42
42
  Then /^the select list should know that "([^\"]*)" is selected$/ do |text|
43
- @page.sel_list_id_element.selected?(text).should be_true
43
+ @page.sel_list_id_element.selected?(text).should be true
44
44
  end
45
45
 
46
46
  Then /^the value for the option should be "([^\"]*)"$/ do |value|
@@ -64,3 +64,7 @@ end
64
64
  Then /^I should see the text includes "([^"]*)" when I retrieve it by "([^"]*)"$/ do |text, how|
65
65
  @page.send("table_#{how}").should include text
66
66
  end
67
+
68
+ Then /^the table should be like the expected one$/ do |expected_table|
69
+ (expected_table.diff!@element.hashes).should be_nil
70
+ end
@@ -360,5 +360,14 @@ class Page
360
360
  figure(:figure_id, :id => 'figure_id')
361
361
 
362
362
  svg(:svg_id, :id => 'the_svg')
363
+
364
+ b(:b_id, :id => 'b_id')
365
+ b(:b_class, :class => 'b_class')
366
+ b(:b_css, :css => '.b_class')
367
+ b(:b_name, :name => 'b_name')
368
+ b(:b_index, :index => 0)
369
+ b(:b_xpath, :xpath => '//b')
370
+ b(:b_class_index, :class => 'b_class', :index => 0)
371
+ b(:b_name_index, :name => 'b_name', :index => 0)
363
372
  end
364
373
 
@@ -38,7 +38,7 @@ Feature: Table
38
38
  Scenario: Retrieve data from a table using a partial row header in the 2nd column
39
39
  When I retrieve a table element
40
40
  Then the data for row "ata4" should be "Data3" and "Data4"
41
-
41
+
42
42
  Scenario: Retrieve data from a table using a column header
43
43
  When I retrieve a table element
44
44
  Then the data for column "Header" and row "3" should be "Data4"
@@ -54,11 +54,11 @@ Feature: Table
54
54
  Scenario: Retrieve data from a table using a partial column header
55
55
  When I retrieve a table element
56
56
  Then the data for column "eader" and row "3" should be "Data4"
57
-
57
+
58
58
  Scenario: Retrieve data from a table using both headers
59
59
  When I retrieve a table element
60
60
  Then the data for row "Data3" and column "eader" should be "Data4"
61
-
61
+
62
62
  Scenario: Retrieve data from a table with an incorrect row header
63
63
  When I retrieve a table element
64
64
  Then the data for row "Data20" should be nil
@@ -83,6 +83,14 @@ Feature: Table
83
83
  | index |
84
84
  | name |
85
85
 
86
+ Scenario: Matching the expected table with the table on the Page
87
+ When I retrieve a table element
88
+ Then the table should be like the expected one
89
+ | Table | Header |
90
+ | Data1 | Data2 |
91
+ | Data3 | Data4 |
92
+
93
+
86
94
  @selenium_only
87
95
  Scenario Outline: Locating table cells on the Page
88
96
  When I retrieve a table element by "<search_by>"
@@ -108,7 +116,7 @@ Feature: Table
108
116
  @watir_only
109
117
  Scenario: Finding an existing table
110
118
  Then I should see that the table exists
111
-
119
+
112
120
  Scenario: Getting the text from a table
113
121
  Then I should see the text includes "Data1" when I retrieve it by "id"
114
122
  And I should see the text includes "Data2" when I retrieve it by "id"
@@ -103,7 +103,8 @@ module PageObject
103
103
 
104
104
  #
105
105
  # Set the javascript framework to use when determining number of
106
- # ajax requests. Valid frameworks are :jquery and :prototype
106
+ # ajax requests. Valid frameworks are :jquery, :prototype, :yui,
107
+ # and :angularjs
107
108
  #
108
109
  def self.javascript_framework=(framework)
109
110
  PageObject::JavascriptFrameworkFacade.framework = framework
@@ -196,7 +197,7 @@ module PageObject
196
197
  end
197
198
 
198
199
  #
199
- # Override the normal alert popup so it does not occurr.
200
+ # Override the normal alert popup so it does not occur.
200
201
  #
201
202
  # @example
202
203
  # message = @page.alert do
@@ -212,7 +213,7 @@ module PageObject
212
213
  end
213
214
 
214
215
  #
215
- # Override the normal confirm popup so it does not occurr.
216
+ # Override the normal confirm popup so it does not occur.
216
217
  #
217
218
  # @example
218
219
  # message = @popup.confirm(true) do
@@ -229,7 +230,7 @@ module PageObject
229
230
  end
230
231
 
231
232
  #
232
- # Override the normal promp popup so it does not occurr.
233
+ # Override the normal prompt popup so it does not occur.
233
234
  #
234
235
  # @example
235
236
  # message = @popup.prompt("Some Value") do
@@ -329,7 +330,7 @@ module PageObject
329
330
 
330
331
  #
331
332
  # Attach to a running window. You can locate the window using either
332
- # the window's title or url. If it failes to connect to a window it will
333
+ # the window's title or url. If it fails to connect to a window it will
333
334
  # pause for 1 second and try again.
334
335
  #
335
336
  # @example
@@ -13,7 +13,7 @@ module PageObject
13
13
  module Accessors
14
14
 
15
15
  #
16
- # Set some values that can be used withing the class. This is
16
+ # Set some values that can be used within the class. This is
17
17
  # typically used to provide values that help build dynamic urls in
18
18
  # the page_url method
19
19
  #
@@ -66,20 +66,18 @@ module PageObject
66
66
  #
67
67
  def wait_for_expected_title(expected_title, timeout=::PageObject.default_element_wait)
68
68
  define_method("wait_for_expected_title?") do
69
- page_title = title
70
- has_expected_title = (expected_title === page_title)
71
- if not has_expected_title and not timeout.nil?
72
- wait_until(timeout, "Expected title '#{expected_title}' instead of '#{page_title}'") do
73
- has_expected_title = (expected_title === page_title)
74
- has_expected_title
75
- end
76
- end
77
- raise "Expected title '#{expected_title}' instead of '#{page_title}'" unless has_expected_title
69
+ error_message = lambda { "Expected title '#{expected_title}' instead of '#{title}'" }
70
+
71
+ has_expected_title = (expected_title === title)
72
+ wait_until(timeout, error_message.call) do
73
+ has_expected_title = (expected_title === title)
74
+ end unless has_expected_title
75
+
76
+ raise error_message.call unless has_expected_title
78
77
  has_expected_title
79
78
  end
80
79
  end
81
80
 
82
-
83
81
  #
84
82
  # Creates a method that compares the expected_title of a page against the actual.
85
83
  # @param [String] expected_title the literal expected title for the page
@@ -195,7 +193,7 @@ module PageObject
195
193
  # # 'first_name?' methods
196
194
  #
197
195
  # @param [String] the name used for the generated methods
198
- # @param [Hash] identifier how we find a text field. You can use a multiple paramaters
196
+ # @param [Hash] identifier how we find a text field. You can use a multiple parameters
199
197
  # by combining of any of the following except xpath. The valid keys are:
200
198
  # * :class => Watir and Selenium
201
199
  # * :css => Selenium only
@@ -231,7 +229,7 @@ module PageObject
231
229
  # # will generate 'user_id', 'user_id_element' and 'user_id?' methods
232
230
  #
233
231
  # @param [String] the name used for the generated methods
234
- # @param [Hash] identifier how we find a hidden field. You can use a multiple paramaters
232
+ # @param [Hash] identifier how we find a hidden field. You can use a multiple parameters
235
233
  # by combining of any of the following except xpath. The valid keys are:
236
234
  # * :class => Watir and Selenium
237
235
  # * :css => Selenium only
@@ -263,7 +261,7 @@ module PageObject
263
261
  # # 'address?' methods
264
262
  #
265
263
  # @param [String] the name used for the generated methods
266
- # @param [Hash] identifier how we find a text area. You can use a multiple paramaters
264
+ # @param [Hash] identifier how we find a text area. You can use a multiple parameters
267
265
  # by combining of any of the following except xpath. The valid keys are:
268
266
  # * :class => Watir and Selenium
269
267
  # * :css => Selenium only
@@ -299,7 +297,7 @@ module PageObject
299
297
  # # will generate 'state', 'state=', 'state_element', 'state?', "state_options" methods
300
298
  #
301
299
  # @param [Symbol] the name used for the generated methods
302
- # @param [Hash] identifier how we find a select list. You can use a multiple paramaters
300
+ # @param [Hash] identifier how we find a select list. You can use a multiple parameters
303
301
  # by combining of any of the following except xpath. The valid keys are:
304
302
  # * :class => Watir and Selenium
305
303
  # * :css => Selenium only
@@ -339,7 +337,7 @@ module PageObject
339
337
  # # will generate 'add_to_cart', 'add_to_cart_element', and 'add_to_cart?' methods
340
338
  #
341
339
  # @param [Symbol] the name used for the generated methods
342
- # @param [Hash] identifier how we find a link. You can use a multiple paramaters
340
+ # @param [Hash] identifier how we find a link. You can use a multiple parameters
343
341
  # by combining of any of the following except xpath. The valid keys are:
344
342
  # * :class => Watir and Selenium
345
343
  # * :css => Watir and Selenium
@@ -375,7 +373,7 @@ module PageObject
375
373
  # # 'active_element', and 'active?' methods
376
374
  #
377
375
  # @param [Symbol] the name used for the generated methods
378
- # @param [Hash] identifier how we find a checkbox. You can use a multiple paramaters
376
+ # @param [Hash] identifier how we find a checkbox. You can use a multiple parameters
379
377
  # by combining of any of the following except xpath. The valid keys are:
380
378
  # * :class => Watir and Selenium
381
379
  # * :css => Selenium only
@@ -404,19 +402,18 @@ module PageObject
404
402
  end
405
403
 
406
404
  #
407
- # adds five methods - one to select, another to clear,
408
- # another to return if a radio button is selected,
409
- # another method to return a PageObject::Elements::RadioButton
405
+ # adds four methods - one to select, another to return if a radio button
406
+ # is selected, another method to return a PageObject::Elements::RadioButton
410
407
  # object representing the radio button element, and another to check
411
408
  # the radio button's existence.
412
409
  #
413
410
  # @example
414
411
  # radio_button(:north, :id => "north")
415
- # # will generate 'select_north', 'clear_north', 'north_selected?',
412
+ # # will generate 'select_north', 'north_selected?',
416
413
  # # 'north_element', and 'north?' methods
417
414
  #
418
415
  # @param [Symbol] the name used for the generated methods
419
- # @param [Hash] identifier how we find a radio button. You can use a multiple paramaters
416
+ # @param [Hash] identifier how we find a radio button. You can use a multiple parameters
420
417
  # by combining of any of the following except xpath. The valid keys are:
421
418
  # * :class => Watir and Selenium
422
419
  # * :css => Selenium only
@@ -434,10 +431,6 @@ module PageObject
434
431
  return platform.select_radio(identifier.clone) unless block_given?
435
432
  self.send("#{name}_element").select
436
433
  end
437
- define_method("clear_#{name}") do
438
- return platform.clear_radio(identifier.clone) unless block_given?
439
- self.send("#{name}_element").clear
440
- end
441
434
  define_method("#{name}_selected?") do
442
435
  return platform.radio_selected?(identifier.clone) unless block_given?
443
436
  self.send("#{name}_element").selected?
@@ -448,7 +441,7 @@ module PageObject
448
441
  #
449
442
  # adds five methods to help interact with a radio button group -
450
443
  # a method to select a radio button in the group by given value/text,
451
- # a method to return the values of all radio buttins in the group, a method
444
+ # a method to return the values of all radio buttons in the group, a method
452
445
  # to return if a radio button in the group is selected (will return
453
446
  # the text of the selected radio button, if true), a method to return
454
447
  # an array of PageObject::Elements::RadioButton objects representing
@@ -504,7 +497,7 @@ module PageObject
504
497
  # # will generate 'purchase', 'purchase_element', and 'purchase?' methods
505
498
  #
506
499
  # @param [Symbol] the name used for the generated methods
507
- # @param [Hash] identifier how we find a button. You can use a multiple paramaters
500
+ # @param [Hash] identifier how we find a button. You can use a multiple parameters
508
501
  # by combining of any of the following except xpath. The valid keys are:
509
502
  # * :class => Watir and Selenium
510
503
  # * :css => Watir and Selenium
@@ -535,7 +528,7 @@ module PageObject
535
528
  # # will generate 'message', 'message_element', and 'message?' methods
536
529
  #
537
530
  # @param [Symbol] the name used for the generated methods
538
- # @param [Hash] identifier how we find a div. You can use a multiple paramaters
531
+ # @param [Hash] identifier how we find a div. You can use a multiple parameters
539
532
  # by combining of any of the following except xpath. The valid keys are:
540
533
  # * :class => Watir and Selenium
541
534
  # * :css => Watir and Selenium
@@ -564,7 +557,7 @@ module PageObject
564
557
  # # will generate 'alert', 'alert_element', and 'alert?' methods
565
558
  #
566
559
  # @param [Symbol] the name used for the generated methods
567
- # @param [Hash] identifier how we find a span. You can use a multiple paramaters
560
+ # @param [Hash] identifier how we find a span. You can use a multiple parameters
568
561
  # by combining of any of the following except xpath. The valid keys are:
569
562
  # * :class => Watir and Selenium
570
563
  # * :css => Watir and Selenium
@@ -595,7 +588,7 @@ module PageObject
595
588
  # # will generate a 'cart', 'cart_element' and 'cart?' method
596
589
  #
597
590
  # @param [Symbol] the name used for the generated methods
598
- # @param [Hash] identifier how we find a table. You can use a multiple paramaters
591
+ # @param [Hash] identifier how we find a table. You can use a multiple parameters
599
592
  # by combining of any of the following except xpath. The valid keys are:
600
593
  # * :class => Watir and Selenium
601
594
  # * :css => Selenium only
@@ -623,7 +616,7 @@ module PageObject
623
616
  # # will generate 'total', 'total_element', and 'total?' methods
624
617
  #
625
618
  # @param [Symbol] the name used for the generated methods
626
- # @param [Hash] identifier how we find a cell. You can use a multiple paramaters
619
+ # @param [Hash] identifier how we find a cell. You can use a multiple parameters
627
620
  # by combining of any of the following except xpath. The valid keys are:
628
621
  # * :class => Watir and Selenium
629
622
  # * :css => Watir and Selenium
@@ -653,7 +646,7 @@ module PageObject
653
646
  # # will generate 'logo_element' and 'logo?' methods
654
647
  #
655
648
  # @param [Symbol] the name used for the generated methods
656
- # @param [Hash] identifier how we find an image. You can use a multiple paramaters
649
+ # @param [Hash] identifier how we find an image. You can use a multiple parameters
657
650
  # by combining of any of the following except xpath. The valid keys are:
658
651
  # * :alt => Watir and Selenium
659
652
  # * :class => Watir and Selenium
@@ -679,7 +672,7 @@ module PageObject
679
672
  # # will generate 'login_element' and 'login?' methods
680
673
  #
681
674
  # @param [Symbol] the name used for the generated methods
682
- # @param [Hash] identifier how we find a form. You can use a multiple paramaters
675
+ # @param [Hash] identifier how we find a form. You can use a multiple parameters
683
676
  # by combining of any of the following except xpath. The valid keys are:
684
677
  # * :action => Watir and Selenium
685
678
  # * :class => Watir and Selenium
@@ -703,7 +696,7 @@ module PageObject
703
696
  # # will generate 'item_one', 'item_one_element', and 'item_one?' methods
704
697
  #
705
698
  # @param [Symbol] the name used for the generated methods
706
- # @param [Hash] identifier how we find a list item. You can use a multiple paramaters
699
+ # @param [Hash] identifier how we find a list item. You can use a multiple parameters
707
700
  # by combining of any of the following except xpath. The valid keys are:
708
701
  # * :class => Watir and Selenium
709
702
  # * :css => Watir and Selenium
@@ -724,7 +717,7 @@ module PageObject
724
717
  alias_method :li, :list_item
725
718
 
726
719
  #
727
- # adds three methods - one to return the text within the unorderd
720
+ # adds three methods - one to return the text within the unordered
728
721
  # list, one to retrieve the unordered list element, and another to
729
722
  # check it's existence.
730
723
  #
@@ -733,7 +726,7 @@ module PageObject
733
726
  # # will generate 'menu', 'menu_element' and 'menu?' methods
734
727
  #
735
728
  # @param [Symbol] the name used for the generated methods
736
- # @param [Hash] identifier how we find an unordered list. You can use a multiple paramaters
729
+ # @param [Hash] identifier how we find an unordered list. You can use a multiple parameters
737
730
  # by combining of any of the following except xpath. The valid keys are:
738
731
  # * :class => Watir and Selenium
739
732
  # * :css => Selenium only
@@ -753,7 +746,7 @@ module PageObject
753
746
  alias_method :ul, :unordered_list
754
747
 
755
748
  #
756
- # adds three methods - one to return the text withing the ordered
749
+ # adds three methods - one to return the text within the ordered
757
750
  # list, one to retrieve the ordered list element, and another to
758
751
  # test it's existence.
759
752
  #
@@ -762,7 +755,7 @@ module PageObject
762
755
  # # will generate 'top_five', 'top_five_element' and 'top_five?' methods
763
756
  #
764
757
  # @param [Symbol] the name used for the generated methods
765
- # @param [Hash] identifier how we find an ordered list. You can use a multiple paramaters
758
+ # @param [Hash] identifier how we find an ordered list. You can use a multiple parameters
766
759
  # by combining of any of the following except xpath. The valid keys are:
767
760
  # * :class => Watir and Selenium
768
761
  # * :css => Selenium only
@@ -790,7 +783,7 @@ module PageObject
790
783
  # # will generate 'title', 'title_element', and 'title?' methods
791
784
  #
792
785
  # @param [Symbol] the name used for the generated methods
793
- # @param [Hash] identifier how we find a H1. You can use a multiple paramaters
786
+ # @param [Hash] identifier how we find a H1. You can use a multiple parameters
794
787
  # by combining of any of the following except xpath. The valid keys are:
795
788
  # * :class => Watir and Selenium
796
789
  # * :css => Watir and Selenium
@@ -817,7 +810,7 @@ module PageObject
817
810
  # # will generate 'title', 'title_element', and 'title?' methods
818
811
  #
819
812
  # @param [Symbol] the name used for the generated methods
820
- # @param [Hash] identifier how we find a H2. You can use a multiple paramaters
813
+ # @param [Hash] identifier how we find a H2. You can use a multiple parameters
821
814
  # by combining of any of the following except xpath. The valid keys are:
822
815
  # * :class => Watir and Selenium
823
816
  # * :css => Watir and Selenium
@@ -844,7 +837,7 @@ module PageObject
844
837
  # # will generate 'title', 'title_element', and 'title?' methods
845
838
  #
846
839
  # @param [Symbol] the name used for the generated methods
847
- # @param [Hash] identifier how we find a H3. You can use a multiple paramaters
840
+ # @param [Hash] identifier how we find a H3. You can use a multiple parameters
848
841
  # by combining of any of the following except xpath. The valid keys are:
849
842
  # * :class => Watir and Selenium
850
843
  # * :css => Watir and Selenium
@@ -871,7 +864,7 @@ module PageObject
871
864
  # # will generate 'title', 'title_element', and 'title?' methods
872
865
  #
873
866
  # @param [Symbol] the name used for the generated methods
874
- # @param [Hash] identifier how we find a H4. You can use a multiple paramaters
867
+ # @param [Hash] identifier how we find a H4. You can use a multiple parameters
875
868
  # by combining of any of the following except xpath. The valid keys are:
876
869
  # * :class => Watir and Selenium
877
870
  # * :css => Watir and Selenium
@@ -898,7 +891,7 @@ module PageObject
898
891
  # # will generate 'title', 'title_element', and 'title?' methods
899
892
  #
900
893
  # @param [Symbol] the name used for the generated methods
901
- # @param [Hash] identifier how we find a H5. You can use a multiple paramaters
894
+ # @param [Hash] identifier how we find a H5. You can use a multiple parameters
902
895
  # by combining of any of the following except xpath. The valid keys are:
903
896
  # * :class => Watir and Selenium
904
897
  # * :css => Watir and Selenium
@@ -925,7 +918,7 @@ module PageObject
925
918
  # # will generate 'title', 'title_element', and 'title?' methods
926
919
  #
927
920
  # @param [Symbol] the name used for the generated methods
928
- # @param [Hash] identifier how we find a H6. You can use a multiple paramaters
921
+ # @param [Hash] identifier how we find a H6. You can use a multiple parameters
929
922
  # by combining of any of the following except xpath. The valid keys are:
930
923
  # * :class => Watir and Selenium
931
924
  # * :css => Watir and Selenium
@@ -952,7 +945,7 @@ module PageObject
952
945
  # # will generate 'title', 'title_element', and 'title?' methods
953
946
  #
954
947
  # @param [Symbol] the name used for the generated methods
955
- # @param [Hash] identifier how we find a paragraph. You can use a multiple paramaters
948
+ # @param [Hash] identifier how we find a paragraph. You can use a multiple parameters
956
949
  # by combining of any of the following except xpath. The valid keys are:
957
950
  # * :class => Watir and Selenium
958
951
  # * :css => Watir and Selenium
@@ -980,7 +973,7 @@ module PageObject
980
973
  # # will generate 'the_file=', 'the_file_element', and 'the_file?' methods
981
974
  #
982
975
  # @param [Symbol] the name used for the generated methods
983
- # @param [Hash] identifier how we find a file_field. You can use a multiple paramaters
976
+ # @param [Hash] identifier how we find a file_field. You can use a multiple parameters
984
977
  # by combining of any of the following except xpath. The valid keys are:
985
978
  # * :class => Watir and Selenium
986
979
  # * :css => Selenium only
@@ -1009,7 +1002,7 @@ module PageObject
1009
1002
  # # will generate 'message', 'message_element', and 'message?' methods
1010
1003
  #
1011
1004
  # @param [Symbol] the name used for the generated methods
1012
- # @param [Hash] identifier how we find a label. You can use a multiple paramaters
1005
+ # @param [Hash] identifier how we find a label. You can use a multiple parameters
1013
1006
  # by combining of any of the following except xpath. The valid keys are:
1014
1007
  # * :class => Watir and Selenium
1015
1008
  # * :css => Watir and Selenium
@@ -1037,7 +1030,7 @@ module PageObject
1037
1030
  # # will generate 'message', 'message_element', and 'message?' methods
1038
1031
  #
1039
1032
  # @param [Symbol] the name used for the generated methods
1040
- # @param [Hash] identifier how we find an area. You can use a multiple paramaters
1033
+ # @param [Hash] identifier how we find an area. You can use a multiple parameters
1041
1034
  # by combining of any of the following except xpath. The valid keys are:
1042
1035
  # * :class => Watir and Selenium
1043
1036
  # * :css => Watir and Selenium
@@ -1065,7 +1058,7 @@ module PageObject
1065
1058
  # # will generate 'my_canvas_element' and 'my_canvas?' methods
1066
1059
  #
1067
1060
  # @param [Symbol] the name used for the generated methods
1068
- # @param [Hash] identifier how we find a canvas. You can use a multiple paramaters
1061
+ # @param [Hash] identifier how we find a canvas. You can use a multiple parameters
1069
1062
  # by combining of any of the following except xpath. The valid keys are:
1070
1063
  # * :class => Watir and Selenium
1071
1064
  # * :css => Watir and Selenium
@@ -1088,7 +1081,7 @@ module PageObject
1088
1081
  # # will generate 'acdc_element' and 'acdc?' methods
1089
1082
  #
1090
1083
  # @param [Symbol] the name used for the generated methods
1091
- # @param [Hash] identifier how we find an audio element. You can use a multiple paramaters
1084
+ # @param [Hash] identifier how we find an audio element. You can use a multiple parameters
1092
1085
  # by combining of any of the following except xpath. The valid keys are:
1093
1086
  # * :class => Watir and Selenium
1094
1087
  # * :css => Watir and Selenium
@@ -1111,7 +1104,7 @@ module PageObject
1111
1104
  # # will generate 'movie_element' and 'movie?' methods
1112
1105
  #
1113
1106
  # @param [Symbol] the name used for the generated methods
1114
- # @param [Hash] identifier how we find a video element. You can use a multiple paramaters
1107
+ # @param [Hash] identifier how we find a video element. You can use a multiple parameters
1115
1108
  # by combining of any of the following except xpath. The valid keys are:
1116
1109
  # * :class => Watir and Selenium
1117
1110
  # * :css => Watir and Selenium
@@ -1125,6 +1118,33 @@ module PageObject
1125
1118
  standard_methods(name, identifier, 'video_for', &block)
1126
1119
  end
1127
1120
 
1121
+ #
1122
+ # adds three methods - one to retrieve the text of a b element, another to
1123
+ # retrieve a b element, and another to check for it's existence.
1124
+ #
1125
+ # @example
1126
+ # b(:bold, :id => 'title')
1127
+ # # will generate 'bold', 'bold_element', and 'bold?' methods
1128
+ #
1129
+ # @param [Symbol] the name used for the generated methods
1130
+ # @param [Hash] identifier how we find a b. You can use a multiple parameters
1131
+ # by combining of any of the following except xpath. The valid keys are:
1132
+ # * :class => Watir and Selenium
1133
+ # * :css => Watir and Selenium
1134
+ # * :id => Watir and Selenium
1135
+ # * :index => Watir and Selenium
1136
+ # * :name => Watir and Selenium
1137
+ # * :xpath => Watir and Selenium
1138
+ # @param optional block to be invoked when element method is called
1139
+ #
1140
+ def b(name, identifier={:index => 0}, &block)
1141
+ standard_methods(name, identifier,'b_for', &block)
1142
+ define_method(name) do
1143
+ return platform.b_text_for identifier.clone unless block_given?
1144
+ self.send("#{name}_element").text
1145
+ end
1146
+ end
1147
+
1128
1148
  #
1129
1149
  # adds two methods - one to retrieve a svg, and another to check
1130
1150
  # the svg's existence.
@@ -1134,7 +1154,7 @@ module PageObject
1134
1154
  # # will generate 'circle_element', and 'circle?' methods
1135
1155
  #
1136
1156
  # @param [Symbol] the name used for the generated methods
1137
- # @param [Hash] identifier how we find a svg. You can use a multiple paramaters
1157
+ # @param [Hash] identifier how we find a svg. You can use a multiple parameters
1138
1158
  # by combining of any of the following except xpath. The valid keys are:
1139
1159
  # * :class => Watir and Selenium
1140
1160
  # * :css => Selenium only
@@ -1159,7 +1179,7 @@ module PageObject
1159
1179
  #
1160
1180
  # @param [Symbol] the name used for the generated methods
1161
1181
  # @param [Symbol] the name of the tag for the element
1162
- # @param [Hash] identifier how we find an element. You can use a multiple paramaters
1182
+ # @param [Hash] identifier how we find an element. You can use a multiple parameters
1163
1183
  # by combining of any of the following except xpath. The valid keys are:
1164
1184
  # * :class => Watir and Selenium
1165
1185
  # * :css => Selenium only
@@ -1192,7 +1212,7 @@ module PageObject
1192
1212
  #
1193
1213
  # @param [Symbol] the name used for the generated methods
1194
1214
  # @param [Symbol] the name of the tag for the element
1195
- # @param [Hash] identifier how we find an element. You can use a multiple paramaters
1215
+ # @param [Hash] identifier how we find an element. You can use a multiple parameters
1196
1216
  # by combining of any of the following except xpath. The valid keys are:
1197
1217
  # * :class => Watir and Selenium
1198
1218
  # * :css => Selenium only
@@ -1221,7 +1241,7 @@ module PageObject
1221
1241
  #
1222
1242
  # @param [Symbol] the name used for the generated methods
1223
1243
  # @param [Symbol] the name of the tag for the element
1224
- # @param [Hash] identifier how we find an element. You can use a multiple paramaters
1244
+ # @param [Hash] identifier how we find an element. You can use a multiple parameters
1225
1245
  # by combining of any of the following except xpath. The valid keys are:
1226
1246
  # * :class => Watir and Selenium
1227
1247
  # * :css => Selenium only
@@ -1286,14 +1306,14 @@ module PageObject
1286
1306
  #
1287
1307
  # methods to fetch multiple elements of the same type
1288
1308
  #
1289
- # adds a method to the page object to retrun all of the matching elements
1309
+ # adds a method to the page object to return all of the matching elements
1290
1310
  #
1291
1311
  # @example
1292
1312
  # text_fields(:first_name, :id => "first_name")
1293
1313
  # # will generate 'first_name_elements'
1294
1314
  #
1295
1315
  # @param [String] the name used for the generated methods
1296
- # @param [Hash] identifier how we find a text field. You can use a multiple paramaters
1316
+ # @param [Hash] identifier how we find a text field. You can use a multiple parameters
1297
1317
  # by combining of any of the following except xpath. The valid
1298
1318
  # keys are the same ones supported by the standard methods.
1299
1319
  # @param optional block to be invoked when element method is called