mkuklis-webrat 0.5.1 → 0.6.rc1

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