dstrelau-webrat 0.5.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 (225) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +381 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +181 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat.rb +10 -0
  10. data/lib/webrat/core.rb +14 -0
  11. data/lib/webrat/core/configuration.rb +102 -0
  12. data/lib/webrat/core/elements/area.rb +31 -0
  13. data/lib/webrat/core/elements/element.rb +33 -0
  14. data/lib/webrat/core/elements/field.rb +411 -0
  15. data/lib/webrat/core/elements/form.rb +103 -0
  16. data/lib/webrat/core/elements/label.rb +31 -0
  17. data/lib/webrat/core/elements/link.rb +93 -0
  18. data/lib/webrat/core/elements/select_option.rb +35 -0
  19. data/lib/webrat/core/locators.rb +20 -0
  20. data/lib/webrat/core/locators/area_locator.rb +38 -0
  21. data/lib/webrat/core/locators/button_locator.rb +54 -0
  22. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  23. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  24. data/lib/webrat/core/locators/field_locator.rb +25 -0
  25. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  26. data/lib/webrat/core/locators/form_locator.rb +19 -0
  27. data/lib/webrat/core/locators/label_locator.rb +34 -0
  28. data/lib/webrat/core/locators/link_locator.rb +74 -0
  29. data/lib/webrat/core/locators/locator.rb +20 -0
  30. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  31. data/lib/webrat/core/logging.rb +24 -0
  32. data/lib/webrat/core/matchers.rb +4 -0
  33. data/lib/webrat/core/matchers/have_content.rb +73 -0
  34. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  35. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  36. data/lib/webrat/core/matchers/have_xpath.rb +147 -0
  37. data/lib/webrat/core/methods.rb +63 -0
  38. data/lib/webrat/core/mime.rb +18 -0
  39. data/lib/webrat/core/save_and_open_page.rb +48 -0
  40. data/lib/webrat/core/scope.rb +350 -0
  41. data/lib/webrat/core/session.rb +308 -0
  42. data/lib/webrat/core/xml.rb +115 -0
  43. data/lib/webrat/core/xml/hpricot.rb +19 -0
  44. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  45. data/lib/webrat/core/xml/rexml.rb +24 -0
  46. data/lib/webrat/core_extensions/blank.rb +58 -0
  47. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  48. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  49. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  50. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  51. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  52. data/lib/webrat/culerity.rb +69 -0
  53. data/lib/webrat/culerity/core_ext/button.rb +6 -0
  54. data/lib/webrat/culerity/core_ext/container.rb +13 -0
  55. data/lib/webrat/culerity/core_ext/frame.rb +14 -0
  56. data/lib/webrat/culerity/core_ext/generic_field.rb +21 -0
  57. data/lib/webrat/culerity/core_ext/socket.rb +21 -0
  58. data/lib/webrat/culerity/locator.rb +22 -0
  59. data/lib/webrat/culerity/scope.rb +97 -0
  60. data/lib/webrat/culerity/session.rb +155 -0
  61. data/lib/webrat/mechanize.rb +78 -0
  62. data/lib/webrat/merb.rb +9 -0
  63. data/lib/webrat/merb_adapter.rb +82 -0
  64. data/lib/webrat/merb_multipart_support.rb +27 -0
  65. data/lib/webrat/rack.rb +25 -0
  66. data/lib/webrat/rails.rb +106 -0
  67. data/lib/webrat/rspec-rails.rb +10 -0
  68. data/lib/webrat/selenium.rb +80 -0
  69. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  70. data/lib/webrat/selenium/application_servers.rb +5 -0
  71. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  72. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  73. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  74. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  75. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  76. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  77. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  78. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  79. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  80. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  81. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  82. data/lib/webrat/selenium/matchers.rb +4 -0
  83. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  84. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  85. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  86. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  87. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  88. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  89. data/lib/webrat/selenium/selenium_session.rb +248 -0
  90. data/lib/webrat/selenium/silence_stream.rb +18 -0
  91. data/lib/webrat/sinatra.rb +11 -0
  92. data/spec/fakes/test_adapter.rb +37 -0
  93. data/spec/integration/mechanize/Rakefile +7 -0
  94. data/spec/integration/mechanize/config.ru +2 -0
  95. data/spec/integration/mechanize/sample_app.rb +20 -0
  96. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  97. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  98. data/spec/integration/merb/.gitignore +21 -0
  99. data/spec/integration/merb/Rakefile +35 -0
  100. data/spec/integration/merb/app/controllers/application.rb +2 -0
  101. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  102. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  103. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  104. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  105. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  106. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  107. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  108. data/spec/integration/merb/config/environments/development.rb +15 -0
  109. data/spec/integration/merb/config/environments/rake.rb +11 -0
  110. data/spec/integration/merb/config/environments/test.rb +14 -0
  111. data/spec/integration/merb/config/init.rb +25 -0
  112. data/spec/integration/merb/config/rack.rb +11 -0
  113. data/spec/integration/merb/config/router.rb +34 -0
  114. data/spec/integration/merb/spec/spec.opts +1 -0
  115. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  116. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  117. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  118. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  119. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  120. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  121. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  122. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  123. data/spec/integration/rack/Rakefile +5 -0
  124. data/spec/integration/rack/app.rb +89 -0
  125. data/spec/integration/rack/test/helper.rb +21 -0
  126. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  127. data/spec/integration/rails/.gitignore +3 -0
  128. data/spec/integration/rails/Rakefile +30 -0
  129. data/spec/integration/rails/app/controllers/application.rb +15 -0
  130. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  131. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  132. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  133. data/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  134. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  135. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  136. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  137. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  138. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  139. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  140. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  141. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  142. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  143. data/spec/integration/rails/config/boot.rb +109 -0
  144. data/spec/integration/rails/config/environment.rb +12 -0
  145. data/spec/integration/rails/config/environments/development.rb +17 -0
  146. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  147. data/spec/integration/rails/config/environments/test.rb +22 -0
  148. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  149. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  150. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  151. data/spec/integration/rails/config/locales/en.yml +5 -0
  152. data/spec/integration/rails/config/routes.rb +18 -0
  153. data/spec/integration/rails/public/404.html +30 -0
  154. data/spec/integration/rails/public/422.html +30 -0
  155. data/spec/integration/rails/public/500.html +33 -0
  156. data/spec/integration/rails/script/about +4 -0
  157. data/spec/integration/rails/script/console +3 -0
  158. data/spec/integration/rails/script/dbconsole +3 -0
  159. data/spec/integration/rails/script/destroy +3 -0
  160. data/spec/integration/rails/script/generate +3 -0
  161. data/spec/integration/rails/script/performance/benchmarker +3 -0
  162. data/spec/integration/rails/script/performance/profiler +3 -0
  163. data/spec/integration/rails/script/performance/request +3 -0
  164. data/spec/integration/rails/script/plugin +3 -0
  165. data/spec/integration/rails/script/process/inspector +3 -0
  166. data/spec/integration/rails/script/process/reaper +3 -0
  167. data/spec/integration/rails/script/process/spawner +3 -0
  168. data/spec/integration/rails/script/runner +3 -0
  169. data/spec/integration/rails/script/server +3 -0
  170. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  171. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  172. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  173. data/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  174. data/spec/integration/rails/test/test_helper.rb +26 -0
  175. data/spec/integration/sinatra/Rakefile +5 -0
  176. data/spec/integration/sinatra/classic_app.rb +64 -0
  177. data/spec/integration/sinatra/modular_app.rb +16 -0
  178. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  179. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  180. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  181. data/spec/private/core/configuration_spec.rb +116 -0
  182. data/spec/private/core/field_spec.rb +85 -0
  183. data/spec/private/core/link_spec.rb +24 -0
  184. data/spec/private/core/logging_spec.rb +10 -0
  185. data/spec/private/core/session_spec.rb +200 -0
  186. data/spec/private/mechanize/mechanize_adapter_spec.rb +75 -0
  187. data/spec/private/merb/attaches_file_spec.rb +93 -0
  188. data/spec/private/merb/merb_adapter_spec.rb +61 -0
  189. data/spec/private/nokogiri_spec.rb +77 -0
  190. data/spec/private/rails/attaches_file_spec.rb +81 -0
  191. data/spec/private/rails/rails_adapter_spec.rb +112 -0
  192. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  193. data/spec/public/basic_auth_spec.rb +24 -0
  194. data/spec/public/check_spec.rb +191 -0
  195. data/spec/public/choose_spec.rb +118 -0
  196. data/spec/public/click_area_spec.rb +106 -0
  197. data/spec/public/click_button_spec.rb +496 -0
  198. data/spec/public/click_link_spec.rb +511 -0
  199. data/spec/public/fill_in_spec.rb +209 -0
  200. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  201. data/spec/public/locators/field_labeled_spec.rb +172 -0
  202. data/spec/public/locators/field_with_id_spec.rb +16 -0
  203. data/spec/public/matchers/contain_spec.rb +114 -0
  204. data/spec/public/matchers/have_selector_spec.rb +142 -0
  205. data/spec/public/matchers/have_tag_spec.rb +39 -0
  206. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  207. data/spec/public/reload_spec.rb +10 -0
  208. data/spec/public/save_and_open_spec.rb +70 -0
  209. data/spec/public/select_date_spec.rb +112 -0
  210. data/spec/public/select_datetime_spec.rb +137 -0
  211. data/spec/public/select_spec.rb +249 -0
  212. data/spec/public/select_time_spec.rb +100 -0
  213. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  214. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  215. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  216. data/spec/public/set_hidden_field_spec.rb +5 -0
  217. data/spec/public/submit_form_spec.rb +5 -0
  218. data/spec/public/visit_spec.rb +58 -0
  219. data/spec/public/within_spec.rb +177 -0
  220. data/spec/rcov.opts +1 -0
  221. data/spec/spec.opts +2 -0
  222. data/spec/spec_helper.rb +52 -0
  223. data/vendor/selenium-server.jar +0 -0
  224. data/webrat.gemspec +365 -0
  225. metadata +387 -0
data/Rakefile ADDED
@@ -0,0 +1,181 @@
1
+ begin
2
+ require 'jeweler'
3
+
4
+ Jeweler::Tasks.new do |s|
5
+ s.name = "webrat"
6
+ s.author = "Bryan Helmkamp"
7
+ s.email = "bryan" + "@" + "brynary.com"
8
+ s.homepage = "http://github.com/brynary/webrat"
9
+ s.summary = "Ruby Acceptance Testing for Web applications"
10
+ s.description = <<-EOS.strip
11
+ Webrat lets you quickly write expressive and robust acceptance tests
12
+ for a Ruby web application. It supports simulating a browser inside
13
+ a Ruby process to avoid the performance hit and browser dependency of
14
+ Selenium or Watir, but the same API can also be used to drive real
15
+ Selenium tests when necessary (eg. for testing AJAX interactions).
16
+ Most Ruby web frameworks and testing frameworks are supported.
17
+ EOS
18
+
19
+ s.rubyforge_project = "webrat"
20
+ s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
21
+
22
+ # Dependencies
23
+ s.add_dependency "nokogiri", ">= 1.2.0"
24
+ s.add_dependency "rack", ">= 1.0"
25
+
26
+ # TODO: Add development dependencies
27
+ end
28
+
29
+ Jeweler::RubyforgeTasks.new
30
+ rescue LoadError
31
+ puts "Jeweler not available. Install it with: gem install jeweler"
32
+ end
33
+
34
+ # require 'spec'
35
+ require 'spec/rake/spectask'
36
+ require 'spec/rake/verify_rcov'
37
+
38
+ desc "Run API and Core specs"
39
+ Spec::Rake::SpecTask.new do |t|
40
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
41
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
42
+ end
43
+
44
+ desc "Run all specs in spec directory with RCov"
45
+ Spec::Rake::SpecTask.new(:rcov) do |t|
46
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
47
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
48
+ t.rcov = true
49
+ t.rcov_opts = lambda do
50
+ IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
51
+ end
52
+ end
53
+
54
+ RCov::VerifyTask.new(:verify_rcov => :rcov) do |t|
55
+ t.threshold = 96.2 # Make sure you have rcov 0.7 or higher!
56
+ end
57
+
58
+ desc "Run everything against multiruby"
59
+ task :multiruby do
60
+ result = system "multiruby -S rake spec"
61
+ raise "Multiruby tests failed" unless result
62
+ result = system "jruby -S rake spec"
63
+ raise "JRuby tests failed" unless result
64
+
65
+ Dir.chdir "spec/integration/rails" do
66
+ result = system "multiruby -S rake test_unit:rails"
67
+ raise "Rails integration tests failed" unless result
68
+
69
+ result = system "jruby -S rake test_unit:rails"
70
+ raise "Rails integration tests failed" unless result
71
+ end
72
+
73
+ Dir.chdir "spec/integration/merb" do
74
+ result = system "multiruby -S rake spec"
75
+ raise "Merb integration tests failed" unless result
76
+
77
+ result = system "jruby -S rake spec"
78
+ raise "Rails integration tests failed" unless result
79
+ end
80
+
81
+ Dir.chdir "spec/integration/sinatra" do
82
+ result = system "multiruby -S rake test"
83
+ raise "Sinatra integration tests failed" unless result
84
+
85
+ result = system "jruby -S rake test"
86
+ raise "Sinatra integration tests failed" unless result
87
+ end
88
+
89
+ Dir.chdir "spec/integration/rack" do
90
+ result = system "multiruby -S rake test"
91
+ raise "Rack integration tests failed" unless result
92
+
93
+ result = system "jruby -S rake test"
94
+ raise "Rack integration tests failed" unless result
95
+ end
96
+
97
+ puts
98
+ puts "Multiruby OK!"
99
+ end
100
+
101
+ desc "Run each spec in isolation to test for dependency issues"
102
+ task :spec_deps do
103
+ Dir["spec/**/*_spec.rb"].each do |test|
104
+ if !system("spec #{test} &> /dev/null")
105
+ puts "Dependency Issues: #{test}"
106
+ end
107
+ end
108
+ end
109
+
110
+ task :prepare do
111
+ system "ln -s ../../../../.. ./spec/integration/rails/vendor/plugins/webrat"
112
+ end
113
+
114
+ namespace :spec do
115
+ desc "Run the integration specs"
116
+ task :integration => ["integration:rails", "integration:merb", "integration:sinatra", "integration:rack", "integration:mechanize"]
117
+
118
+ namespace :integration do
119
+ desc "Run the Rails integration specs"
120
+ task :rails => ['rails:webrat'] #,'rails:selenium'] currently not running selenium as it doesn't pass.
121
+
122
+ namespace :rails do
123
+ task :selenium do
124
+ Dir.chdir "spec/integration/rails" do
125
+ result = system "rake test_unit:selenium"
126
+ raise "Rails integration tests failed" unless result
127
+ end
128
+ end
129
+
130
+ task :webrat do
131
+ Dir.chdir "spec/integration/rails" do
132
+ result = system "rake test_unit:rails"
133
+ raise "Rails integration tests failed" unless result
134
+ end
135
+ end
136
+ end
137
+
138
+ desc "Run the Merb integration specs"
139
+ task :merb do
140
+ Dir.chdir "spec/integration/merb" do
141
+ result = system "rake spec"
142
+ raise "Merb integration tests failed" unless result
143
+ end
144
+ end
145
+
146
+ desc "Run the Sinatra integration specs"
147
+ task :sinatra do
148
+ Dir.chdir "spec/integration/sinatra" do
149
+ result = system "rake test"
150
+ raise "Sinatra integration tests failed" unless result
151
+ end
152
+ end
153
+
154
+ desc "Run the Sinatra integration specs"
155
+ task :rack do
156
+ Dir.chdir "spec/integration/rack" do
157
+ result = system "rake test"
158
+ raise "Rack integration tests failed" unless result
159
+ end
160
+ end
161
+
162
+ desc "Run the Mechanize integration specs"
163
+ task :mechanize do
164
+ Dir.chdir "spec/integration/mechanize" do
165
+ result = system "rake spec"
166
+ raise "Mechanize integration tests failed" unless result
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ desc 'Removes trailing whitespace'
173
+ task :whitespace do
174
+ sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
175
+ end
176
+
177
+ if defined?(Jeweler)
178
+ task :spec => :check_dependencies
179
+ end
180
+
181
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.5.1
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
data/lib/webrat.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Webrat
2
+ # The common base class for all exceptions raised by Webrat.
3
+ class WebratError < StandardError
4
+ end
5
+ end
6
+
7
+ require "rack"
8
+ require "nokogiri"
9
+ require "webrat/core/xml/nokogiri"
10
+ require "webrat/core"
@@ -0,0 +1,14 @@
1
+ require "webrat/core/configuration"
2
+ require "webrat/core/xml"
3
+ require "webrat/core/xml/nokogiri"
4
+ require "webrat/core/logging"
5
+ require "webrat/core/elements/form"
6
+ require "webrat/core/scope"
7
+ require "webrat/core/elements/link"
8
+ require "webrat/core/elements/area"
9
+ require "webrat/core/elements/label"
10
+ require "webrat/core/elements/select_option"
11
+ require "webrat/core/session"
12
+ require "webrat/core/methods"
13
+ require "webrat/core/matchers"
14
+ require "webrat/core/save_and_open_page"
@@ -0,0 +1,102 @@
1
+ require "webrat/core_extensions/deprecate"
2
+
3
+ module Webrat
4
+
5
+ # Configures Webrat. If this is not done, Webrat will be created
6
+ # with all of the default settings.
7
+ def self.configure(configuration = Webrat.configuration)
8
+ yield configuration if block_given?
9
+ @@configuration = configuration
10
+ end
11
+
12
+ def self.configuration # :nodoc:
13
+ @@configuration ||= Webrat::Configuration.new
14
+ end
15
+
16
+ # Webrat can be configured using the Webrat.configure method. For example:
17
+ #
18
+ # Webrat.configure do |config|
19
+ # config.parse_with_nokogiri = false
20
+ # end
21
+ class Configuration
22
+
23
+ # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used
24
+ attr_writer :parse_with_nokogiri
25
+
26
+ # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
27
+ attr_reader :mode # :nodoc:
28
+
29
+ # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
30
+ attr_writer :open_error_files
31
+
32
+ # Which rails environment should the selenium tests be run in? Defaults to selenium.
33
+ attr_accessor :application_environment
34
+ webrat_deprecate :selenium_environment, :application_environment
35
+ webrat_deprecate :selenium_environment=, :application_environment=
36
+
37
+ # Which port is the application running on for selenium testing? Defaults to 3001.
38
+ attr_accessor :application_port
39
+ webrat_deprecate :selenium_port, :application_port
40
+ webrat_deprecate :selenium_port=, :application_port=
41
+
42
+ # Which underlying app framework we're testing with selenium
43
+ attr_accessor :application_framework
44
+
45
+ # Which server the application is running on for selenium testing? Defaults to localhost
46
+ attr_accessor :application_address
47
+
48
+ # Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally)
49
+ attr_accessor :selenium_server_address
50
+
51
+ # Which server Selenium port is running on. Defaults to 4444
52
+ attr_accessor :selenium_server_port
53
+
54
+ # Set the key that Selenium uses to determine the browser running. Default *firefox
55
+ attr_accessor :selenium_browser_key
56
+
57
+ # Set the timeout for waiting for the browser process to start
58
+ attr_accessor :selenium_browser_startup_timeout
59
+
60
+ # How many redirects to the same URL should be halted as an infinite redirect
61
+ # loop? Defaults to 10
62
+ attr_accessor :infinite_redirect_limit
63
+
64
+ def initialize # :nodoc:
65
+ self.open_error_files = true
66
+ self.parse_with_nokogiri = true
67
+ self.application_environment = :test
68
+ self.application_port = 3001
69
+ self.application_address = 'localhost'
70
+ self.application_framework = :rails
71
+ self.selenium_server_port = 4444
72
+ self.infinite_redirect_limit = 10
73
+ self.selenium_browser_key = '*firefox'
74
+ self.selenium_browser_startup_timeout = 5
75
+ end
76
+
77
+ def parse_with_nokogiri? #:nodoc:
78
+ @parse_with_nokogiri ? true : false
79
+ end
80
+
81
+ def open_error_files? #:nodoc:
82
+ @open_error_files ? true : false
83
+ end
84
+
85
+ # Allows setting of webrat's mode, valid modes are:
86
+ # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
87
+ def mode=(mode)
88
+ @mode = mode.to_sym
89
+
90
+ # This is a temporary hack to support backwards compatibility
91
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
92
+ # syntax
93
+ if @mode == :merb
94
+ require("webrat/merb_adapter")
95
+ else
96
+ require("webrat/#{mode}")
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,31 @@
1
+ require "webrat/core/elements/element"
2
+
3
+ module Webrat
4
+ class Area < Element #:nodoc:
5
+
6
+ def self.xpath_search
7
+ ".//area"
8
+ end
9
+
10
+ def click(method = nil, options = {})
11
+ @session.request_page(absolute_href, :get, {})
12
+ end
13
+
14
+ protected
15
+
16
+ def href
17
+ Webrat::XML.attribute(@element, "href")
18
+ end
19
+
20
+ def absolute_href
21
+ if href =~ /^\?/
22
+ "#{@session.current_url}#{href}"
23
+ elsif href !~ %r{^https?://[\w|.]+(/.*)} && (href !~ /^\//)
24
+ "#{@session.current_url}/#{href}"
25
+ else
26
+ href
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ module Webrat
2
+
3
+ class Element # :nodoc:
4
+
5
+ def self.load_all(session, dom)
6
+ Webrat::XML.xpath_search(dom, xpath_search).map do |element|
7
+ load(session, element)
8
+ end
9
+ end
10
+
11
+ def self.load(session, element)
12
+ return nil if element.nil?
13
+ session.elements[Webrat::XML.xpath_to(element)] ||= self.new(session, element)
14
+ end
15
+
16
+ attr_reader :element
17
+
18
+ def initialize(session, element)
19
+ @session = session
20
+ @element = element
21
+ end
22
+
23
+ def path
24
+ Webrat::XML.xpath_to(@element)
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class} @element=#{element.inspect}>"
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,411 @@
1
+ require "cgi"
2
+ require "webrat/core_extensions/blank"
3
+ require "webrat/core_extensions/nil_to_param"
4
+
5
+ require "webrat/core/elements/element"
6
+
7
+ module Webrat
8
+ # Raised when Webrat is asked to manipulate a disabled form field
9
+ class DisabledFieldError < WebratError
10
+ end
11
+
12
+ class Field < Element #:nodoc:
13
+ attr_reader :value
14
+
15
+ def self.xpath_search
16
+ [".//button", ".//input", ".//textarea", ".//select"]
17
+ end
18
+
19
+ def self.xpath_search_excluding_hidden
20
+ [".//button", ".//input[ @type != 'hidden']", ".//textarea", ".//select"]
21
+ end
22
+
23
+ def self.field_classes
24
+ @field_classes || []
25
+ end
26
+
27
+ def self.inherited(klass)
28
+ @field_classes ||= []
29
+ @field_classes << klass
30
+ # raise args.inspect
31
+ end
32
+
33
+ def self.load(session, element)
34
+ return nil if element.nil?
35
+ session.elements[Webrat::XML.xpath_to(element)] ||= field_class(element).new(session, element)
36
+ end
37
+
38
+ def self.field_class(element)
39
+ case element.name
40
+ when "button" then ButtonField
41
+ when "select" then SelectField
42
+ when "textarea" then TextareaField
43
+ else
44
+ case Webrat::XML.attribute(element, "type")
45
+ when "checkbox" then CheckboxField
46
+ when "hidden" then HiddenField
47
+ when "radio" then RadioField
48
+ when "password" then PasswordField
49
+ when "file" then FileField
50
+ when "reset" then ResetField
51
+ when "submit" then ButtonField
52
+ when "button" then ButtonField
53
+ when "image" then ButtonField
54
+ else TextField
55
+ end
56
+ end
57
+ end
58
+
59
+ def initialize(*args)
60
+ super
61
+ @value = default_value
62
+ end
63
+
64
+ def label_text
65
+ return nil if labels.empty?
66
+ labels.first.text
67
+ end
68
+
69
+ def id
70
+ Webrat::XML.attribute(@element, "id")
71
+ end
72
+
73
+ def disabled?
74
+ @element.attributes.has_key?("disabled") && Webrat::XML.attribute(@element, "disabled") != 'false'
75
+ end
76
+
77
+ def raise_error_if_disabled
78
+ return unless disabled?
79
+ raise DisabledFieldError.new("Cannot interact with disabled form element (#{self})")
80
+ end
81
+
82
+ def to_param
83
+ return nil if disabled?
84
+
85
+ case Webrat.configuration.mode
86
+ when :rails
87
+ parse_rails_request_params("#{name}=#{escaped_value}")
88
+ when :merb
89
+ ::Merb::Parse.query("#{name}=#{escaped_value}")
90
+ else
91
+ { name => value }
92
+ end
93
+ end
94
+
95
+ def set(value)
96
+ @value = value
97
+ end
98
+
99
+ def unset
100
+ @value = default_value
101
+ end
102
+
103
+ protected
104
+
105
+ def parse_rails_request_params(params)
106
+ if defined?(ActionController::AbstractRequest)
107
+ ActionController::AbstractRequest.parse_query_parameters(params)
108
+ elsif defined?(ActionController::UrlEncodedPairParser)
109
+ # For Rails > 2.2
110
+ ActionController::UrlEncodedPairParser.parse_query_parameters(params)
111
+ else
112
+ # For Rails > 2.3
113
+ Rack::Utils.parse_nested_query(params)
114
+ end
115
+ end
116
+
117
+ def form
118
+ Form.load(@session, form_element)
119
+ end
120
+
121
+ def form_element
122
+ parent = @element.parent
123
+
124
+ while parent.respond_to?(:parent)
125
+ return parent if parent.name == 'form'
126
+ parent = parent.parent
127
+ end
128
+ end
129
+
130
+ def name
131
+ Webrat::XML.attribute(@element, "name")
132
+ end
133
+
134
+ def escaped_value
135
+ CGI.escape([*@value].first.to_s)
136
+ end
137
+
138
+ def labels
139
+ @labels ||= label_elements.map do |element|
140
+ Label.load(@session, element)
141
+ end
142
+ end
143
+
144
+ def label_elements
145
+ return @label_elements unless @label_elements.nil?
146
+ @label_elements = []
147
+
148
+ parent = @element.parent
149
+ while parent.respond_to?(:parent)
150
+ if parent.name == 'label'
151
+ @label_elements.push parent
152
+ break
153
+ end
154
+ parent = parent.parent
155
+ end
156
+
157
+ unless id.blank?
158
+ @label_elements += Webrat::XML.xpath_search(form.element, ".//label[@for = '#{id}']")
159
+ end
160
+
161
+ @label_elements
162
+ end
163
+
164
+ def default_value
165
+ Webrat::XML.attribute(@element, "value")
166
+ end
167
+
168
+ def replace_param_value(params, oval, nval)
169
+ output = Hash.new
170
+ params.each do |key, value|
171
+ case value
172
+ when Hash
173
+ value = replace_param_value(value, oval, nval)
174
+ when Array
175
+ value = value.map { |o| o == oval ? nval : oval }
176
+ when oval
177
+ value = nval
178
+ end
179
+ output[key] = value
180
+ end
181
+ output
182
+ end
183
+ end
184
+
185
+ class ButtonField < Field #:nodoc:
186
+
187
+ def self.xpath_search
188
+ [".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
189
+ end
190
+
191
+ def to_param
192
+ return nil if @value.nil?
193
+ super
194
+ end
195
+
196
+ def default_value
197
+ nil
198
+ end
199
+
200
+ def click
201
+ raise_error_if_disabled
202
+ set(Webrat::XML.attribute(@element, "value")) unless Webrat::XML.attribute(@element, "name").blank?
203
+ form.submit
204
+ end
205
+
206
+ end
207
+
208
+ class HiddenField < Field #:nodoc:
209
+
210
+ def self.xpath_search
211
+ ".//input[@type = 'hidden']"
212
+ end
213
+
214
+ def to_param
215
+ if collection_name?
216
+ super
217
+ else
218
+ checkbox_with_same_name = form.field_named(name, CheckboxField)
219
+
220
+ if checkbox_with_same_name.to_param.blank?
221
+ super
222
+ else
223
+ nil
224
+ end
225
+ end
226
+ end
227
+
228
+ protected
229
+
230
+ def collection_name?
231
+ name =~ /\[\]/
232
+ end
233
+
234
+ end
235
+
236
+ class CheckboxField < Field #:nodoc:
237
+
238
+ def self.xpath_search
239
+ ".//input[@type = 'checkbox']"
240
+ end
241
+
242
+ def to_param
243
+ return nil if @value.nil?
244
+ super
245
+ end
246
+
247
+ def check
248
+ raise_error_if_disabled
249
+ set(Webrat::XML.attribute(@element, "value") || "on")
250
+ end
251
+
252
+ def checked?
253
+ Webrat::XML.attribute(@element, "checked") == "checked"
254
+ end
255
+
256
+ def uncheck
257
+ raise_error_if_disabled
258
+ set(nil)
259
+ end
260
+
261
+ protected
262
+
263
+ def default_value
264
+ if Webrat::XML.attribute(@element, "checked") == "checked"
265
+ Webrat::XML.attribute(@element, "value") || "on"
266
+ else
267
+ nil
268
+ end
269
+ end
270
+
271
+ end
272
+
273
+ class PasswordField < Field #:nodoc:
274
+
275
+ def self.xpath_search
276
+ ".//input[@type = 'password']"
277
+ end
278
+
279
+ end
280
+
281
+ class RadioField < Field #:nodoc:
282
+
283
+ def self.xpath_search
284
+ ".//input[@type = 'radio']"
285
+ end
286
+
287
+ def to_param
288
+ return nil if @value.nil?
289
+ super
290
+ end
291
+
292
+ def choose
293
+ raise_error_if_disabled
294
+ other_options.each do |option|
295
+ option.set(nil)
296
+ end
297
+
298
+ set(Webrat::XML.attribute(@element, "value") || "on")
299
+ end
300
+
301
+ def checked?
302
+ Webrat::XML.attribute(@element, "checked") == "checked"
303
+ end
304
+
305
+ protected
306
+
307
+ def other_options
308
+ form.fields.select { |f| f.name == name }
309
+ end
310
+
311
+ def default_value
312
+ if Webrat::XML.attribute(@element, "checked") == "checked"
313
+ Webrat::XML.attribute(@element, "value") || "on"
314
+ else
315
+ nil
316
+ end
317
+ end
318
+
319
+ end
320
+
321
+ class TextareaField < Field #:nodoc:
322
+
323
+ def self.xpath_search
324
+ ".//textarea"
325
+ end
326
+
327
+ protected
328
+
329
+ def default_value
330
+ Webrat::XML.inner_html(@element)
331
+ end
332
+
333
+ end
334
+
335
+ class FileField < Field #:nodoc:
336
+
337
+ def self.xpath_search
338
+ ".//input[@type = 'file']"
339
+ end
340
+
341
+ attr_accessor :content_type
342
+
343
+ def set(value, content_type = nil)
344
+ super(value)
345
+ @content_type = content_type
346
+ end
347
+
348
+ def to_param
349
+ if @value.nil?
350
+ super
351
+ else
352
+ replace_param_value(super, @value, test_uploaded_file)
353
+ end
354
+ end
355
+
356
+ protected
357
+
358
+ def test_uploaded_file
359
+ case Webrat.configuration.mode
360
+ when :rails
361
+ if content_type
362
+ ActionController::TestUploadedFile.new(@value, content_type)
363
+ else
364
+ ActionController::TestUploadedFile.new(@value)
365
+ end
366
+ when :merb
367
+ # TODO: support content_type
368
+ File.new(@value)
369
+ when :rack
370
+ Rack::Test::UploadedFile.new(@value, content_type)
371
+ end
372
+ end
373
+
374
+ end
375
+
376
+ class TextField < Field #:nodoc:
377
+ def self.xpath_search
378
+ [".//input[@type = 'text']", ".//input[not(@type)]"]
379
+ end
380
+ end
381
+
382
+ class ResetField < Field #:nodoc:
383
+ def self.xpath_search
384
+ ".//input[@type = 'reset']"
385
+ end
386
+ end
387
+
388
+ class SelectField < Field #:nodoc:
389
+
390
+ def self.xpath_search
391
+ ".//select"
392
+ end
393
+
394
+ def options
395
+ @options ||= SelectOption.load_all(@session, @element)
396
+ end
397
+
398
+ protected
399
+
400
+ def default_value
401
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[@selected = 'selected']")
402
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
403
+
404
+ selected_options.map do |option|
405
+ return "" if option.nil?
406
+ Webrat::XML.attribute(option, "value") || Webrat::XML.inner_html(option)
407
+ end.uniq
408
+ end
409
+
410
+ end
411
+ end