hirobumi-celerity 0.0.5

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 (69) hide show
  1. data/History.txt +42 -0
  2. data/License.txt +621 -0
  3. data/README.txt +68 -0
  4. data/Rakefile +12 -0
  5. data/lib/celerity.rb +59 -0
  6. data/lib/celerity/browser.rb +454 -0
  7. data/lib/celerity/clickable_element.rb +26 -0
  8. data/lib/celerity/collections.rb +148 -0
  9. data/lib/celerity/container.rb +488 -0
  10. data/lib/celerity/default_viewer.rb +10 -0
  11. data/lib/celerity/disabled_element.rb +27 -0
  12. data/lib/celerity/element.rb +241 -0
  13. data/lib/celerity/element_collections.rb +68 -0
  14. data/lib/celerity/element_locator.rb +167 -0
  15. data/lib/celerity/elements/button.rb +34 -0
  16. data/lib/celerity/elements/file_field.rb +17 -0
  17. data/lib/celerity/elements/form.rb +16 -0
  18. data/lib/celerity/elements/frame.rb +53 -0
  19. data/lib/celerity/elements/image.rb +57 -0
  20. data/lib/celerity/elements/label.rb +9 -0
  21. data/lib/celerity/elements/link.rb +12 -0
  22. data/lib/celerity/elements/meta.rb +6 -0
  23. data/lib/celerity/elements/non_control_elements.rb +93 -0
  24. data/lib/celerity/elements/option.rb +18 -0
  25. data/lib/celerity/elements/radio_check.rb +85 -0
  26. data/lib/celerity/elements/select_list.rb +81 -0
  27. data/lib/celerity/elements/table.rb +117 -0
  28. data/lib/celerity/elements/table_cell.rb +28 -0
  29. data/lib/celerity/elements/table_elements.rb +41 -0
  30. data/lib/celerity/elements/table_row.rb +36 -0
  31. data/lib/celerity/elements/text_field.rb +127 -0
  32. data/lib/celerity/exception.rb +40 -0
  33. data/lib/celerity/extra/method_generator.rb +158 -0
  34. data/lib/celerity/htmlunit.rb +41 -0
  35. data/lib/celerity/htmlunit/commons-codec-1.3.jar +0 -0
  36. data/lib/celerity/htmlunit/commons-collections-3.2.1.jar +0 -0
  37. data/lib/celerity/htmlunit/commons-httpclient-3.1.jar +0 -0
  38. data/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
  39. data/lib/celerity/htmlunit/commons-lang-2.4.jar +0 -0
  40. data/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
  41. data/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
  42. data/lib/celerity/htmlunit/htmlunit-2.4.jar +0 -0
  43. data/lib/celerity/htmlunit/htmlunit-core-js-2.4.jar +0 -0
  44. data/lib/celerity/htmlunit/nekohtml-1.9.11.jar +0 -0
  45. data/lib/celerity/htmlunit/sac-1.3.jar +0 -0
  46. data/lib/celerity/htmlunit/serializer-2.7.1.jar +0 -0
  47. data/lib/celerity/htmlunit/xalan-2.7.1.jar +0 -0
  48. data/lib/celerity/htmlunit/xercesImpl-2.8.1.jar +0 -0
  49. data/lib/celerity/htmlunit/xml-apis-1.3.04.jar +0 -0
  50. data/lib/celerity/identifier.rb +11 -0
  51. data/lib/celerity/input_element.rb +25 -0
  52. data/lib/celerity/listener.rb +106 -0
  53. data/lib/celerity/resources/no_viewer.png +0 -0
  54. data/lib/celerity/util.rb +79 -0
  55. data/lib/celerity/version.rb +9 -0
  56. data/lib/celerity/watir_compatibility.rb +85 -0
  57. data/tasks/benchmark.rake +4 -0
  58. data/tasks/deployment.rake +43 -0
  59. data/tasks/environment.rake +7 -0
  60. data/tasks/fix.rake +25 -0
  61. data/tasks/jar.rake +57 -0
  62. data/tasks/rdoc.rake +4 -0
  63. data/tasks/rspec.rake +30 -0
  64. data/tasks/simple_ci.rake +94 -0
  65. data/tasks/snapshot.rake +26 -0
  66. data/tasks/specserver.rake +21 -0
  67. data/tasks/website.rake +17 -0
  68. data/tasks/yard.rake +5 -0
  69. metadata +129 -0
data/README.txt ADDED
@@ -0,0 +1,68 @@
1
+ = Celerity
2
+
3
+ * http://celerity.rubyforge.org/
4
+
5
+ == DESCRIPTION:
6
+
7
+ Celerity is a JRuby library for easy and fast functional test automation for web applications.
8
+ It is a wrapper around the HtmlUnit Java library and is currently aimed at providing the same API and functionality as Watir.
9
+
10
+ == FEATURES:
11
+
12
+ * Fast: No time-consuming GUI rendering or unessential downloads
13
+ * Scalable: Java threads lets you run tests in parallel
14
+ * Easy to use: Simple API
15
+ * Portable: Cross-platform
16
+ * Unintrusive: No browser window interrupting your workflow (runs in background)
17
+
18
+ == REQUIREMENTS:
19
+
20
+ * JRuby 1.1.5 or higher
21
+ * Java 6
22
+
23
+ == INSTALL:
24
+
25
+ `jruby -S gem install celerity`
26
+
27
+ or from GitHub
28
+
29
+ `jruby -S gem install jarib-celerity`
30
+
31
+
32
+ == EXAMPLE:
33
+
34
+ require "rubygems"
35
+ require "celerity"
36
+
37
+ browser = Celerity::Browser.new
38
+ browser.goto('http://www.google.com')
39
+ browser.text_field(:name, 'q').value = 'Celerity'
40
+ browser.button(:name, 'btnG').click
41
+
42
+ puts "yay" if browser.text.include? 'celerity.rubyforge.org'
43
+
44
+ == SOURCE
45
+
46
+ The source code is available at http://github.com/jarib/celerity/tree/master
47
+
48
+ == WIKI:
49
+
50
+ * http://github.com/jarib/celerity/wikis
51
+
52
+ == LICENSE:
53
+
54
+ Celerity - JRuby wrapper for HtmlUnit
55
+ Copyright (c) 2008 FINN.no AS
56
+
57
+ This program is free software: you can redistribute it and/or modify
58
+ it under the terms of the GNU General Public License as published by
59
+ the Free Software Foundation, either version 3 of the License, or
60
+ (at your option) any later version.
61
+
62
+ This program is distributed in the hope that it will be useful,
63
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
64
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
65
+ GNU General Public License for more details.
66
+
67
+ You should have received a copy of the GNU General Public License
68
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ $:.unshift("#{File.dirname(__FILE__)}/lib")
2
+
3
+ if File.exist?('config') # are we in a git clone
4
+ require 'config/requirements'
5
+ require 'config/hoe' # setup Hoe + all gem configuration
6
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
7
+ else # in gem dir
8
+ load 'tasks/jar.rake'
9
+ load 'tasks/rdoc.rake'
10
+ end
11
+
12
+
data/lib/celerity.rb ADDED
@@ -0,0 +1,59 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
+
3
+ raise "Celerity only works on JRuby at the moment." unless RUBY_PLATFORM =~ /java/
4
+
5
+ require 'java'
6
+ require "logger"
7
+ require "uri"
8
+ require "pp"
9
+ require "timeout"
10
+ require "time"
11
+ require 'drb'
12
+ require "fileutils"
13
+
14
+ module Celerity
15
+ Log = Logger.new($DEBUG ? $stderr : nil)
16
+ Log.level = Logger::DEBUG
17
+
18
+ INDEX_OFFSET = 1
19
+ DIR = File.expand_path(File.dirname(__FILE__) + "/celerity")
20
+ end
21
+
22
+ require "celerity/htmlunit"
23
+ require "celerity/version"
24
+ require "celerity/exception"
25
+ require "celerity/clickable_element"
26
+ require "celerity/disabled_element"
27
+ require "celerity/element_collections"
28
+ require "celerity/collections"
29
+ require "celerity/element_locator"
30
+ require "celerity/identifier"
31
+ require "celerity/container"
32
+ require "celerity/element"
33
+ require "celerity/input_element"
34
+ require "celerity/elements/non_control_elements"
35
+ require "celerity/elements/button.rb"
36
+ require "celerity/elements/file_field.rb"
37
+ require "celerity/elements/form.rb"
38
+ require "celerity/elements/frame.rb"
39
+ require "celerity/elements/image.rb"
40
+ require "celerity/elements/label.rb"
41
+ require "celerity/elements/link.rb"
42
+ require "celerity/elements/meta.rb"
43
+ require "celerity/elements/option.rb"
44
+ require "celerity/elements/radio_check.rb"
45
+ require "celerity/elements/select_list.rb"
46
+ require "celerity/elements/table.rb"
47
+ require "celerity/elements/table_elements.rb"
48
+ require "celerity/elements/table_cell.rb"
49
+ require "celerity/elements/table_row.rb"
50
+ require "celerity/elements/text_field.rb"
51
+ require "celerity/util"
52
+ require "celerity/default_viewer"
53
+ require "celerity/listener"
54
+ require "celerity/browser"
55
+ require "celerity/watir_compatibility"
56
+
57
+ # undefine deprecated methods to use them for Element attributes
58
+ Object.send :undef_method, :id if Object.method_defined? "id"
59
+ Object.send :undef_method, :type if Object.method_defined? "type"
@@ -0,0 +1,454 @@
1
+ module Celerity
2
+ class Browser
3
+ include Container
4
+
5
+ attr_accessor :page, :object, :charset
6
+ attr_reader :webclient, :viewer
7
+
8
+ # Initialize a browser and goto the given URL
9
+ # @param uri The URL to go to.
10
+ # @return Instance of Celerity::Browser.
11
+ def self.start(uri)
12
+ browser = new
13
+ browser.goto(uri)
14
+ browser
15
+ end
16
+
17
+ def self.attach(*args)
18
+ raise NotImplementedError, "use ClickableElement#click_and_attach instead"
19
+ end
20
+
21
+ # Creates a browser object.
22
+ #
23
+ # @option opts :log_level [Symbol] (:warning) @see log_level=
24
+ # @option opts :browser [:firefox, :internet_explorer] (:internet_explorer) Set the BrowserVersion used by HtmlUnit. Defaults to Internet Explorer.
25
+ # @option opts :css [Boolean] (false) Enable CSS. Disabled by default.
26
+ # @option opts :secure_ssl [Boolean] (true) Disable secure SSL. Enabled by default.
27
+ # @option opts :resynchronize [Boolean] (false) Use HtmlUnit::NicelyResynchronizingAjaxController to resynchronize Ajax calls.
28
+ # @option opts :javascript_exceptions [Boolean] (false) Raise exceptions on script errors. Disabled by default.
29
+ # @option opts :status_code_exceptions [Boolean] (false) Raise exceptions on failing status codes (404 etc.). Disabled by default.
30
+ # @option opts :render [:html, :xml] (:html) What DOM representation to send to connected viewers.
31
+ # @option opts :charset [String] ("UTF-8") Specify the charset that webclient will use by default.
32
+ # @option opts :proxy [String] (nil) Proxy server to use, in address:port format.
33
+ #
34
+ # @return [Celerity::Browser] An instance of the browser.
35
+ # @see Celerity::Container for a small introduction to the API.
36
+ # @api public
37
+ def initialize(opts = {})
38
+ unless opts.is_a?(Hash)
39
+ raise TypeError, "wrong argument type #{opts.class}, expected Hash"
40
+ end
41
+
42
+ unless (render_types = [:html, :xml, nil]).include?(opts[:render])
43
+ raise ArgumentError, "expected one of #{render_types.inspect} for key :render"
44
+ end
45
+
46
+ @render_type = opts.delete(:render) || :html
47
+ @charset = opts.delete(:charset) || "UTF-8"
48
+ @proxy = opts.delete(:proxy) || nil
49
+ self.log_level = opts.delete(:log_level) || :warning
50
+
51
+ @last_url, @page = nil
52
+ @error_checkers = []
53
+ @browser = self # for Container#browser
54
+
55
+ browser = case opts.delete(:browser)
56
+ when :firefox then ::HtmlUnit::BrowserVersion::FIREFOX_2
57
+ else ::HtmlUnit::BrowserVersion::INTERNET_EXPLORER_7_0
58
+ end
59
+
60
+ @webclient = ::HtmlUnit::WebClient.new(browser)
61
+
62
+ configure_webclient(opts)
63
+ raise ArgumentError, "unknown option #{opts.inspect}" unless opts.empty?
64
+ find_viewer
65
+ end
66
+
67
+ # Goto the given URL
68
+ #
69
+ # @param [String] uri The url.
70
+ # @return [String] The url.
71
+ def goto(uri)
72
+ uri = "http://#{uri}" unless uri =~ %r{://}
73
+
74
+ request = HtmlUnit::WebRequestSettings.new(::Java::JavaNet::URL.new(uri))
75
+ request.setCharset(@charset)
76
+
77
+ self.page = @webclient.getPage(request)
78
+
79
+ url()
80
+ end
81
+
82
+ # Unsets the current page / closes all windows
83
+ def close
84
+ @page = nil
85
+ @webclient.closeAllWindows
86
+ end
87
+
88
+ # @return [String] the URL of the current page
89
+ def url
90
+ assert_exists
91
+ # will be renamed getUrl => getRequestUrl
92
+ @page.getWebResponse.getUrl.toString
93
+ end
94
+
95
+ # @return [String] the title of the current page
96
+ def title
97
+ @page ? @page.getTitleText : ''
98
+ end
99
+
100
+ # @return [String] the HTML content of the current page
101
+ def html
102
+ @page ? @page.getWebResponse.getContentAsString : ''
103
+ end
104
+
105
+ # @return [String] the XML representation of the DOM
106
+ def xml
107
+ return '' unless @page
108
+ return @page.asXml if @page.respond_to?(:asXml)
109
+ return text # fallback to text (for exampel for "plain/text" pages)
110
+ end
111
+
112
+ # @return [String] a text representation of the current page
113
+ def text
114
+ return '' unless @page
115
+
116
+ if @page.respond_to?("getContent")
117
+ string = @page.getContent.strip
118
+ else
119
+ string = @page.documentElement.asText.strip
120
+ end
121
+
122
+ # Celerity::Util.normalize_text(string)
123
+ string
124
+ end
125
+
126
+ # @return [Hash] response headers as a hash
127
+ def response_headers
128
+ return {} unless @page
129
+
130
+ Hash[*@page.getWebResponse.getResponseHeaders.map { |obj| [obj.name, obj.value] }.flatten]
131
+ end
132
+
133
+ # @return [String] content-type as in 'text/html'
134
+ def content_type
135
+ return '' unless @page
136
+
137
+ @page.getWebResponse.getContentType
138
+ end
139
+
140
+ # @return [IO, nil] page contents as an IO, returns nil if no page is loaded.
141
+ def io
142
+ return nil unless @page
143
+
144
+ @page.getWebResponse.getContentAsStream.to_io
145
+ end
146
+
147
+ # Check if the current page contains the given text.
148
+ #
149
+ # @param [String, Regexp] expected_text The text to look for.
150
+ # @raise [TypeError]
151
+ # @return [Numeric, nil] The index of the matched text, or nil if it doesn't match.
152
+ def contains_text(expected_text)
153
+ return nil unless exist?
154
+ super
155
+ end
156
+
157
+ #
158
+ # write me!
159
+ #
160
+ def element_by_xpath(xpath)
161
+ assert_exists
162
+ obj = @page.getFirstByXPath(xpath)
163
+ element_from_dom_node(obj)
164
+ end
165
+
166
+ #
167
+ # write me!
168
+ #
169
+ def elements_by_xpath(xpath)
170
+ assert_exists
171
+ objects = @page.getByXPath(xpath)
172
+ # should use an ElementCollection here?
173
+ objects.map { |o| element_from_dom_node(o) }.compact
174
+ end
175
+
176
+ # @return [HtmlUnit::HtmlHtml] the underlying HtmlUnit object.
177
+ def document
178
+ @object
179
+ end
180
+
181
+ # Goto the last url - HtmlUnit doesn't have a 'back' functionality, so we only have 1 history item :)
182
+ # @return [String, nil] The url of the resulting page, or nil if none was stored.
183
+ def back
184
+ # TODO: this is naive, need capability from HtmlUnit
185
+ goto(@last_url) if @last_url
186
+ end
187
+
188
+ # Wait for ajax calls to finish
189
+ def wait
190
+ assert_exists
191
+ @page.getEnclosingWindow.getThreadManager.joinAll(10000)
192
+ end
193
+
194
+ # Refresh the current page
195
+ def refresh
196
+ assert_exists
197
+ self.page = @page.refresh
198
+ end
199
+
200
+ # Clears all cookies. (Celerity-specific API)
201
+ def clear_cookies
202
+ @webclient.getCookieManager.clearCookies
203
+ end
204
+
205
+ # Execute the given JavaScript on the current page. (Celerity-specific API)
206
+ # @return [Object] The resulting Object
207
+ def execute_script(source)
208
+ assert_exists
209
+ @page.executeJavaScript(source.to_s).getJavaScriptResult
210
+ end
211
+
212
+ # experimental
213
+ def send_keys(keys)
214
+ keys = keys.gsub(/\s*/, '').scan(/((?:\{[A-Z]+?\})|.)/u).flatten
215
+ keys.each do |key|
216
+ element = @page.getFocusedElement
217
+ case key
218
+ when "{TAB}"
219
+ @page.tabToNextElement
220
+ when /\w/
221
+ element.type(key)
222
+ else
223
+ raise NotImplementedError
224
+ end
225
+ end
226
+ end
227
+
228
+ # Wait until the given block evaluates to true (Celerity-specific API)
229
+ #
230
+ # @param [Fixnum] timeout Number of seconds to wait before timing out (default: 30).
231
+ # @yieldparam [Celerity::Browser] browser The browser instance.
232
+ # @see Celerity::Browser#resynchronized
233
+ def wait_until(timeout = 30, &block)
234
+ Timeout.timeout(timeout) do
235
+ until yield(self)
236
+ refresh_page_from_window
237
+ sleep 0.1
238
+ end
239
+ end
240
+ end
241
+
242
+ # Wait while the given block evaluates to true (Celerity-specific API)
243
+ #
244
+ # @param [Fixnum] timeout Number of seconds to wait before timing out (default: 30).
245
+ # @yieldparam [Celerity::Browser] browser The browser instance.
246
+ # @see Celerity::Browser#resynchronized
247
+ def wait_while(timeout = 30, &block)
248
+ Timeout.timeout(timeout) do
249
+ while yield(self)
250
+ refresh_page_from_window
251
+ sleep 0.1
252
+ end
253
+ end
254
+ end
255
+
256
+ # Add a 'checker' proc that will be run on every page load
257
+ #
258
+ # @param [Proc] checker The proc to be run (can also be given as a block)
259
+ # @yieldparam [Celerity::Browser] browser The current browser object.
260
+ # @raise [ArgumentError] if no Proc or block was given.
261
+ def add_checker(checker = nil, &block)
262
+ if block_given?
263
+ @error_checkers << block
264
+ elsif Proc === checker
265
+ @error_checkers << checker
266
+ else
267
+ raise ArgumentError, "argument must be a Proc or block"
268
+ end
269
+ end
270
+
271
+ # Remove the given checker from the list of checkers
272
+ # @param [Proc] checker The Proc to disable.
273
+ def disable_checker(checker)
274
+ @error_checkers.delete(checker)
275
+ end
276
+
277
+ # @return [Symbol] the current log level
278
+ def log_level
279
+ java.util.logging.Logger.getLogger('com.gargoylesoftware.htmlunit').level.to_s.downcase.to_sym
280
+ end
281
+
282
+ # Set Java log level (default is :warning)
283
+ #
284
+ # @param [Symbol] level :finest, :finer, :fine, :config, :info, :warning, :severe, or :off, :all
285
+ def log_level=(level)
286
+ java.util.logging.Logger.getLogger('com.gargoylesoftware.htmlunit').level = java.util.logging.Level.const_get(level.to_s.upcase)
287
+ end
288
+
289
+ # Checks if we have a page currently loaded.
290
+ # @return [true, false]
291
+ def exist?
292
+ !!@page
293
+ end
294
+ alias_method :exists?, :exist?
295
+
296
+ # Allows you to temporarily switch to HtmlUnit's NicelyResynchronizingAjaxController to resynchronize ajax calls.
297
+ #
298
+ # @browser.resynchroniced do |b|
299
+ # b.link(:id, 'load_fancy_ajax_stuff').click
300
+ # end
301
+ #
302
+ # @yieldparam [Celerity::Browser] browser The current browser object.
303
+ # @see Celerity::Browser#new for options on how to always use this.
304
+ def resynchronized(&block)
305
+ old_controller = @webclient.ajaxController
306
+ @webclient.setAjaxController(::HtmlUnit::NicelyResynchronizingAjaxController.new)
307
+
308
+ yield(self)
309
+
310
+ @webclient.setAjaxController(old_controller)
311
+ end
312
+
313
+ #--
314
+ # TODO: could be private?
315
+ #++
316
+ #
317
+ # Check that we have a @page object.
318
+ #
319
+ # @raise [Celerity::Exception::UnknownObjectException] if no page is loaded.
320
+ # @api private
321
+ def assert_exists
322
+ raise UnknownObjectException, "no page loaded" unless exist?
323
+ end
324
+
325
+ #--
326
+ # TODO: could be private?
327
+ #++
328
+ # Runs the all the checker procs added by +add_checker+
329
+ #
330
+ # @see add_checker
331
+ # @api private
332
+ def run_error_checks
333
+ @error_checkers.each { |e| e[self] }
334
+ end
335
+
336
+ # Set the current page object for the browser
337
+ #
338
+ # @param [HtmlUnit::HtmlPage] value The page to set.
339
+ # @api private
340
+ def page=(value)
341
+ @last_url = url() if exist?
342
+ @page = value
343
+
344
+ if @page.respond_to?("getDocumentElement")
345
+ @object = @page.getDocumentElement
346
+ elsif @page.is_a? HtmlUnit::UnexpectedPage
347
+ raise UnexpectedPageException, @page.getWebResponse.getContentType
348
+ end
349
+
350
+ render unless @viewer == DefaultViewer
351
+ run_error_checks
352
+
353
+ value
354
+ end
355
+
356
+ # Start or stop HtmlUnit's DebuggingWebConnection.
357
+ # The output will go to /tmp/«name»
358
+ #
359
+ # @param [Boolean] bool start or stop
360
+ # @param [String] name required if bool is true
361
+ def debug_web_connection(bool, name = nil)
362
+ if bool
363
+ raise "no name given" unless name
364
+ @old_webconnection = @webclient.getWebConnection
365
+ dwc = HtmlUnit::Util::DebuggingWebConnection.new(@old_webconnection, name)
366
+ @webclient.setWebConnection(dwc)
367
+ $stderr.puts "debug-webconnection on"
368
+ else
369
+ @webclient.setWebConnection(@old_webconnection) if @old_webconnection
370
+ $stderr.puts "debug-webconnection off"
371
+ end
372
+ end
373
+
374
+ # Add a listener block for one of the available types.
375
+ # Types map to HtmlUnit interfaces like this:
376
+ #
377
+ # :status => StatusHandler
378
+ # :alert => AlertHandler ( window.alert() )
379
+ # :web_window_event => WebWindowListener
380
+ # :html_parser => HTMLParserListener
381
+ # :incorrectness => IncorrectnessListener
382
+ # :confirm => ConfirmHandler ( window.confirm() )
383
+ # :prompt => PromptHandler ( window.prompt() )
384
+ #
385
+ #
386
+ # @param [Symbol] type One of the above symbols.
387
+ # @param [Proc] block A block to be executed for events of this type.
388
+ def add_listener(type, &block)
389
+ @listener ||= Celerity::Listener.new(@webclient)
390
+ @listener.add_listener(type, &block)
391
+ end
392
+
393
+ private
394
+
395
+ # Configure the webclient according to the options given to #new.
396
+ # @see initialize
397
+ def configure_webclient(opts)
398
+ @webclient.throwExceptionOnScriptError = false unless opts.delete(:javascript_exceptions)
399
+ @webclient.throwExceptionOnFailingStatusCode = false unless opts.delete(:status_code_exceptions)
400
+ @webclient.cssEnabled = false unless opts.delete(:css)
401
+ @webclient.useInsecureSSL = opts.delete(:secure_ssl) == false
402
+
403
+ if @proxy
404
+ phost, pport = @proxy.split(":")
405
+ @webclient.proxyHost = phost
406
+ @webclient.proxyPort = pport.to_i
407
+ end
408
+ @webclient.setAjaxController(::HtmlUnit::NicelyResynchronizingAjaxController.new) if opts.delete(:resynchronize)
409
+ end
410
+
411
+ # This *should* be unneccessary, but sometimes the page we get from the
412
+ # window is different (ie. a different object) from our current @page
413
+ # (Used by #wait_while and #wait_until)
414
+ def refresh_page_from_window
415
+ new_page = @page.getEnclosingWindow.getEnclosedPage
416
+
417
+ if new_page && (new_page != @page)
418
+ self.page = new_page
419
+ else
420
+ Log.debug "unneccessary refresh"
421
+ end
422
+ end
423
+
424
+ # Render the current page on the viewer.
425
+ # @api private
426
+ def render
427
+ @viewer.render_html(self.send(@render_type), url)
428
+ rescue DRb::DRbConnError, Errno::ECONNREFUSED => e
429
+ @viewer = DefaultViewer
430
+ end
431
+
432
+ # Check if we have a viewer available on druby://127.0.0.1:6429
433
+ # @api private
434
+ def find_viewer
435
+ viewer = DRbObject.new_with_uri("druby://127.0.0.1:6429")
436
+ if viewer.respond_to?(:render_html)
437
+ @viewer = viewer
438
+ else
439
+ @viewer = DefaultViewer
440
+ end
441
+ rescue DRb::DRbConnError, Errno::ECONNREFUSED
442
+ @viewer = DefaultViewer
443
+ end
444
+
445
+ def element_from_dom_node(obj)
446
+ if element_class = Celerity::Util.htmlunit2celerity(obj.class)
447
+ element_class.new(self, :object, obj)
448
+ else
449
+ Element.new(self, :object, nil)
450
+ end
451
+ end
452
+
453
+ end # Browser
454
+ end # Celerity