rcarvalho-capybara 0.4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. data/History.txt +202 -0
  2. data/README.rdoc +540 -0
  3. data/lib/capybara.rb +231 -0
  4. data/lib/capybara/cucumber.rb +32 -0
  5. data/lib/capybara/driver/base.rb +60 -0
  6. data/lib/capybara/driver/celerity_driver.rb +164 -0
  7. data/lib/capybara/driver/culerity_driver.rb +26 -0
  8. data/lib/capybara/driver/node.rb +78 -0
  9. data/lib/capybara/driver/rack_test_driver.rb +303 -0
  10. data/lib/capybara/driver/selenium_driver.rb +165 -0
  11. data/lib/capybara/dsl.rb +109 -0
  12. data/lib/capybara/node/actions.rb +160 -0
  13. data/lib/capybara/node/base.rb +47 -0
  14. data/lib/capybara/node/document.rb +17 -0
  15. data/lib/capybara/node/element.rb +182 -0
  16. data/lib/capybara/node/finders.rb +201 -0
  17. data/lib/capybara/node/matchers.rb +391 -0
  18. data/lib/capybara/node/simple.rb +116 -0
  19. data/lib/capybara/rails.rb +17 -0
  20. data/lib/capybara/rspec.rb +18 -0
  21. data/lib/capybara/selector.rb +70 -0
  22. data/lib/capybara/server.rb +90 -0
  23. data/lib/capybara/session.rb +281 -0
  24. data/lib/capybara/spec/driver.rb +243 -0
  25. data/lib/capybara/spec/fixtures/capybara.jpg +0 -0
  26. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  27. data/lib/capybara/spec/public/jquery-ui.js +35 -0
  28. data/lib/capybara/spec/public/jquery.js +19 -0
  29. data/lib/capybara/spec/public/test.js +33 -0
  30. data/lib/capybara/spec/session.rb +110 -0
  31. data/lib/capybara/spec/session/all_spec.rb +78 -0
  32. data/lib/capybara/spec/session/attach_file_spec.rb +70 -0
  33. data/lib/capybara/spec/session/check_spec.rb +65 -0
  34. data/lib/capybara/spec/session/choose_spec.rb +26 -0
  35. data/lib/capybara/spec/session/click_button_spec.rb +252 -0
  36. data/lib/capybara/spec/session/click_link_or_button_spec.rb +36 -0
  37. data/lib/capybara/spec/session/click_link_spec.rb +113 -0
  38. data/lib/capybara/spec/session/current_url_spec.rb +15 -0
  39. data/lib/capybara/spec/session/fill_in_spec.rb +119 -0
  40. data/lib/capybara/spec/session/find_button_spec.rb +18 -0
  41. data/lib/capybara/spec/session/find_by_id_spec.rb +18 -0
  42. data/lib/capybara/spec/session/find_field_spec.rb +26 -0
  43. data/lib/capybara/spec/session/find_link_spec.rb +19 -0
  44. data/lib/capybara/spec/session/find_spec.rb +121 -0
  45. data/lib/capybara/spec/session/first_spec.rb +72 -0
  46. data/lib/capybara/spec/session/has_button_spec.rb +32 -0
  47. data/lib/capybara/spec/session/has_content_spec.rb +106 -0
  48. data/lib/capybara/spec/session/has_css_spec.rb +213 -0
  49. data/lib/capybara/spec/session/has_field_spec.rb +156 -0
  50. data/lib/capybara/spec/session/has_link_spec.rb +37 -0
  51. data/lib/capybara/spec/session/has_select_spec.rb +129 -0
  52. data/lib/capybara/spec/session/has_selector_spec.rb +129 -0
  53. data/lib/capybara/spec/session/has_table_spec.rb +96 -0
  54. data/lib/capybara/spec/session/has_xpath_spec.rb +123 -0
  55. data/lib/capybara/spec/session/headers.rb +19 -0
  56. data/lib/capybara/spec/session/javascript.rb +223 -0
  57. data/lib/capybara/spec/session/response_code.rb +19 -0
  58. data/lib/capybara/spec/session/select_spec.rb +105 -0
  59. data/lib/capybara/spec/session/uncheck_spec.rb +21 -0
  60. data/lib/capybara/spec/session/unselect_spec.rb +61 -0
  61. data/lib/capybara/spec/session/within_spec.rb +160 -0
  62. data/lib/capybara/spec/test_app.rb +117 -0
  63. data/lib/capybara/spec/views/buttons.erb +4 -0
  64. data/lib/capybara/spec/views/fieldsets.erb +29 -0
  65. data/lib/capybara/spec/views/form.erb +348 -0
  66. data/lib/capybara/spec/views/frame_one.erb +8 -0
  67. data/lib/capybara/spec/views/frame_two.erb +8 -0
  68. data/lib/capybara/spec/views/popup_one.erb +8 -0
  69. data/lib/capybara/spec/views/popup_two.erb +8 -0
  70. data/lib/capybara/spec/views/postback.erb +13 -0
  71. data/lib/capybara/spec/views/tables.erb +122 -0
  72. data/lib/capybara/spec/views/with_html.erb +69 -0
  73. data/lib/capybara/spec/views/with_js.erb +39 -0
  74. data/lib/capybara/spec/views/with_scope.erb +36 -0
  75. data/lib/capybara/spec/views/with_simple_html.erb +1 -0
  76. data/lib/capybara/spec/views/within_frames.erb +10 -0
  77. data/lib/capybara/spec/views/within_popups.erb +25 -0
  78. data/lib/capybara/util/save_and_open_page.rb +40 -0
  79. data/lib/capybara/util/timeout.rb +27 -0
  80. data/lib/capybara/version.rb +3 -0
  81. data/spec/basic_node_spec.rb +77 -0
  82. data/spec/capybara_spec.rb +46 -0
  83. data/spec/driver/celerity_driver_spec.rb +13 -0
  84. data/spec/driver/culerity_driver_spec.rb +14 -0
  85. data/spec/driver/rack_test_driver_spec.rb +84 -0
  86. data/spec/driver/remote_culerity_driver_spec.rb +22 -0
  87. data/spec/driver/remote_selenium_driver_spec.rb +16 -0
  88. data/spec/driver/selenium_driver_spec.rb +14 -0
  89. data/spec/dsl_spec.rb +157 -0
  90. data/spec/rspec_spec.rb +47 -0
  91. data/spec/save_and_open_page_spec.rb +159 -0
  92. data/spec/server_spec.rb +85 -0
  93. data/spec/session/celerity_session_spec.rb +24 -0
  94. data/spec/session/culerity_session_spec.rb +26 -0
  95. data/spec/session/rack_test_session_spec.rb +44 -0
  96. data/spec/session/selenium_session_spec.rb +26 -0
  97. data/spec/spec_helper.rb +40 -0
  98. data/spec/string_spec.rb +77 -0
  99. data/spec/timeout_spec.rb +28 -0
  100. metadata +343 -0
@@ -0,0 +1,160 @@
1
+ shared_examples_for "within" do
2
+ describe '#within' do
3
+ before do
4
+ @session.visit('/with_scope')
5
+ end
6
+
7
+ context "with CSS selector" do
8
+ it "should click links in the given scope" do
9
+ @session.within(:css, "ul li[contains('With Simple HTML')]") do
10
+ @session.click_link('Go')
11
+ end
12
+ @session.body.should include('Bar')
13
+ end
14
+
15
+ it "should accept additional options" do
16
+ @session.within(:css, "ul li", :text => 'With Simple HTML') do
17
+ @session.click_link('Go')
18
+ end
19
+ @session.body.should include('Bar')
20
+ end
21
+ end
22
+
23
+ context "with XPath selector" do
24
+ it "should click links in the given scope" do
25
+ @session.within(:xpath, "//li[contains(.,'With Simple HTML')]") do
26
+ @session.click_link('Go')
27
+ end
28
+ @session.body.should include('Bar')
29
+ end
30
+ end
31
+
32
+ context "with the default selector" do
33
+ it "should use XPath" do
34
+ @session.within("//li[contains(., 'With Simple HTML')]") do
35
+ @session.click_link('Go')
36
+ end
37
+ @session.body.should include('Bar')
38
+ end
39
+ end
40
+
41
+ context "with the default selector set to CSS" do
42
+ before { Capybara.default_selector = :css }
43
+ it "should use CSS" do
44
+ @session.within("ul li[contains('With Simple HTML')]") do
45
+ @session.click_link('Go')
46
+ end
47
+ @session.body.should include('Bar')
48
+ end
49
+ after { Capybara.default_selector = :xpath }
50
+ end
51
+
52
+ context "with click_link" do
53
+ it "should click links in the given scope" do
54
+ @session.within("//li[contains(.,'With Simple HTML')]") do
55
+ @session.click_link('Go')
56
+ end
57
+ @session.body.should include('Bar')
58
+ end
59
+
60
+ context "with nested scopes" do
61
+ it "should respect the inner scope" do
62
+ @session.within("//div[@id='for_bar']") do
63
+ @session.within(".//li[contains(.,'Bar')]") do
64
+ @session.click_link('Go')
65
+ end
66
+ end
67
+ @session.body.should include('Another World')
68
+ end
69
+
70
+ it "should respect the outer scope" do
71
+ @session.within("//div[@id='another_foo']") do
72
+ @session.within(".//li[contains(.,'With Simple HTML')]") do
73
+ @session.click_link('Go')
74
+ end
75
+ end
76
+ @session.body.should include('Hello world')
77
+ end
78
+ end
79
+
80
+ it "should raise an error if the scope is not found on the page" do
81
+ running {
82
+ @session.within("//div[@id='doesnotexist']") do
83
+ end
84
+ }.should raise_error(Capybara::ElementNotFound)
85
+ end
86
+
87
+ it "should restore the scope when an error is raised" do
88
+ running {
89
+ @session.within("//div[@id='for_bar']") do
90
+ running {
91
+ running {
92
+ @session.within(".//div[@id='doesnotexist']") do
93
+ end
94
+ }.should raise_error(Capybara::ElementNotFound)
95
+ }.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
96
+ end
97
+ }.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
98
+ end
99
+ end
100
+
101
+ context "with forms" do
102
+ it "should fill in a field and click a button" do
103
+ @session.within("//li[contains(.,'Bar')]") do
104
+ @session.click_button('Go')
105
+ end
106
+ extract_results(@session)['first_name'].should == 'Peter'
107
+ @session.visit('/with_scope')
108
+ @session.within("//li[contains(.,'Bar')]") do
109
+ @session.fill_in('First Name', :with => 'Dagobert')
110
+ @session.click_button('Go')
111
+ end
112
+ extract_results(@session)['first_name'].should == 'Dagobert'
113
+ end
114
+ end
115
+ end
116
+
117
+ describe '#within_fieldset' do
118
+ before do
119
+ @session.visit('/fieldsets')
120
+ end
121
+
122
+ it "should restrict scope to a fieldset given by id" do
123
+ @session.within_fieldset("villain_fieldset") do
124
+ @session.fill_in("Name", :with => 'Goldfinger')
125
+ @session.click_button("Create")
126
+ end
127
+ extract_results(@session)['villain_name'].should == 'Goldfinger'
128
+ end
129
+
130
+ it "should restrict scope to a fieldset given by legend" do
131
+ @session.within_fieldset("Villain") do
132
+ @session.fill_in("Name", :with => 'Goldfinger')
133
+ @session.click_button("Create")
134
+ end
135
+ extract_results(@session)['villain_name'].should == 'Goldfinger'
136
+ end
137
+ end
138
+
139
+ describe '#within_table' do
140
+ before do
141
+ @session.visit('/tables')
142
+ end
143
+
144
+ it "should restrict scope to a fieldset given by id" do
145
+ @session.within_table("girl_table") do
146
+ @session.fill_in("Name", :with => 'Christmas')
147
+ @session.click_button("Create")
148
+ end
149
+ extract_results(@session)['girl_name'].should == 'Christmas'
150
+ end
151
+
152
+ it "should restrict scope to a fieldset given by legend" do
153
+ @session.within_table("Villain") do
154
+ @session.fill_in("Name", :with => 'Quantum')
155
+ @session.click_button("Create")
156
+ end
157
+ extract_results(@session)['villain_name'].should == 'Quantum'
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,117 @@
1
+ require 'sinatra/base'
2
+ require 'rack'
3
+ require 'yaml'
4
+
5
+ class TestApp < Sinatra::Base
6
+ set :root, File.dirname(__FILE__)
7
+ set :static, true
8
+
9
+ get '/' do
10
+ 'Hello world!'
11
+ end
12
+
13
+ get '/foo' do
14
+ 'Another World'
15
+ end
16
+
17
+ get '/redirect' do
18
+ redirect '/redirect_again'
19
+ end
20
+
21
+ get '/redirect_again' do
22
+ redirect '/landed'
23
+ end
24
+
25
+ get '/redirect/:times/times' do
26
+ times = params[:times].to_i
27
+ if times.zero?
28
+ "redirection complete"
29
+ else
30
+ redirect "/redirect/#{times - 1}/times"
31
+ end
32
+ end
33
+
34
+ get '/landed' do
35
+ "You landed"
36
+ end
37
+
38
+ get '/with-quotes' do
39
+ %q{"No," he said, "you can't do that."}
40
+ end
41
+
42
+ get '/form/get' do
43
+ '<pre id="results">' + params[:form].to_yaml + '</pre>'
44
+ end
45
+
46
+ get '/favicon.ico' do
47
+ nil
48
+ end
49
+
50
+ post '/redirect' do
51
+ redirect '/redirect_again'
52
+ end
53
+
54
+ delete "/delete" do
55
+ "The requested object was deleted"
56
+ end
57
+
58
+ get '/redirect_back' do
59
+ redirect back
60
+ end
61
+
62
+ get '/set_cookie' do
63
+ cookie_value = 'test_cookie'
64
+ response.set_cookie('capybara', cookie_value)
65
+ "Cookie set to #{cookie_value}"
66
+ end
67
+
68
+ get '/get_cookie' do
69
+ request.cookies['capybara']
70
+ end
71
+
72
+ get '/get_header' do
73
+ env['HTTP_FOO']
74
+ end
75
+
76
+ get '/:view' do |view|
77
+ erb view.to_sym
78
+ end
79
+
80
+ post '/form' do
81
+ '<pre id="results">' + params[:form].to_yaml + '</pre>'
82
+ end
83
+
84
+ post '/upload_empty' do
85
+ if params[:form][:file].nil?
86
+ 'Successfully ignored empty file field.'
87
+ else
88
+ 'Something went wrong.'
89
+ end
90
+ end
91
+
92
+ post '/upload' do
93
+ begin
94
+ buffer = []
95
+ buffer << "Content-type: #{params[:form][:document][:type]}"
96
+ buffer << "File content: #{params[:form][:document][:tempfile].read}"
97
+ buffer.join(' | ')
98
+ rescue
99
+ 'No file uploaded'
100
+ end
101
+ end
102
+
103
+ post '/upload_multiple' do
104
+ begin
105
+ buffer = []
106
+ buffer << "Content-type: #{params[:form][:multiple_documents][0][:type]}"
107
+ buffer << "File content: #{params[:form][:multiple_documents][0][:tempfile].read}"
108
+ buffer.join(' | ')
109
+ rescue
110
+ 'No files uploaded'
111
+ end
112
+ end
113
+ end
114
+
115
+ if __FILE__ == $0
116
+ Rack::Handler::WEBrick.run TestApp, :Port => 8070
117
+ end
@@ -0,0 +1,4 @@
1
+ <h1>Buttons</h1>
2
+ <button>Click me!</button>
3
+ <button id="click_me_123">Click me by id!</button>
4
+ <button value="click_me">Click me by value!</button>
@@ -0,0 +1,29 @@
1
+ <form action="/form" method="post">
2
+ <fieldset id="agent_fieldset">
3
+ <legend>Agent</legend>
4
+
5
+ <p>
6
+ <label for="form_agent_name">Name</label>
7
+ <input type="text" name="form[agent_name]" value="James" id="form_agent_name"/>
8
+ </p>
9
+
10
+ <p>
11
+ <input type="submit" value="Create"/>
12
+ </p>
13
+ </fieldset>
14
+ </form>
15
+
16
+ <form action="/form" method="post">
17
+ <fieldset id="villain_fieldset">
18
+ <legend>Villain</legend>
19
+
20
+ <p>
21
+ <label for="form_villain_name">Name</label>
22
+ <input type="text" name="form[villain_name]" value="Ernst" id="form_villain_name"/>
23
+ </p>
24
+
25
+ <p>
26
+ <input type="submit" value="Create"/>
27
+ </p>
28
+ </fieldset>
29
+ </form>
@@ -0,0 +1,348 @@
1
+ <h1>Form</h1>
2
+
3
+ <form action="/form" method="post">
4
+
5
+ <p>
6
+ <label for="form_title">Title</label>
7
+ <select name="form[title]" id="form_title">
8
+ <option>Mrs</option>
9
+ <option>Mr</option>
10
+ <option>Miss</option>
11
+ </select>
12
+ </p>
13
+
14
+
15
+ <p>
16
+ <label for="form_other_title">Other title</label>
17
+ <select name="form[other_title]" id="form_other_title">
18
+ <option>Mrs</option>
19
+ <option>Mr</option>
20
+ <option>Miss</option>
21
+ </select>
22
+ </p>
23
+
24
+ <p>
25
+ <label for="form_first_name">
26
+ First Name
27
+ <input type="text" name="form[first_name]" value="John" id="form_first_name"/>
28
+ </label>
29
+ </p>
30
+
31
+ <p>
32
+ <label for="form_last_name">Last Name</label>
33
+ <input type="text" name="form[last_name]" value="Smith" id="form_last_name"/>
34
+ </p>
35
+
36
+ <p>
37
+ <label for="form_name_explanation">Explanation of Name</label>
38
+ <textarea name="form[name_explanation]" id="form_name_explanation"></textarea>
39
+ </p>
40
+
41
+ <p>
42
+ <label for="form_name">Name</label>
43
+ <input type="text" name="form[name]" value="John Smith" id="form_name"/>
44
+ </p>
45
+
46
+ <p>
47
+ <label for="form_schmooo">Schmooo</label>
48
+ <input type="schmooo" name="form[schmooo]" value="This is Schmooo!" id="form_schmooo"/>
49
+ </p>
50
+
51
+ <p>
52
+ <label>Street<br/>
53
+ <input type="text" name="form[street]" value="Sesame street 66"/>
54
+ </label>
55
+ </p>
56
+
57
+ <p>
58
+ <label for="form_phone">Phone</label>
59
+ <input name="form[phone]" value="+1 555 7021" id="form_phone"/>
60
+ </p>
61
+
62
+ <p>
63
+ <label for="form_password">Password</label>
64
+ <input type="password" name="form[password]" value="seeekrit" id="form_password"/>
65
+ </p>
66
+
67
+ <p>
68
+ <label for="form_terms_of_use">Terms of Use</label>
69
+ <input type="hidden" name="form[terms_of_use]" value="0" id="form_terms_of_use_default">
70
+ <input type="checkbox" name="form[terms_of_use]" value="1" id="form_terms_of_use">
71
+ </p>
72
+
73
+ <p>
74
+ <label for="form_image">Image</label>
75
+ <input type="file" name="form[image]" id="form_image"/>
76
+ </p>
77
+
78
+ <p>
79
+ <input type="hidden" name="form[token]" value="12345" id="form_token"/>
80
+ </p>
81
+
82
+ <p>
83
+ <label for="form_locale">Locale</label>
84
+ <select name="form[locale]" id="form_locale">
85
+ <option value="sv">Swedish</option>
86
+ <option selected="selected" value="en">English</option>
87
+ <option value="fi">Finish</option>
88
+ <option value="no">Norwegian</option>
89
+ <option value="jo">John's made-up language</option>
90
+ <option value="jbo"> Lojban </option>
91
+ </select>
92
+ </p>
93
+
94
+ <p>
95
+ <label for="form_region">Region</label>
96
+ <select name="form[region]" id="form_region">
97
+ <option>Sweden</option>
98
+ <option selected="selected">Norway</option>
99
+ <option>Finland</option>
100
+ </select>
101
+ </p>
102
+
103
+ <p>
104
+ <label for="form_city">City</label>
105
+ <select name="form[city]" id="form_city">
106
+ <option>London</option>
107
+ <option>Stockholm</option>
108
+ <option>Paris</option>
109
+ </select>
110
+ </p>
111
+
112
+ <p>
113
+ <label for="form_tendency">Tendency</label>
114
+ <select name="form[tendency]" id="form_tendency"></select>
115
+ </p>
116
+
117
+ <p>
118
+ <label for="form_description">Description</label></br>
119
+ <textarea name="form[description]" id="form_description">Descriptive text goes here</textarea>
120
+ <p>
121
+
122
+ <p>
123
+ <input type="radio" name="form[gender]" value="male" id="gender_male"/>
124
+ <label for="gender_male">Male</label>
125
+ <input type="radio" name="form[gender]" value="female" id="gender_female" checked="checked"/>
126
+ <label for="gender_female">Female</label>
127
+ <input type="radio" name="form[gender]" value="both" id="gender_both"/>
128
+ <label for="gender_both">Both</label>
129
+ </p>
130
+
131
+ <p>
132
+ <input type="checkbox" value="dog" name="form[pets][]" id="form_pets_dog" checked="checked"/>
133
+ <label for="form_pets_dog">Dog</label>
134
+ <input type="checkbox" value="cat" name="form[pets][]" id="form_pets_cat"/>
135
+ <label for="form_pets_cat">Cat</label>
136
+ <input type="checkbox" value="hamster" name="form[pets][]" id="form_pets_hamster" checked="checked"/>
137
+ <label for="form_pets_hamster">Hamster</label>
138
+ </p>
139
+
140
+ <p>
141
+ <label for="form_languages">Languages</label>
142
+ <select name="form[languages][]" id="form_languages" multiple="multiple">
143
+ <option>Ruby</option>
144
+ <option>SQL</option>
145
+ <option>HTML</option>
146
+ <option>Javascript</option>
147
+ </select>
148
+ </p>
149
+
150
+ <p>
151
+ <label for="form_underwear">Underwear</label>
152
+ <select name="form[underwear][]" id="form_underwear" multiple="multiple">
153
+ <option selected="selected">Boxer Briefs</option>
154
+ <option>Boxers</option>
155
+ <option selected="selected">Briefs</option>
156
+ <option selected="selected">Commando</option>
157
+ <option selected="selected">Frenchman's Pantalons</option>
158
+ <option selected="selected" value="thermal">Long Johns</option>
159
+ </select>
160
+ </p>
161
+
162
+ <p>
163
+ <span>First address<span>
164
+ <label for='address1_street'>Street</label>
165
+ <input type="text" name="form[addresses][][street]" value="" id="address1_street">
166
+
167
+ <label for='address1_city'>City</label>
168
+ <input type="text" name="form[addresses][][city]" value="" id="address1_city">
169
+
170
+ <label for='address1_country'>Country</label>
171
+ <select name="form[addresses][][country]" id="address1_country">
172
+ <option>France</option>
173
+ <option>Ukraine</option>
174
+ </select>
175
+ </p>
176
+
177
+ <p>
178
+ <span>Second address<span>
179
+ <label for='address2_street'>Street</label>
180
+ <input type="text" name="form[addresses][][street]" value="" id="address2_street">
181
+
182
+ <label for='address2_city'>City</label>
183
+ <input type="text" name="form[addresses][][city]" value="" id="address2_city">
184
+
185
+ <label for='address2_country'>Country</label>
186
+ <select name="form[addresses][][country]" id="address2_country">
187
+ <option>France</option>
188
+ <option>Ukraine</option>
189
+ </select>
190
+ </p>
191
+
192
+ <div style="display:none;">
193
+ <label for="form_first_name_hidden">
194
+ Super Secret
195
+ <input type="text" name="form[super_secret]" value="test123" id="form_super_secret"/>
196
+ </label>
197
+ </div>
198
+
199
+ <p>
200
+ <label for="form_disabled_text_field">
201
+ Disabled Text Field
202
+ <input type="text" name="form[disabled_text_field]" value="Should not see me" id="form_disabled_text_field" disabled="disabled" />
203
+ </label>
204
+ </p>
205
+
206
+ <p>
207
+ <label for="form_disabled_textarea">
208
+ Disabled Textarea
209
+ <textarea name="form[disabled_textarea]" value="Should not see me" id="form_disabled_textarea" disabled="disabled"></textarea>
210
+ </label>
211
+ </p>
212
+
213
+ <p>
214
+ <label for="form_disabled_checkbox">
215
+ Disabled Checkbox
216
+ <input type="checkbox" name="form[disabled_checkbox]" value="Should not see me" id="form_disabled_checkbox" checked="checked" disabled="disabled" />
217
+ </label>
218
+ </p>
219
+
220
+ <p>
221
+ <label for="form_disabled_radio">
222
+ Disabled Radio
223
+ <input type="radio" name="form[disabled_radio]" value="Should not see me" id="form_disabled_radio" checked="checked" disabled="disabled" />
224
+ </label>
225
+ </p>
226
+
227
+ <p>
228
+ <label for="form_disabled_select">
229
+ Disabled Select
230
+ <select name="form[disabled_select]" id="form_disabled_select" disabled="disabled">
231
+ <option value="Should not see me" selected="selected">Should not see me</option>
232
+ </select>
233
+ </label>
234
+ </p>
235
+
236
+ <p>
237
+ <label for="form_disabled_file">
238
+ Disabled File
239
+ <input type="file" name="form[disabled_file]" value="/should/not/see/me" id="form_disabled_file" disabled="disabled" />
240
+ </label>
241
+ </p>
242
+
243
+ <p>
244
+ <input type="button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
245
+ <input type="submit" name="form[awesome]" id="awe123" value="awesome"/>
246
+ <input type="submit" name="form[crappy]" id="crap321" value="crappy"/>
247
+ <input type="image" name="form[okay]" id="okay556" value="okay" alt="oh hai thar"/>
248
+ <button type="submit" id="click_me_123" value="click_me">Click me!</button>
249
+ <button type="submit" name="form[no_value]">No Value!</button>
250
+ <button id="no_type">No Type!</button>
251
+ </p>
252
+ </form>
253
+
254
+ <form id="get-form" action="/form/get?foo=bar" method="get">
255
+ <p>
256
+ <label for="form_middle_name">Middle Name</label>
257
+ <input type="text" name="form[middle_name]" value="Darren" id="form_middle_name"/>
258
+ </p>
259
+
260
+ <p>
261
+ <input type="submit" name="form[mediocre]" id="mediocre" value="med"/>
262
+ <p>
263
+ </form>
264
+
265
+ <form action="/upload_empty" method="post" enctype="multipart/form-data">
266
+ <p>
267
+ <label for="form_file_name">File Name</label>
268
+ <input type="file" name="form[file]" id="form_file"/>
269
+ </p>
270
+
271
+ <p>
272
+ <input type="submit" value="Upload Empty"/>
273
+ <p>
274
+ </form>
275
+
276
+ <form action="/upload" method="post" enctype="multipart/form-data">
277
+ <p>
278
+ <label for="form_file_name">File Name</label>
279
+ <input type="file" name="form[file_name]" id="form_file_name"/>
280
+ </p>
281
+
282
+ <p>
283
+ <label for="form_document">Document</label>
284
+ <input type="file" name="form[document]" id="form_document"/>
285
+ </p>
286
+
287
+ <p>
288
+ <input type="submit" value="Upload"/>
289
+ <p>
290
+ </form>
291
+
292
+ <form action="/upload_multiple" method="post" enctype="multipart/form-data">
293
+ <p>
294
+ <label for="form_multiple_file_name">File Name</label>
295
+ <input type="file" name="form[multiple_file_name]" id="form_multiple_file_name"/>
296
+ </p>
297
+
298
+ <p>
299
+ <label for="form_multiple_documents">Multiple Documents</label>
300
+ <input type="file" name="form[multiple_documents][]" id="form_multiple_documents" multiple />
301
+ </p>
302
+
303
+ <p>
304
+ <input type="submit" value="Upload Multiple"/>
305
+ <p>
306
+ </form>
307
+
308
+ <form action="/redirect" method="post">
309
+ <p>
310
+ <input type="submit" value="Go FAR"/>
311
+ </p>
312
+ </form>
313
+
314
+ <form action="/form" method="post">
315
+ <p>
316
+ <label for="html5_email">Html5 Email</label>
317
+ <input type="email" name="form[html5_email]" value="person@email.com" id="html5_email"/>
318
+ </p>
319
+ <p>
320
+ <label for="html5_url">Html5 Url</label>
321
+ <input type="url" name="form[html5_url]" value="http://www.example.com" id="html5_url"/>
322
+ </p>
323
+ <p>
324
+ <label for="html5_search">Html5 Search</label>
325
+ <input type="search" name="form[html5_search]" value="what are you looking for" id="html5_search"/>
326
+ </p>
327
+ <p>
328
+ <label for="html5_tel">Html5 Tel</label>
329
+ <input type="tel" name="form[html5_tel]" value="911" id="html5_tel"/>
330
+ </p>
331
+ <p>
332
+ <label for="html5_color">Html5 Color</label>
333
+ <input type="color" name="form[html5_color]" value="#FFF" id="html5_color"/>
334
+ </p>
335
+
336
+ <p>
337
+ <input type="submit" name="form[html5_submit]" value="html5_submit"/>
338
+ </p>
339
+ </form>
340
+
341
+ <form action="/form" method="post">
342
+ <p>
343
+ <button type="submit" name="form[button]" value="button_first">Just an input that came first</button>
344
+ <button type="submit" name="form[button]" value="button_second">Just an input</button>
345
+ <input type="submit" name="form[button]" value="Just a button that came first"/>
346
+ <input type="submit" name="form[button]" value="Just a button"/>
347
+ </p>
348
+ </form>