indirect-webrat 0.7.4

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 (218) hide show
  1. data/.document +4 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +14 -0
  4. data/History.txt +470 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +143 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +94 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +30 -0
  14. data/lib/webrat/adapters/rails.rb +77 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +114 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +438 -0
  21. data/lib/webrat/core/elements/form.rb +127 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +82 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +85 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +124 -0
  43. data/lib/webrat/core/methods.rb +73 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +362 -0
  47. data/lib/webrat/core/session.rb +318 -0
  48. data/lib/webrat/core/xml.rb +44 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_query_string.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rack.rb +9 -0
  57. data/lib/webrat/integrations/rails.rb +25 -0
  58. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  59. data/lib/webrat/integrations/selenium.rb +11 -0
  60. data/lib/webrat/merb.rb +9 -0
  61. data/lib/webrat/rspec-rails.rb +2 -0
  62. data/lib/webrat/selenium.rb +70 -0
  63. data/lib/webrat/selenium/application_server_factory.rb +43 -0
  64. data/lib/webrat/selenium/application_servers.rb +5 -0
  65. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  66. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  67. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  68. data/lib/webrat/selenium/application_servers/rack.rb +51 -0
  69. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  70. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  75. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  76. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  77. data/lib/webrat/selenium/matchers.rb +4 -0
  78. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  79. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  80. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  81. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  82. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  83. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  84. data/lib/webrat/selenium/selenium_session.rb +276 -0
  85. data/lib/webrat/selenium/silence_stream.rb +18 -0
  86. data/spec/fakes/test_adapter.rb +33 -0
  87. data/spec/integration/mechanize/Rakefile +7 -0
  88. data/spec/integration/mechanize/config.ru +2 -0
  89. data/spec/integration/mechanize/sample_app.rb +35 -0
  90. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  91. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  92. data/spec/integration/merb/.gitignore +21 -0
  93. data/spec/integration/merb/Rakefile +35 -0
  94. data/spec/integration/merb/app/controllers/application.rb +2 -0
  95. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  96. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  97. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  98. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  99. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  100. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  101. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  102. data/spec/integration/merb/config/environments/development.rb +15 -0
  103. data/spec/integration/merb/config/environments/rake.rb +11 -0
  104. data/spec/integration/merb/config/environments/test.rb +14 -0
  105. data/spec/integration/merb/config/init.rb +25 -0
  106. data/spec/integration/merb/config/rack.rb +11 -0
  107. data/spec/integration/merb/config/router.rb +34 -0
  108. data/spec/integration/merb/spec/spec.opts +1 -0
  109. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  110. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  111. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  112. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  113. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  114. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  115. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  116. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  117. data/spec/integration/rack/Rakefile +5 -0
  118. data/spec/integration/rack/app.rb +89 -0
  119. data/spec/integration/rack/test/helper.rb +20 -0
  120. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  121. data/spec/integration/rails/.gitignore +3 -0
  122. data/spec/integration/rails/Rakefile +30 -0
  123. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  124. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  126. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  127. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  128. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  129. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  130. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  131. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  132. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  133. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  134. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  135. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  136. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  137. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  138. data/spec/integration/rails/config/boot.rb +109 -0
  139. data/spec/integration/rails/config/environment.rb +12 -0
  140. data/spec/integration/rails/config/environments/development.rb +17 -0
  141. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  142. data/spec/integration/rails/config/environments/test.rb +22 -0
  143. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  144. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  145. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  146. data/spec/integration/rails/config/locales/en.yml +5 -0
  147. data/spec/integration/rails/config/routes.rb +19 -0
  148. data/spec/integration/rails/public/404.html +30 -0
  149. data/spec/integration/rails/public/422.html +30 -0
  150. data/spec/integration/rails/public/500.html +33 -0
  151. data/spec/integration/rails/script/about +4 -0
  152. data/spec/integration/rails/script/console +3 -0
  153. data/spec/integration/rails/script/dbconsole +3 -0
  154. data/spec/integration/rails/script/destroy +3 -0
  155. data/spec/integration/rails/script/generate +3 -0
  156. data/spec/integration/rails/script/performance/benchmarker +3 -0
  157. data/spec/integration/rails/script/performance/profiler +3 -0
  158. data/spec/integration/rails/script/performance/request +3 -0
  159. data/spec/integration/rails/script/plugin +3 -0
  160. data/spec/integration/rails/script/process/inspector +3 -0
  161. data/spec/integration/rails/script/process/reaper +3 -0
  162. data/spec/integration/rails/script/process/spawner +3 -0
  163. data/spec/integration/rails/script/runner +3 -0
  164. data/spec/integration/rails/script/server +3 -0
  165. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  166. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  167. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  168. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  169. data/spec/integration/rails/test/test_helper.rb +27 -0
  170. data/spec/integration/sinatra/Rakefile +5 -0
  171. data/spec/integration/sinatra/classic_app.rb +63 -0
  172. data/spec/integration/sinatra/modular_app.rb +15 -0
  173. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  174. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  175. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  176. data/spec/private/core/configuration_spec.rb +87 -0
  177. data/spec/private/core/field_spec.rb +83 -0
  178. data/spec/private/core/form_spec.rb +51 -0
  179. data/spec/private/core/link_spec.rb +24 -0
  180. data/spec/private/core/session_spec.rb +182 -0
  181. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  182. data/spec/private/nokogiri_spec.rb +77 -0
  183. data/spec/private/rails/attaches_file_spec.rb +114 -0
  184. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  185. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  186. data/spec/public/basic_auth_spec.rb +35 -0
  187. data/spec/public/check_spec.rb +191 -0
  188. data/spec/public/choose_spec.rb +118 -0
  189. data/spec/public/click_area_spec.rb +106 -0
  190. data/spec/public/click_button_spec.rb +494 -0
  191. data/spec/public/click_link_spec.rb +544 -0
  192. data/spec/public/fill_in_spec.rb +224 -0
  193. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  194. data/spec/public/locators/field_labeled_spec.rb +172 -0
  195. data/spec/public/locators/field_with_id_spec.rb +16 -0
  196. data/spec/public/matchers/contain_spec.rb +118 -0
  197. data/spec/public/matchers/have_selector_spec.rb +146 -0
  198. data/spec/public/matchers/have_tag_spec.rb +39 -0
  199. data/spec/public/matchers/have_xpath_spec.rb +165 -0
  200. data/spec/public/reload_spec.rb +10 -0
  201. data/spec/public/save_and_open_spec.rb +49 -0
  202. data/spec/public/select_date_spec.rb +112 -0
  203. data/spec/public/select_datetime_spec.rb +137 -0
  204. data/spec/public/select_spec.rb +474 -0
  205. data/spec/public/select_time_spec.rb +100 -0
  206. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  207. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  208. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  209. data/spec/public/set_hidden_field_spec.rb +5 -0
  210. data/spec/public/submit_form_spec.rb +56 -0
  211. data/spec/public/visit_spec.rb +58 -0
  212. data/spec/public/within_spec.rb +177 -0
  213. data/spec/rcov.opts +1 -0
  214. data/spec/spec.opts +2 -0
  215. data/spec/spec_helper.rb +53 -0
  216. data/vendor/selenium-server.jar +0 -0
  217. data/webrat.gemspec +355 -0
  218. metadata +424 -0
@@ -0,0 +1,89 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class SeleniumRCServer
5
+
6
+ include Webrat::Selenium::SilenceStream
7
+
8
+ def self.boot
9
+ new.boot
10
+ end
11
+
12
+ def boot
13
+ return if selenium_grid?
14
+
15
+ start
16
+ wait
17
+ stop_at_exit
18
+ end
19
+
20
+ def start
21
+ silence_stream(STDOUT) do
22
+ remote_control.start :background => true
23
+ end
24
+ end
25
+
26
+ def stop_at_exit
27
+ at_exit do
28
+ stop
29
+ end
30
+ end
31
+
32
+ def remote_control
33
+ return @remote_control if @remote_control
34
+ server_options = { :timeout => Webrat.configuration.selenium_browser_startup_timeout }
35
+ server_options[:firefox_profile] = Webrat.configuration.selenium_firefox_profile if Webrat.configuration.selenium_firefox_profile
36
+
37
+ @remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
38
+ Webrat.configuration.selenium_server_port,
39
+ server_options)
40
+
41
+ @remote_control.jar_file = jar_path
42
+
43
+ return @remote_control
44
+ end
45
+
46
+ def jar_path
47
+ File.expand_path(__FILE__ + "../../../../../vendor/selenium-server.jar")
48
+ end
49
+
50
+ def selenium_grid?
51
+ Webrat.configuration.selenium_server_address
52
+ end
53
+
54
+ def wait
55
+ $stderr.print "==> Waiting for Selenium RC server on port #{Webrat.configuration.selenium_server_port}... "
56
+ wait_for_socket
57
+ $stderr.print "Ready!\n"
58
+ rescue SocketError
59
+ fail
60
+ end
61
+
62
+ def wait_for_socket
63
+ silence_stream(STDOUT) do
64
+ TCPSocket.wait_for_service_with_timeout \
65
+ :host => (Webrat.configuration.selenium_server_address || "0.0.0.0"),
66
+ :port => Webrat.configuration.selenium_server_port,
67
+ :timeout => 45 # seconds
68
+ end
69
+ end
70
+
71
+ def fail
72
+ $stderr.puts
73
+ $stderr.puts
74
+ $stderr.puts "==> Failed to boot the Selenium RC server... exiting!"
75
+ exit
76
+ end
77
+
78
+ def stop
79
+ silence_stream(STDOUT) do
80
+ ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
81
+ Webrat.configuration.selenium_server_port,
82
+ :timeout => 5).stop
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,276 @@
1
+ require "webrat/core/save_and_open_page"
2
+ require "webrat/selenium/selenium_rc_server"
3
+ require "webrat/selenium/application_server_factory"
4
+ require "webrat/selenium/application_servers/base"
5
+
6
+ begin
7
+ require "selenium/client"
8
+ rescue LoadError => e
9
+ e.message << " (You may need to install the selenium-webdriver gem)"
10
+ raise e
11
+ end
12
+
13
+ module Webrat
14
+ class TimeoutError < WebratError
15
+ end
16
+
17
+ class SeleniumResponse
18
+ attr_reader :body
19
+ attr_reader :session
20
+
21
+ def initialize(session, body)
22
+ @session = session
23
+ @body = body
24
+ end
25
+
26
+ def selenium
27
+ session.selenium
28
+ end
29
+ end
30
+
31
+ class SeleniumSession
32
+ include Webrat::SaveAndOpenPage
33
+ include Webrat::Selenium::SilenceStream
34
+
35
+ def initialize(*args) # :nodoc:
36
+ end
37
+
38
+ def simulate
39
+ end
40
+
41
+ def automate
42
+ yield
43
+ end
44
+
45
+ def visit(url)
46
+ selenium.open(url)
47
+ end
48
+
49
+ webrat_deprecate :visits, :visit
50
+
51
+ def fill_in(field_identifier, options)
52
+ locator = "webrat=#{field_identifier}"
53
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
54
+ selenium.type(locator, "#{options[:with]}")
55
+ end
56
+
57
+ webrat_deprecate :fills_in, :fill_in
58
+
59
+ def response
60
+ SeleniumResponse.new(self, response_body)
61
+ end
62
+
63
+ def response_body #:nodoc:
64
+ selenium.get_html_source
65
+ end
66
+
67
+ def current_url
68
+ selenium.location
69
+ end
70
+
71
+ def click_button(button_text_or_regexp = nil, options = {})
72
+ if button_text_or_regexp.is_a?(Hash) && options == {}
73
+ pattern, options = nil, button_text_or_regexp
74
+ elsif button_text_or_regexp
75
+ pattern = adjust_if_regexp(button_text_or_regexp)
76
+ end
77
+ pattern ||= '*'
78
+ locator = "button=#{pattern}"
79
+
80
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
81
+ selenium.click locator
82
+ end
83
+
84
+ webrat_deprecate :clicks_button, :click_button
85
+
86
+ def click_link(link_text_or_regexp, options = {})
87
+ if link_text_or_regexp.is_a?(Regexp)
88
+ pattern = "evalregex:#{link_text_or_regexp.inspect}"
89
+ else
90
+ pattern = link_text_or_regexp.to_s
91
+ end
92
+
93
+ locator = "webratlink=#{pattern}"
94
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
95
+ selenium.click locator
96
+ end
97
+
98
+ webrat_deprecate :clicks_link, :click_link
99
+
100
+ def click_link_within(selector, link_text, options = {})
101
+ locator = "webratlinkwithin=#{selector}|#{link_text}"
102
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
103
+ selenium.click locator
104
+ end
105
+
106
+ webrat_deprecate :clicks_link_within, :click_link_within
107
+
108
+ def select(option_text, options = {})
109
+ id_or_name_or_label = options[:from]
110
+
111
+ if id_or_name_or_label
112
+ select_locator = "webrat=#{id_or_name_or_label}"
113
+ else
114
+ select_locator = "webratselectwithoption=#{option_text}"
115
+ end
116
+
117
+ selenium.wait_for_element select_locator, :timeout_in_seconds => 5
118
+ selenium.select(select_locator, option_text)
119
+ end
120
+
121
+ webrat_deprecate :selects, :select
122
+
123
+ def choose(label_text)
124
+ locator = "webrat=#{label_text}"
125
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
126
+ selenium.click locator
127
+ end
128
+
129
+ webrat_deprecate :chooses, :choose
130
+
131
+ def check(label_text)
132
+ locator = "webrat=#{label_text}"
133
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
134
+ selenium.click locator
135
+ end
136
+ alias_method :uncheck, :check
137
+
138
+ webrat_deprecate :checks, :check
139
+
140
+ def fire_event(field_identifier, event)
141
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
142
+ selenium.fire_event(locator, "#{event}")
143
+ end
144
+
145
+ def key_down(field_identifier, key_code)
146
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
147
+ selenium.key_down(locator, key_code)
148
+ end
149
+
150
+ def key_up(field_identifier, key_code)
151
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
152
+ selenium.key_up(locator, key_code)
153
+ end
154
+
155
+ def wait_for(params={})
156
+ timeout = params[:timeout] || 5
157
+ message = params[:message] || "Timeout exceeded"
158
+
159
+ begin_time = Time.now
160
+
161
+ while (Time.now - begin_time) < timeout
162
+ value = nil
163
+
164
+ begin
165
+ value = yield
166
+ rescue Exception => e
167
+ unless is_ignorable_wait_for_exception?(e)
168
+ raise e
169
+ end
170
+ end
171
+
172
+ return value if value
173
+
174
+ sleep 0.25
175
+ end
176
+
177
+ error_message = "#{message} (after #{timeout} sec)"
178
+
179
+ if $browser && Webrat.configuration.selenium_verbose_output
180
+ error_message += <<-EOS
181
+
182
+
183
+ HTML of the page was:
184
+
185
+ #{selenium.get_html_source}"
186
+ EOS
187
+ end
188
+
189
+ raise Webrat::TimeoutError.new(error_message)
190
+ true
191
+ end
192
+
193
+ def selenium
194
+ return $browser if $browser
195
+ setup
196
+ $browser
197
+ end
198
+
199
+ webrat_deprecate :browser, :selenium
200
+
201
+
202
+ def save_and_open_screengrab
203
+ return unless File.exist?(Webrat.configuration.saved_pages_dir)
204
+
205
+ filename = "#{Webrat.configuration.saved_pages_dir}/webrat-#{Time.now.to_i}.png"
206
+
207
+ if $browser.chrome_backend?
208
+ $browser.capture_entire_page_screenshot(filename, '')
209
+ else
210
+ $browser.capture_screenshot(filename)
211
+ end
212
+ open_in_browser(filename)
213
+
214
+ end
215
+
216
+ protected
217
+ def is_ignorable_wait_for_exception?(exception) #:nodoc:
218
+ if defined?(::Spec::Expectations::ExpectationNotMetError)
219
+ return true if exception.class == ::Spec::Expectations::ExpectationNotMetError
220
+ end
221
+ return true if [::Selenium::CommandError, Webrat::WebratError].include?(exception.class)
222
+ return false
223
+ end
224
+
225
+ def setup #:nodoc:
226
+ Webrat::Selenium::SeleniumRCServer.boot
227
+ Webrat::Selenium::ApplicationServerFactory.app_server_instance.boot
228
+
229
+ create_browser
230
+ $browser.start
231
+
232
+ extend_selenium
233
+ define_location_strategies
234
+ $browser.window_maximize
235
+ end
236
+
237
+
238
+ def create_browser
239
+ $browser = ::Selenium::Client::Driver.new(
240
+ Webrat.configuration.selenium_server_address || "localhost",
241
+ Webrat.configuration.selenium_server_port,
242
+ Webrat.configuration.selenium_browser_key,
243
+ "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port_for_selenium}"
244
+ )
245
+ $browser.set_speed(0) unless Webrat.configuration.selenium_server_address
246
+
247
+ at_exit do
248
+ silence_stream(STDOUT) do
249
+ $browser.stop
250
+ end
251
+ end
252
+ end
253
+
254
+ def adjust_if_regexp(text_or_regexp) #:nodoc:
255
+ if text_or_regexp.is_a?(Regexp)
256
+ "evalregex:#{text_or_regexp.inspect}"
257
+ else
258
+ "evalregex:/#{text_or_regexp}/"
259
+ end
260
+ end
261
+
262
+ def extend_selenium #:nodoc:
263
+ extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
264
+ extenions_js = File.read(extensions_file)
265
+ selenium.get_eval(extenions_js)
266
+ end
267
+
268
+ def define_location_strategies #:nodoc:
269
+ Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
270
+ strategy_js = File.read(file)
271
+ strategy_name = File.basename(file, '.js')
272
+ selenium.add_location_strategy(strategy_name, strategy_js)
273
+ end
274
+ end
275
+ end
276
+ end
@@ -0,0 +1,18 @@
1
+ module Webrat
2
+ module Selenium
3
+ module SilenceStream
4
+ # active_support already defines silence_stream, no need to do that again if it's already present.
5
+ # http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
6
+ unless Kernel.respond_to?(:silence_stream)
7
+ def silence_stream(stream)
8
+ old_stream = stream.dup
9
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
10
+ stream.sync = true
11
+ yield
12
+ ensure
13
+ stream.reopen(old_stream)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ module Webrat #:nodoc:
2
+ def self.adapter_class #:nodoc:
3
+ TestAdapter
4
+ end
5
+
6
+ class TestAdapter #:nodoc:
7
+ attr_accessor :response_body
8
+ attr_writer :response_code
9
+
10
+ def initialize(*args)
11
+ end
12
+
13
+ def response
14
+ @response ||= Object.new
15
+ end
16
+
17
+ def response_code
18
+ @response_code ||= 200
19
+ end
20
+
21
+ def get(url, data, headers = nil)
22
+ end
23
+
24
+ def post(url, data, headers = nil)
25
+ end
26
+
27
+ def put(url, data, headers = nil)
28
+ end
29
+
30
+ def delete(url, data, headers = nil)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'spec/rake/spectask'
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.spec_opts = ['--color']
6
+ t.spec_files = FileList['spec/**/*_spec.rb']
7
+ end
@@ -0,0 +1,2 @@
1
+ require "sample_app"
2
+ run SampleApp
@@ -0,0 +1,35 @@
1
+ require "sinatra/base"
2
+
3
+ class SampleApp < Sinatra::Default
4
+ get "/" do
5
+ "Hello World"
6
+ end
7
+
8
+ get "/internal_redirect" do
9
+ redirect URI.join(request.url, "redirected").to_s
10
+ end
11
+
12
+ get "/external_redirect" do
13
+ redirect "http://example.tst/"
14
+ end
15
+
16
+ get "/redirected" do
17
+ "Redirected"
18
+ end
19
+
20
+ get "/form" do
21
+ <<-EOS
22
+ <html>
23
+ <form action="/form" method="post">
24
+ <input type="hidden" name="_method" value="put" />
25
+ <label for="email">Email:</label> <input type="text" id="email" name="email" /></label>
26
+ <input type="submit" value="Add" />
27
+ </form>
28
+ </html>
29
+ EOS
30
+ end
31
+
32
+ put "/form" do
33
+ "Welcome #{params[:email]}"
34
+ end
35
+ end