page-object 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/ChangeLog +10 -1
  2. data/features/async.feature +11 -4
  3. data/features/file_field.feature +30 -0
  4. data/features/form.feature +1 -0
  5. data/features/html/async.html +21 -0
  6. data/features/html/nested_elements.html +3 -1
  7. data/features/html/static_elements.html +4 -2
  8. data/features/image.feature +2 -0
  9. data/features/nested_elements.feature +4 -0
  10. data/features/step_definitions/async_steps.rb +31 -0
  11. data/features/step_definitions/file_field_steps.rb +19 -0
  12. data/features/step_definitions/nested_elements_steps.rb +16 -7
  13. data/features/support/page.rb +13 -0
  14. data/features/support/url_helper.rb +4 -0
  15. data/features/text_field.feature +3 -2
  16. data/lib/page-object/accessors.rb +35 -1
  17. data/lib/page-object/element_locators.rb +19 -1
  18. data/lib/page-object/elements.rb +1 -0
  19. data/lib/page-object/elements/element.rb +20 -0
  20. data/lib/page-object/elements/file_field.rb +35 -0
  21. data/lib/page-object/elements/form.rb +8 -0
  22. data/lib/page-object/elements/image.rb +8 -0
  23. data/lib/page-object/elements/text_field.rb +2 -2
  24. data/lib/page-object/nested_elements.rb +4 -0
  25. data/lib/page-object/page_populator.rb +2 -2
  26. data/lib/page-object/platforms/selenium_webdriver/check_box.rb +2 -2
  27. data/lib/page-object/platforms/selenium_webdriver/element.rb +19 -14
  28. data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
  29. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +30 -2
  30. data/lib/page-object/platforms/watir_webdriver/element.rb +19 -14
  31. data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
  32. data/lib/page-object/platforms/watir_webdriver/page_object.rb +22 -1
  33. data/lib/page-object/version.rb +1 -1
  34. data/spec/page-object/accessors_spec.rb +45 -0
  35. data/spec/page-object/element_locators_spec.rb +7 -1
  36. data/spec/page-object/elements/element_spec.rb +1 -10
  37. data/spec/page-object/elements/file_field_spec.rb +35 -0
  38. data/spec/page-object/elements/image_spec.rb +3 -3
  39. data/spec/page-object/elements/text_field_spec.rb +3 -3
  40. data/spec/page-object/page_populator_spec.rb +6 -0
  41. metadata +23 -12
data/ChangeLog CHANGED
@@ -1,4 +1,13 @@
1
- === Version 0.5.3
1
+ === Version 0.5.4 / 2011-12-18
2
+ * Enhancements
3
+ * Added deprecation warning to the method_missing method on Element. This ability will be removed in 0.6
4
+ * Added full support for file_field element
5
+ * Added ability to find TextField by :title
6
+ * Added ability to find Form by :action
7
+ * Added ability to find Image by :alt
8
+ * Added ability to find Image by :src
9
+
10
+ === Version 0.5.3 / 2011-12-11
2
11
  * Enhancements
3
12
  * Added new module PagePopulator with single method populate_page_with
4
13
  * Updated to use selenium-webdriver 2.15.0
@@ -1,11 +1,18 @@
1
1
  Feature: Handling Asynch calls
2
2
 
3
- Background:
4
- Given I am on the static elements page
5
-
6
3
  Scenario: Link element methods
4
+ Given I am on the static elements page
7
5
  When I retrieve a link element
8
6
  Then I should be able to wait until it is present
9
7
  And I should be able to wait until it is visible
10
8
  And I should be able to wait until it is not visible
11
- And I should be able to wait until a block returns true
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
@@ -0,0 +1,30 @@
1
+ Feature: File Field
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: Setting the value on the file field
7
+ When I set the file field to the step definition file
8
+ Then its' value should equal that file
9
+
10
+ Scenario Outline: Locating file fields on the Page
11
+ When I search for the file field by "<search_by>"
12
+ Then I should be able to set the file field
13
+
14
+ Examples:
15
+ | search_by |
16
+ | id |
17
+ | class |
18
+ | name |
19
+ | xpath |
20
+ | title |
21
+ | index |
22
+
23
+ Scenario Outline: Locating file fields using multiple parameters
24
+ When I search for the file field by "<param1>" and "<param2>"
25
+ Then I should be able to set the file field
26
+
27
+ Examples:
28
+ | param1 | param2 |
29
+ | class | index |
30
+ | name | index |
@@ -17,6 +17,7 @@ Feature: Form
17
17
  | class |
18
18
  | xpath |
19
19
  | index |
20
+ | action |
20
21
 
21
22
  Scenario Outline: Locating table using multiple parameters
22
23
  When I locate the form using "<param1>" and "<param2>"
@@ -0,0 +1,21 @@
1
+ <html>
2
+ <head>
3
+ <title>Async Page</title>
4
+ <script type="text/javascript">
5
+ function unhide() {
6
+ document.getElementById("target").style.display="block";
7
+ }
8
+
9
+ function hide() {
10
+ document.getElementById("target").style.display="none";
11
+ }
12
+ </script>
13
+ </head>
14
+ <body>
15
+ <input type="button" id="target" value="Target"/>
16
+ <input type="button" onclick="setTimeout(function() {hide();}, 2000);" value="Hide Button"/>
17
+ <input type="button" onclick="setTimeout(function() {unhide();}, 2000);" value="Unhide Button"/>
18
+ </body>
19
+ </html>
20
+
21
+
@@ -17,7 +17,9 @@
17
17
  <option value="option2">Test 2</option>
18
18
  </select>
19
19
  <input type="checkbox" value="0"/>
20
- <input type="radio" value="Milk">
20
+ <input type="radio" value="Milk"/>
21
+ <input type="file"/>
22
+
21
23
  <div>
22
24
  page-object rocks!
23
25
  </div>
@@ -6,7 +6,7 @@
6
6
  <p id='p_id' name='p_name' class='p_class'>Static Elements Page</p>
7
7
 
8
8
  <input id="text_field_id" name="text_field_name" class="text_field_class"
9
- size="40" type="text"/>
9
+ title="text_field_title" size="40" type="text"/>
10
10
 
11
11
  <input id="hidden_field_id" name="hidden_field_name" class="hidden_field_class"
12
12
  size="40" type="hidden" value="12345"/>
@@ -52,11 +52,13 @@
52
52
  <input value="Disabled" disabled="true" type ="submit"/>
53
53
  </form>
54
54
 
55
- <img src="images/circle.png" id="image_id" name="image_name" class="image_class">
55
+ <img src="images/circle.png" id="image_id" name="image_name" class="image_class", alt="image_alt">
56
56
 
57
57
  <form id="form_id" class="form_class" name="form_name" action="/">
58
58
  </form>
59
59
 
60
+ <input type="file" name="file_field_name" id="file_field_id" class="file_field_class" title="file_field_title" />
61
+
60
62
  <ul id="ul_id" name="ul_name" class="ul_class">
61
63
  <li id="li_id" name="li_name" class="li_class">Item One</li>
62
64
  <li>Item Two</li>
@@ -20,6 +20,8 @@ Feature: Image
20
20
  | name |
21
21
  | xpath |
22
22
  | index |
23
+ | alt |
24
+ | src |
23
25
 
24
26
  Scenario Outline: Locating an image using multiple parameters
25
27
  When I get the image element by "<param1>" and "<param2>"
@@ -26,6 +26,10 @@ Feature: Nested Elements
26
26
  Scenario: Finding a select list within a div
27
27
  When I search for a select list located in a div
28
28
  Then I should be able to select "Test 2" in the nested select list
29
+
30
+ Scenario: Finding a file field within a div
31
+ When I search for a file field located in a div
32
+ Then I should be able to set the nested file field
29
33
 
30
34
  Scenario: Finding a checkbox within a div
31
35
  When I search for a checkbox located in a div
@@ -29,3 +29,34 @@ Then /^I should be able to wait until a block returns true$/ do
29
29
  @element.visible?
30
30
  end
31
31
  end
32
+
33
+ class AsyncPage
34
+ include PageObject
35
+ button(:target, :value => 'Target')
36
+ button(:hide, :value => 'Hide Button')
37
+ button(:unhide, :value => 'Unhide Button')
38
+ end
39
+
40
+ Given /^I am on the async elements page$/ do
41
+ @page = AsyncPage.new(@browser)
42
+ @page.navigate_to(UrlHelper.async)
43
+ end
44
+
45
+ When /^I make the button invisible$/ do
46
+ @page.hide
47
+ sleep 2
48
+ end
49
+
50
+ Then /^I should be able to click it when it becomses visible$/ do
51
+ @page.unhide
52
+ @page.target_element.when_visible do
53
+ @page.target
54
+ end
55
+ end
56
+
57
+ Then /^I should be able to wait until the button becomes invisible$/ do
58
+ @page.hide
59
+ @page.target_element.when_not_visible do
60
+ @page.target_element.attribute("block").should == "none"
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ When /^I set the file field to the step definition file$/ do
2
+ @page.file_field_id = __FILE__
3
+ end
4
+
5
+ Then /^its\' value should equal that file$/ do
6
+ @page.file_field_id_element.value.should == __FILE__
7
+ end
8
+
9
+ When /^I search for the file field by "([^\"]*)"$/ do |how|
10
+ @how = how
11
+ end
12
+
13
+ When /^I search for the file field by "([^\"]*)" and "([^\"]*)"$/ do |param1, param2|
14
+ @how = "#{param1}_#{param2}"
15
+ end
16
+
17
+ Then /^I should be able to set the file field$/ do
18
+ @page.send "file_field_#{@how}=", __FILE__
19
+ end
@@ -26,6 +26,7 @@ class NestedElementsPage
26
26
  h5(:nested_h5) { |page| page.outer_div_element.h5_element }
27
27
  h6(:nested_h6) { |page| page.outer_div_element.h6_element }
28
28
  paragraph(:nested_paragraph) { |page| page.outer_div_element.paragraph_element }
29
+ file_field(:nested_file_field) { |page| page.outer_div_element.file_field_element }
29
30
  end
30
31
 
31
32
  Given /^I am on the nested elements page$/ do
@@ -127,7 +128,7 @@ When /^I search the second table cell located in a table in a div$/ do
127
128
  @cell = @page.nested_cell_element
128
129
  end
129
130
 
130
- Then /^the nested table cell should contain "([^"]*)"$/ do |value|
131
+ Then /^the nested table cell should contain "([^\"]*)"$/ do |value|
131
132
  @cell.text.should == value
132
133
  end
133
134
 
@@ -135,11 +136,11 @@ When /^I search for an image located in a div$/ do
135
136
  @image = @page.nested_image_element
136
137
  end
137
138
 
138
- Then /^the nested image should be "([^"]*)" pixels wide$/ do |width|
139
+ Then /^the nested image should be "([^\"]*)" pixels wide$/ do |width|
139
140
  @image.width.should == width.to_i
140
141
  end
141
142
 
142
- Then /^the nested image should be "([^"]*)" pixels tall$/ do |height|
143
+ Then /^the nested image should be "([^\"]*)" pixels tall$/ do |height|
143
144
  @image.height.should == height.to_i
144
145
  end
145
146
 
@@ -155,7 +156,7 @@ When /^I search for an ordered list located in a div$/ do
155
156
  @list = @page.nested_ordered_list_element
156
157
  end
157
158
 
158
- Then /^the first nested list items text should be "([^"]*)"$/ do |value|
159
+ Then /^the first nested list items text should be "([^\"]*)"$/ do |value|
159
160
  @list[0].text.should == value
160
161
  end
161
162
 
@@ -167,7 +168,7 @@ When /^I search for a list item nested in an ordered list in a div$/ do
167
168
  @li = @page.nested_list_item_element
168
169
  end
169
170
 
170
- Then /^I should see the nested list items text should be "([^"]*)"$/ do |value|
171
+ Then /^I should see the nested list items text should be "([^\"]*)"$/ do |value|
171
172
  @li.text.should == value
172
173
  end
173
174
 
@@ -175,7 +176,7 @@ When /^I search for a h(\d+) located in a div$/ do |num|
175
176
  @header = @page.send "nested_h#{num}_element"
176
177
  end
177
178
 
178
- Then /^I should see the nested h(\d+)s text should be "([^"]*)"$/ do |num, value|
179
+ Then /^I should see the nested h(\d+)s text should be "([^\"]*)"$/ do |num, value|
179
180
  @header.text.should == value
180
181
  end
181
182
 
@@ -183,6 +184,14 @@ When /^I search for a paragraph located in a div$/ do
183
184
  @para = @page.nested_paragraph_element
184
185
  end
185
186
 
186
- Then /^I should see the nested paragraphs text should be "([^"]*)"$/ do |value|
187
+ Then /^I should see the nested paragraphs text should be "([^\"]*)"$/ do |value|
187
188
  @para.text.should == value
188
189
  end
190
+
191
+ When /^I search for a file field located in a div$/ do
192
+ @ff = @page.nested_file_field_element
193
+ end
194
+
195
+ Then /^I should be able to set the nested file field$/ do
196
+ @ff.value = __FILE__
197
+ end
@@ -14,6 +14,7 @@ class Page
14
14
  text_field(:text_field_index, :index => 0)
15
15
  text_field(:text_field_text, :text => "")
16
16
  text_field(:text_field_value, :value => "")
17
+ text_field(:text_field_title, :title => 'text_field_title')
17
18
  text_field(:text_field_class_index, :class => "text_field_class", :index => 0)
18
19
  text_field(:text_field_name_index, :name => "text_field_name", :index => 0)
19
20
 
@@ -145,6 +146,8 @@ class Page
145
146
  image(:image_class, :class => 'image_class')
146
147
  image(:image_index, :index => 0)
147
148
  image(:image_xpath, :xpath => '//img')
149
+ image(:image_alt, :alt => 'image_alt')
150
+ image(:image_src, :src => 'images/circle.png')
148
151
  image(:image_class_index, :class => "image_class", :index => 0)
149
152
  image(:image_name_index, :name => "image_name", :index => 0)
150
153
 
@@ -153,6 +156,7 @@ class Page
153
156
  form(:form_class, :class => 'form_class')
154
157
  form(:form_index, :index => 0)
155
158
  form(:form_xpath, :xpath => '//form')
159
+ form(:form_action, :action => "success.html")
156
160
  form(:form_class_index, :class => "form_class", :index => 0)
157
161
  form(:form_name_index, :name => "form_name", :index => 0)
158
162
 
@@ -239,6 +243,15 @@ class Page
239
243
  button(:alert_button, :id => 'alert_button')
240
244
  button(:confirm_button, :id => 'confirm_button')
241
245
  button(:prompt_button, :id => 'prompt_button')
246
+
247
+ file_field(:file_field_id, :id => 'file_field_id')
248
+ file_field(:file_field_name, :name => 'file_field_name')
249
+ file_field(:file_field_class, :class => 'file_field_class')
250
+ file_field(:file_field_index, :index => 0)
251
+ file_field(:file_field_title, :title => 'file_field_title')
252
+ file_field(:file_field_class_index, :class => 'file_field_class', :index => 0)
253
+ file_field(:file_field_name_index, :name => 'file_field_name', :index => 0)
254
+ file_field(:file_field_xpath, :xpath => "//input[@type='file']")
242
255
 
243
256
  link(:open_window, :text => 'New Window')
244
257
  end
@@ -32,5 +32,9 @@ module UrlHelper
32
32
  def modal
33
33
  "#{files}/modal.html"
34
34
  end
35
+
36
+ def async
37
+ "#{files}/async.html"
38
+ end
35
39
  end
36
40
  end
@@ -14,7 +14,7 @@ Feature: Text Fields
14
14
  When I search for the text field by "<search_by>"
15
15
  Then I should be able to type "I found it" into the field
16
16
 
17
- Scenarios:
17
+ Examples:
18
18
  | search_by |
19
19
  | id |
20
20
  | class |
@@ -23,12 +23,13 @@ Feature: Text Fields
23
23
  | css |
24
24
  | tag_name |
25
25
  | index |
26
+ | title |
26
27
 
27
28
  Scenario Outline: Locating a text field using multiple parameters
28
29
  When I search for the text field by "<param1>" and "<param2>"
29
30
  Then I should be able to type "I found it" into the field
30
31
 
31
- Scenarios:
32
+ Examples:
32
33
  | param1 | param2 |
33
34
  | class | index |
34
35
  | name | index |
@@ -63,6 +63,7 @@ module PageObject
63
63
  # * :name => Watir and Selenium
64
64
  # * :tag_name => Watir and Selenium
65
65
  # * :text => Watir only
66
+ # * :title => Watir and Selenium
66
67
  # * :value => Watir only
67
68
  # * :xpath => Watir and Selenium
68
69
  # @param optional block to be invoked when element method is called
@@ -73,7 +74,7 @@ module PageObject
73
74
  self.send("#{name}_element").value
74
75
  end
75
76
  define_method("#{name}=") do |value|
76
- return platform.text_field_value_set(identifier.clone, value) unless block_given?
77
+ return platform.text_field_value_set(identifier.clone, value) unless block_given?
77
78
  self.send("#{name}_element").value = value
78
79
  end
79
80
  define_method("#{name}_element") do
@@ -466,10 +467,12 @@ module PageObject
466
467
  # @param [String] the name used for the generated methods
467
468
  # @param [Hash] identifier how we find an image. You can use a multiple paramaters
468
469
  # by combining of any of the following except xpath. The valid keys are:
470
+ # * :alt => Watir and Selenium
469
471
  # * :class => Watir and Selenium
470
472
  # * :id => Watir and Selenium
471
473
  # * :index => Watir and Selenium
472
474
  # * :name => Watir and Selenium
475
+ # * :src => Watir and Selenium
473
476
  # * :xpath => Watir and Selenium
474
477
  # @param optional block to be invoked when element method is called
475
478
  #
@@ -491,6 +494,7 @@ module PageObject
491
494
  # @param [String] the name used for the generated methods
492
495
  # @param [Hash] identifier how we find a form. You can use a multiple paramaters
493
496
  # by combining of any of the following except xpath. The valid keys are:
497
+ # * :action => Watir and Selenium
494
498
  # * :class => Watir and Selenium
495
499
  # * :id => Watir and Selenium
496
500
  # * :index => Watir and Selenium
@@ -787,5 +791,35 @@ module PageObject
787
791
  end
788
792
  alias_method "#{name}_paragraph".to_sym, "#{name}_element".to_sym
789
793
  end
794
+
795
+ #
796
+ # adds a method to set the file for a file field and to retrieve
797
+ # the file field element
798
+ #
799
+ # @example
800
+ # file_field(:the_file, :id => 'file_to_upload')
801
+ # # will generate a 'the_file=' and 'the_file_element' method
802
+ #
803
+ # @param [String] the name used for the generated methods
804
+ # @param [Hash] identifier how we find a file_field. You can use a multiple paramaters
805
+ # by combining of any of the following except xpath. The valid keys are:
806
+ # * :class => Watir and Selenium
807
+ # * :id => Watir and Selenium
808
+ # * :index => Watir and Selenium
809
+ # * :name => Watir and Selenium
810
+ # * :title => Watir and Selenium
811
+ # * :xpath => Watir and Selenium
812
+ # @param optional block to be invoked when element method is called
813
+ #
814
+ def file_field(name, identifier=nil, &block)
815
+ define_method("#{name}=") do |value|
816
+ return platform.file_field_value_set(identifier.clone, value) unless block_given?
817
+ self.send("#{name}_element").value = value
818
+ end
819
+ define_method("#{name}_element") do
820
+ return call_block(&block) if block_given?
821
+ platform.file_field_for(identifier.clone)
822
+ end
823
+ end
790
824
  end
791
825
  end
@@ -13,6 +13,8 @@ module PageObject
13
13
  # * :text => Watir only
14
14
  # * :value => Watir and Selenium
15
15
  # * :xpath => Watir and Selenium
16
+ # * :src => Watir and Selenium (image button only)
17
+ # * :alt => Watir and Selenium (image button only)
16
18
  #
17
19
  def button_element(identifier)
18
20
  platform.button_for(identifier.clone)
@@ -30,6 +32,7 @@ module PageObject
30
32
  # * :name => Watir and Selenium
31
33
  # * :tag_name => Watir and Selenium
32
34
  # * :text => Watir only
35
+ # * :title => Watir and Selenium
33
36
  # * :value => Watir only
34
37
  # * :xpath => Watir and Selenium
35
38
  #
@@ -377,6 +380,21 @@ module PageObject
377
380
  #
378
381
  def paragraph_element(identifier)
379
382
  platform.paragraph_for(identifier.clone)
383
+ end
384
+
385
+ #
386
+ # Finds a paragraph
387
+ #
388
+ # @param [Hash] identifier how we find a paragraph. You can use a multiple paramaters
389
+ # by combining of any of the following except xpath. The valid keys are:
390
+ # * :class => Watir and Selenium
391
+ # * :id => Watir and Selenium
392
+ # * :index => Watir and Selenium
393
+ # * :name => Watir and Selenium
394
+ # * :title => Watir and Selenium
395
+ # * :xpath => Watir and Selenium
396
+ def file_field_element(identifier)
397
+ platform.file_field_for(identifier.clone)
380
398
  end
381
399
  end
382
- end
400
+ end
@@ -20,3 +20,4 @@ require 'page-object/elements/ordered_list'
20
20
  require 'page-object/elements/option'
21
21
  require 'page-object/elements/heading'
22
22
  require 'page-object/elements/paragraph'
23
+ require 'page-object/elements/file_field'
@@ -23,6 +23,20 @@ module PageObject
23
23
  def click
24
24
  @element.click
25
25
  end
26
+
27
+ #
28
+ # double click the element
29
+ #
30
+ def double_click
31
+ @element.double_click
32
+ end
33
+
34
+ #
35
+ # return true if the element is enabled
36
+ #
37
+ def enabled?
38
+ @element.enabled?
39
+ end
26
40
 
27
41
  #
28
42
  # get the value of the given CSS property
@@ -67,6 +81,12 @@ module PageObject
67
81
  # delegate calls to driver element
68
82
  def method_missing(*args, &block)
69
83
  m = args.shift
84
+ puts "*** DEPRECATION WARNING"
85
+ puts "*** You are calling a method named #{m}."
86
+ puts "*** This method does not exist in page-object so it is being passed to the driver."
87
+ puts "*** This feature will be removed in the near future."
88
+ puts "*** Please change your code to call the correct page-object method."
89
+ puts "*** If you are using functionality that does not exist in page-object please request it be added."
70
90
  begin
71
91
  element.send m, *args, &block
72
92
  rescue Exception => e
@@ -0,0 +1,35 @@
1
+
2
+ module PageObject
3
+ module Elements
4
+ class FileField < Element
5
+
6
+ def initialize(element, platform)
7
+ @element = element
8
+ include_platform_for platform
9
+ end
10
+
11
+ protected
12
+
13
+ def self.watir_finders
14
+ super + [:title]
15
+ end
16
+
17
+ def self.selenium_finders
18
+ super + [:title]
19
+ end
20
+
21
+ def include_platform_for platform
22
+ super
23
+ if platform[:platform] == :watir_webdriver
24
+ require 'page-object/platforms/watir_webdriver/file_field'
25
+ self.class.send :include, PageObject::Platforms::WatirWebDriver::FileField
26
+ elsif platform[:platform] == :selenium_webdriver
27
+ require 'page-object/platforms/selenium_webdriver/file_field'
28
+ self.class.send :include, PageObject::Platforms::SeleniumWebDriver::FileField
29
+ else
30
+ raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -9,6 +9,14 @@ module PageObject
9
9
 
10
10
  protected
11
11
 
12
+ def self.watir_finders
13
+ super + [:action]
14
+ end
15
+
16
+ def self.selenium_finders
17
+ super + [:action]
18
+ end
19
+
12
20
  def include_platform_for platform
13
21
  super
14
22
  if platform[:platform] == :watir_webdriver
@@ -8,6 +8,14 @@ module PageObject
8
8
 
9
9
  protected
10
10
 
11
+ def self.watir_finders
12
+ super + [:alt, :src]
13
+ end
14
+
15
+ def self.selenium_finders
16
+ super + [:alt, :src]
17
+ end
18
+
11
19
  def include_platform_for platform
12
20
  super
13
21
  if platform[:platform] == :watir_webdriver
@@ -11,7 +11,7 @@ module PageObject
11
11
  protected
12
12
 
13
13
  def self.watir_finders
14
- super + [:tag_name]
14
+ super + [:tag_name, :title]
15
15
  end
16
16
 
17
17
  def self.watir_mapping
@@ -19,7 +19,7 @@ module PageObject
19
19
  end
20
20
 
21
21
  def self.selenium_finders
22
- super + [:css]
22
+ super + [:css, :title]
23
23
  end
24
24
 
25
25
  def self.selenium_mapping
@@ -96,5 +96,9 @@ module PageObject
96
96
  def paragraph_element(identifier={:index => 0})
97
97
  @platform.paragraph_for(identifier)
98
98
  end
99
+
100
+ def file_field_element(identifier={:index => 0})
101
+ @platform.file_field_for(identifier)
102
+ end
99
103
  end
100
104
  end
@@ -3,7 +3,7 @@ module PageObject
3
3
 
4
4
  #
5
5
  # This method will populate all matched page TextFields,
6
- # TextAreas, SelectLists, Checkboxes, and Radio Buttons from the
6
+ # TextAreas, SelectLists, FileFields, Checkboxes, and Radio Buttons from the
7
7
  # Hash passed as an argument. The way it find an element is by
8
8
  # matching the Hash key to the name you provided when declaring
9
9
  # the element on your page.
@@ -26,7 +26,7 @@ module PageObject
26
26
  #
27
27
  # @param [Hash] the data to use to populate this page. The key
28
28
  # can be either a string or a symbol. The value must be a string
29
- # for TextField, TextArea, and SelectList and must be true or
29
+ # for TextField, TextArea, SelectList, and FileField and must be true or
30
30
  # false for a Checkbox or RadioButton.
31
31
  #
32
32
  def populate_page_with(data)
@@ -7,14 +7,14 @@ module PageObject
7
7
  # check the checkbox
8
8
  #
9
9
  def check
10
- element.click unless selected?
10
+ element.click unless element.selected?
11
11
  end
12
12
 
13
13
  #
14
14
  # uncheck the checkbox
15
15
  #
16
16
  def uncheck
17
- element.click if selected?
17
+ element.click if element.selected?
18
18
  end
19
19
 
20
20
  #
@@ -55,22 +55,27 @@ module PageObject
55
55
  end
56
56
 
57
57
  #
58
- # Get the value of a the given attribute of the element. Will return the current value, even if
59
- # this has been modified after the page has been loaded. More exactly, this method will return
60
- # the value of the given attribute, unless that attribute is not present, in which case the
61
- # value of the property with the same name is returned. If neither value is set, nil is
62
- # returned. The "style" attribute is converted as best can be to a text representation with a
63
- # trailing semi-colon. The following are deemed to be "boolean" attributes, and will
64
- # return either "true" or "false":
65
- #
66
- # async, autofocus, autoplay, checked, compact, complete, controls, declare, defaultchecked,
67
- # defaultselected, defer, disabled, draggable, ended, formnovalidate, hidden, indeterminate,
68
- # iscontenteditable, ismap, itemscope, loop, multiple, muted, nohref, noresize, noshade, novalidate,
69
- # nowrap, open, paused, pubdate, readonly, required, reversed, scoped, seamless, seeking,
58
+ # Get the value of a the given attribute of the element. Will
59
+ # return the current value, even if this has been modified
60
+ # after the page has been loaded. More exactly, this method
61
+ # will return the value of the given attribute, unless that
62
+ # attribute is not present, in which case the value of the
63
+ # property with the same name is returned. If neither value is
64
+ # set, nil is returned. The "style" attribute is converted as
65
+ # best can be to a text representation with a trailing
66
+ # semi-colon. The following are deemed to be "boolean"
67
+ # attributes, and will return either "true" or "false":
68
+ #
69
+ # async, autofocus, autoplay, checked, compact, complete,
70
+ # controls, declare, defaultchecked, defaultselected, defer,
71
+ # disabled, draggable, ended, formnovalidate, hidden, indeterminate,
72
+ # iscontenteditable, ismap, itemscope, loop, multiple, muted,
73
+ # nohref, noresize, noshade, novalidate, nowrap, open, paused,
74
+ # pubdate, readonly, required, reversed, scoped, seamless, seeking,
70
75
  # selected, spellcheck, truespeed, willvalidate
71
76
  #
72
- # Finally, the following commonly mis-capitalized attribute/property names are evaluated as
73
- # expected:
77
+ # Finally, the following commonly mis-capitalized
78
+ # attribute/property names are evaluated as expected:
74
79
  #
75
80
  # class, readonly
76
81
  #
@@ -0,0 +1,16 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumWebDriver
4
+
5
+ module FileField
6
+
7
+ #
8
+ # Set the value of the FileField
9
+ #
10
+ def value=(new_value)
11
+ element.send_keys(new_value)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -739,7 +739,7 @@ module PageObject
739
739
  how, what, frame_identifiers = parse_identifiers(identifier, Elements::Paragraph, 'p')
740
740
  switch_to_frame(frame_identifiers)
741
741
  value = @browser.find_element(how, what).text
742
- @browser.switch_to.default_content
742
+ @browser.switch_to.default_content unless frame_identifiers.nil?
743
743
  value
744
744
  end
745
745
 
@@ -753,7 +753,30 @@ module PageObject
753
753
  element = @browser.find_element(how, what)
754
754
  @browser.switch_to.default_content unless frame_identifiers.nil?
755
755
  ::PageObject::Elements::Paragraph.new(element, :platform => :selenium_webdriver)
756
- end
756
+ end
757
+
758
+ #
759
+ # platform method to set the file on a file_field element
760
+ # See PageObject::Accessors#file_field
761
+ #
762
+ def file_field_value_set(identifier, value)
763
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::FileField, 'input', :type => 'file')
764
+ switch_to_frame(frame_identifiers)
765
+ @browser.find_element(how, what).send_keys(value)
766
+ @browser.switch_to.default_content unless frame_identifiers.nil?
767
+ end
768
+
769
+ #
770
+ # platform method to retrieve a file_field element
771
+ # See PageObject::Accessors#file_field
772
+ #
773
+ def file_field_for(identifier)
774
+ how, what, frame_identifiers = parse_identifiers(identifier, Elements::FileField, 'input', :type => 'file')
775
+ switch_to_frame(frame_identifiers)
776
+ element = @browser.find_element(how, what)
777
+ @browser.switch_to.default_content unless frame_identifiers.nil?
778
+ ::PageObject::Elements::FileField.new(element, :platform => :selenium_webdriver)
779
+ end
757
780
 
758
781
  private
759
782
 
@@ -783,7 +806,12 @@ module PageObject
783
806
  return false if identifier[:value] and tag == 'input' and additional[:type] == 'submit'
784
807
  return false if identifier[:src] and tag == 'input' and additional[:type] == 'submit'
785
808
  return false if identifier[:alt] and tag == 'input' and additional[:type] == 'submit'
809
+ return false if identifier[:title] and tag == 'input' and additional[:type] == 'text'
786
810
  return false if identifier[:value] and tag == 'input' and additional[:type] == 'radio'
811
+ return false if identifier[:title] and tag == 'input' and additional[:type] == 'file'
812
+ return false if identifier[:action] and tag == 'form'
813
+ return false if identifier[:alt] and tag == 'img'
814
+ return false if identifier[:src] and tag == 'img'
787
815
  true
788
816
  end
789
817
 
@@ -55,22 +55,27 @@ module PageObject
55
55
  end
56
56
 
57
57
  #
58
- # Get the value of a the given attribute of the element. Will return the current value, even if
59
- # this has been modified after the page has been loaded. More exactly, this method will return
60
- # the value of the given attribute, unless that attribute is not present, in which case the
61
- # value of the property with the same name is returned. If neither value is set, nil is
62
- # returned. The "style" attribute is converted as best can be to a text representation with a
63
- # trailing semi-colon. The following are deemed to be "boolean" attributes, and will
64
- # return either "true" or "false":
65
- #
66
- # async, autofocus, autoplay, checked, compact, complete, controls, declare, defaultchecked,
67
- # defaultselected, defer, disabled, draggable, ended, formnovalidate, hidden, indeterminate,
68
- # iscontenteditable, ismap, itemscope, loop, multiple, muted, nohref, noresize, noshade, novalidate,
69
- # nowrap, open, paused, pubdate, readonly, required, reversed, scoped, seamless, seeking,
58
+ # Get the value of a the given attribute of the element. Will
59
+ # return the current value, even if this has been modified
60
+ # after the page has been loaded. More exactly, this method
61
+ # will return the value of the given attribute, unless that
62
+ # attribute is not present, in which case the value of the
63
+ # property with the same name is returned. If neither value is
64
+ # set, nil is returned. The "style" attribute is converted as
65
+ # best can be to a text representation with a trailing
66
+ # semi-colon. The following are deemed to be "boolean"
67
+ # attributes, and will return either "true" or "false":
68
+ #
69
+ # async, autofocus, autoplay, checked, compact, complete,
70
+ # controls, declare, defaultchecked, defaultselected, defer,
71
+ # disabled, draggable, ended, formnovalidate, hidden, indeterminate,
72
+ # iscontenteditable, ismap, itemscope, loop, multiple, muted,
73
+ # nohref, noresize, noshade, novalidate, nowrap, open, paused,
74
+ # pubdate, readonly, required, reversed, scoped, seamless, seeking,
70
75
  # selected, spellcheck, truespeed, willvalidate
71
76
  #
72
- # Finally, the following commonly mis-capitalized attribute/property names are evaluated as
73
- # expected:
77
+ # Finally, the following commonly mis-capitalized
78
+ # attribute/property names are evaluated as expected:
74
79
  #
75
80
  # class, readonly
76
81
  #
@@ -0,0 +1,16 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+
5
+ module FileField
6
+
7
+ #
8
+ # Set the value of the Fileield
9
+ #
10
+ def value=(new_value)
11
+ element.set(new_value)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -704,7 +704,28 @@ module PageObject
704
704
  element = @browser.instance_eval "#{nested_frames(frame_identifiers)}p(identifier)"
705
705
  switch_to_default_content(frame_identifiers)
706
706
  ::PageObject::Elements::Paragraph.new(element, :platform => :watir_webdriver)
707
- end
707
+ end
708
+
709
+ #
710
+ # platform method to set the file on a file_field element
711
+ # See PageObject::Accessors#file_field
712
+ #
713
+ def file_field_value_set(identifier, value)
714
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::FileField)
715
+ @browser.instance_eval "#{nested_frames(frame_identifiers)}file_field(identifier).set(value)"
716
+ switch_to_default_content(frame_identifiers)
717
+ end
718
+
719
+ #
720
+ # platform method to retrieve a file_field element
721
+ # See PageObject::Accessors#file_field
722
+ #
723
+ def file_field_for(identifier)
724
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::FileField)
725
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}file_field(identifier)"
726
+ switch_to_default_content(frame_identifiers)
727
+ ::PageObject::Elements::FileField.new(element, :platform => :watir_webdriver)
728
+ end
708
729
 
709
730
  private
710
731
 
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.5.3"
3
+ VERSION = "0.5.4"
4
4
  end
@@ -28,6 +28,7 @@ class AccessorsTestPageObject
28
28
  h5(:heading5, :id => 'main_heading')
29
29
  h6(:heading6, :id => 'main_heading')
30
30
  paragraph(:first_para, :id => 'first')
31
+ file_field(:upload_me, :id => 'the_file')
31
32
  end
32
33
 
33
34
  class BlockPageObject
@@ -107,6 +108,9 @@ class BlockPageObject
107
108
  paragraph :first_para do |element|
108
109
  "p"
109
110
  end
111
+ file_field :a_file do |element|
112
+ "file_field"
113
+ end
110
114
  end
111
115
 
112
116
  describe PageObject::Accessors do
@@ -1176,4 +1180,45 @@ describe PageObject::Accessors do
1176
1180
  end
1177
1181
  end
1178
1182
  end
1183
+
1184
+ describe "file_field accessors" do
1185
+ context "when called on a page object" do
1186
+ it "should generate accessor methods" do
1187
+ watir_page_object.should respond_to(:upload_me=)
1188
+ watir_page_object.should respond_to(:upload_me_element)
1189
+ end
1190
+
1191
+ it "should call a block on the element method when present" do
1192
+ block_page_object.a_file_element.should == "file_field"
1193
+ end
1194
+ end
1195
+
1196
+ context "watir implementation" do
1197
+ it "should set the file name" do
1198
+ watir_browser.should_receive(:file_field).and_return(watir_browser)
1199
+ watir_browser.should_receive(:set).with('some_file')
1200
+ watir_page_object.upload_me = 'some_file'
1201
+ end
1202
+
1203
+ it "should retrieve a text field element" do
1204
+ watir_browser.should_receive(:file_field).and_return(watir_browser)
1205
+ element = watir_page_object.upload_me_element
1206
+ element.should be_instance_of PageObject::Elements::FileField
1207
+ end
1208
+ end
1209
+
1210
+ context "selenium implementation" do
1211
+ it "should set the file name" do
1212
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
1213
+ selenium_browser.should_receive(:send_keys).with('some_file')
1214
+ selenium_page_object.upload_me = 'some_file'
1215
+ end
1216
+
1217
+ it "should retrieve a file_field element" do
1218
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
1219
+ element = selenium_page_object.upload_me_element
1220
+ element.should be_instance_of PageObject::Elements::FileField
1221
+ end
1222
+ end
1223
+ end
1179
1224
  end
@@ -152,4 +152,10 @@ describe PageObject::ElementLocators do
152
152
  element = watir_page_object.paragraph_element(:id => 'blah')
153
153
  element.should be_instance_of PageObject::Elements::Paragraph
154
154
  end
155
- end
155
+
156
+ it "should find a file field element" do
157
+ watir_browser.should_receive(:file_field).with(:id => 'blah').and_return(watir_browser)
158
+ element = watir_page_object.file_field_element(:id => 'blah')
159
+ element.should be_instance_of PageObject::Elements::FileField
160
+ end
161
+ end
@@ -4,15 +4,6 @@ require 'page-object/elements'
4
4
 
5
5
  describe "Element class methods" do
6
6
 
7
- context "when handling unknown requests" do
8
- it "should delegate to the driver element" do
9
- watir_driver = double('watir')
10
- watir_element = PageObject::Elements::Element.new(watir_driver, :platform => :watir_webdriver)
11
- watir_driver.should_receive(:do_this)
12
- watir_element.do_this
13
- end
14
- end
15
-
16
7
  context "when building the identifiers for Watir" do
17
8
  it "should build xpath when finding elements by name where not supported" do
18
9
  ['table', 'span', 'div', 'td', 'li', 'ol', 'ul'].each do |tag|
@@ -85,4 +76,4 @@ describe "Element class methods" do
85
76
  end
86
77
  end
87
78
  end
88
- end
79
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::FileField do
5
+
6
+ describe "when mapping how to find an element" do
7
+ let(:filefield) { PageObject::Elements::FileField }
8
+
9
+ it "should map watir types to same" do
10
+ [:class, :id, :index, :name, :xpath, :title].each do |t|
11
+ identifier = filefield.watir_identifier_for t => 'value'
12
+ identifier.keys.first.should == t
13
+ end
14
+ end
15
+
16
+ it "should map selenium types to same" do
17
+ [:class, :id, :index, :name, :xpath, :title].each do |t|
18
+ key, value = filefield.selenium_identifier_for t => 'value'
19
+ key.should == t
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "interface" do
25
+ let(:filefield) { double('file_field') }
26
+
27
+ context "for selenium" do
28
+ it "should set its' value" do
29
+ selenium_file_field = PageObject::Elements::FileField.new(filefield, :platform => :selenium_webdriver)
30
+ filefield.should_receive(:send_keys).with('a file')
31
+ selenium_file_field.value = 'a file'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,14 +6,14 @@ describe PageObject::Elements::Image do
6
6
 
7
7
  describe "when mapping how to find an element" do
8
8
  it "should map watir types to same" do
9
- [:class, :id, :index, :name, :xpath].each do |t|
9
+ [:class, :id, :index, :name, :xpath, :alt, :src].each do |t|
10
10
  identifier = image.watir_identifier_for t => 'value'
11
11
  identifier.keys.first.should == t
12
12
  end
13
13
  end
14
14
 
15
15
  it "should map selenium types to same" do
16
- [:class, :id, :index, :name, :xpath].each do |t|
16
+ [:class, :id, :index, :name, :xpath, :alt, :src].each do |t|
17
17
  key, value = image.selenium_identifier_for t => 'value'
18
18
  key.should == t
19
19
  end
@@ -59,4 +59,4 @@ describe PageObject::Elements::Image do
59
59
  end
60
60
  end
61
61
  end
62
- end
62
+ end
@@ -7,7 +7,7 @@ describe PageObject::Elements::TextField do
7
7
  let(:textfield) { PageObject::Elements::TextField }
8
8
 
9
9
  it "should map watir types to same" do
10
- [:class, :id, :index, :name, :tag_name, :xpath].each do |t|
10
+ [:class, :id, :index, :name, :tag_name, :title, :xpath].each do |t|
11
11
  identifier = textfield.watir_identifier_for t => 'value'
12
12
  identifier.keys.first.should == t
13
13
  end
@@ -19,7 +19,7 @@ describe PageObject::Elements::TextField do
19
19
  end
20
20
 
21
21
  it "should map selenium types to same" do
22
- [:class, :css, :id, :name, :xpath, :index].each do |t|
22
+ [:class, :css, :id, :name, :title, :xpath, :index].each do |t|
23
23
  key, value = textfield.selenium_identifier_for t => 'value'
24
24
  key.should == t
25
25
  end
@@ -42,4 +42,4 @@ describe PageObject::Elements::TextField do
42
42
  end
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -6,6 +6,7 @@ class PageObjectTestPageObject
6
6
  text_field(:tf, :id => 'id')
7
7
  text_area(:ta, :id => 'id')
8
8
  select_list(:sl, :id => 'id')
9
+ file_field(:ff, :id => 'id')
9
10
  checkbox(:cb, :id => 'id')
10
11
  radio_button(:rb, :id => 'id')
11
12
  end
@@ -34,6 +35,11 @@ describe PageObject::PagePopulator do
34
35
  page_object.populate_page_with('sa' => 'value')
35
36
  end
36
37
 
38
+ it "should set a value in a file field" do
39
+ page_object.should_receive(:ff=).with('value')
40
+ page_object.populate_page_with('ff' => 'value')
41
+ end
42
+
37
43
  it "should check a checkbox to true is specified" do
38
44
  page_object.should_receive(:check_cb)
39
45
  page_object.populate_page_with('cb' => true)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page-object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-11 00:00:00.000000000 Z
12
+ date: 2011-12-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
16
- requirement: &70269994307840 !ruby/object:Gem::Requirement
16
+ requirement: &70274033036520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70269994307840
24
+ version_requirements: *70274033036520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: selenium-webdriver
27
- requirement: &70269994307020 !ruby/object:Gem::Requirement
27
+ requirement: &70274033035700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.15.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70269994307020
35
+ version_requirements: *70274033035700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70269994305640 !ruby/object:Gem::Requirement
38
+ requirement: &70274033031880 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.6.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70269994305640
46
+ version_requirements: *70274033031880
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cucumber
49
- requirement: &70269994302500 !ruby/object:Gem::Requirement
49
+ requirement: &70274033031160 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70269994302500
57
+ version_requirements: *70274033031160
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &70269994301820 !ruby/object:Gem::Requirement
60
+ requirement: &70274033030460 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.7.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70269994301820
68
+ version_requirements: *70274033030460
69
69
  description: Page Object DSL that works with both Watir and Selenium
70
70
  email:
71
71
  - jeff.morgan@leandog.com
@@ -88,10 +88,12 @@ files:
88
88
  - features/check_box.feature
89
89
  - features/div.feature
90
90
  - features/element.feature
91
+ - features/file_field.feature
91
92
  - features/form.feature
92
93
  - features/frames.feature
93
94
  - features/headings.feature
94
95
  - features/hidden_field.feature
96
+ - features/html/async.html
95
97
  - features/html/frame_1.html
96
98
  - features/html/frame_2.html
97
99
  - features/html/frame_3.html
@@ -126,6 +128,7 @@ files:
126
128
  - features/step_definitions/check_box_steps.rb
127
129
  - features/step_definitions/div_steps.rb
128
130
  - features/step_definitions/element_steps.rb
131
+ - features/step_definitions/file_field_steps.rb
129
132
  - features/step_definitions/form_steps.rb
130
133
  - features/step_definitions/frames_steps.rb
131
134
  - features/step_definitions/headings_steps.rb
@@ -164,6 +167,7 @@ files:
164
167
  - lib/page-object/elements/check_box.rb
165
168
  - lib/page-object/elements/div.rb
166
169
  - lib/page-object/elements/element.rb
170
+ - lib/page-object/elements/file_field.rb
167
171
  - lib/page-object/elements/form.rb
168
172
  - lib/page-object/elements/heading.rb
169
173
  - lib/page-object/elements/hidden_field.rb
@@ -191,6 +195,7 @@ files:
191
195
  - lib/page-object/platforms/selenium_webdriver/button.rb
192
196
  - lib/page-object/platforms/selenium_webdriver/check_box.rb
193
197
  - lib/page-object/platforms/selenium_webdriver/element.rb
198
+ - lib/page-object/platforms/selenium_webdriver/file_field.rb
194
199
  - lib/page-object/platforms/selenium_webdriver/form.rb
195
200
  - lib/page-object/platforms/selenium_webdriver/image.rb
196
201
  - lib/page-object/platforms/selenium_webdriver/link.rb
@@ -206,6 +211,7 @@ files:
206
211
  - lib/page-object/platforms/watir_webdriver.rb
207
212
  - lib/page-object/platforms/watir_webdriver/check_box.rb
208
213
  - lib/page-object/platforms/watir_webdriver/element.rb
214
+ - lib/page-object/platforms/watir_webdriver/file_field.rb
209
215
  - lib/page-object/platforms/watir_webdriver/form.rb
210
216
  - lib/page-object/platforms/watir_webdriver/image.rb
211
217
  - lib/page-object/platforms/watir_webdriver/ordered_list.rb
@@ -225,6 +231,7 @@ files:
225
231
  - spec/page-object/elements/check_box_spec.rb
226
232
  - spec/page-object/elements/div_spec.rb
227
233
  - spec/page-object/elements/element_spec.rb
234
+ - spec/page-object/elements/file_field_spec.rb
228
235
  - spec/page-object/elements/form_spec.rb
229
236
  - spec/page-object/elements/heading_spec.rb
230
237
  - spec/page-object/elements/hidden_field_spec.rb
@@ -281,10 +288,12 @@ test_files:
281
288
  - features/check_box.feature
282
289
  - features/div.feature
283
290
  - features/element.feature
291
+ - features/file_field.feature
284
292
  - features/form.feature
285
293
  - features/frames.feature
286
294
  - features/headings.feature
287
295
  - features/hidden_field.feature
296
+ - features/html/async.html
288
297
  - features/html/frame_1.html
289
298
  - features/html/frame_2.html
290
299
  - features/html/frame_3.html
@@ -319,6 +328,7 @@ test_files:
319
328
  - features/step_definitions/check_box_steps.rb
320
329
  - features/step_definitions/div_steps.rb
321
330
  - features/step_definitions/element_steps.rb
331
+ - features/step_definitions/file_field_steps.rb
322
332
  - features/step_definitions/form_steps.rb
323
333
  - features/step_definitions/frames_steps.rb
324
334
  - features/step_definitions/headings_steps.rb
@@ -354,6 +364,7 @@ test_files:
354
364
  - spec/page-object/elements/check_box_spec.rb
355
365
  - spec/page-object/elements/div_spec.rb
356
366
  - spec/page-object/elements/element_spec.rb
367
+ - spec/page-object/elements/file_field_spec.rb
357
368
  - spec/page-object/elements/form_spec.rb
358
369
  - spec/page-object/elements/heading_spec.rb
359
370
  - spec/page-object/elements/hidden_field_spec.rb