jarib-celerity 0.0.5.5 → 0.0.5.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/celerity/browser.rb +220 -83
- data/lib/celerity/collections.rb +39 -39
- data/lib/celerity/container.rb +272 -20
- data/lib/celerity/disabled_element.rb +16 -3
- data/lib/celerity/element.rb +48 -3
- data/lib/celerity/element_locator.rb +3 -0
- data/lib/celerity/elements/button.rb +16 -6
- data/lib/celerity/elements/file_field.rb +10 -2
- data/lib/celerity/elements/form.rb +7 -2
- data/lib/celerity/elements/frame.rb +25 -4
- data/lib/celerity/elements/image.rb +22 -3
- data/lib/celerity/elements/non_control_elements.rb +6 -1
- data/lib/celerity/elements/option.rb +9 -1
- data/lib/celerity/elements/radio_check.rb +44 -14
- data/lib/celerity/elements/select_list.rb +29 -5
- data/lib/celerity/elements/table.rb +30 -7
- data/lib/celerity/elements/table_cell.rb +2 -2
- data/lib/celerity/elements/table_row.rb +14 -3
- data/lib/celerity/elements/text_field.rb +46 -9
- data/lib/celerity/exception.rb +43 -6
- data/lib/celerity/extra/method_generator.rb +13 -1
- data/lib/celerity/htmlunit.rb +6 -1
- data/lib/celerity/listener.rb +37 -8
- data/lib/celerity/util.rb +3 -0
- data/lib/celerity/version.rb +1 -1
- data/lib/celerity/watir_compatibility.rb +12 -11
- data/lib/celerity.rb +1 -1
- metadata +4 -3
- data/lib/celerity/element_collections.rb +0 -82
data/lib/celerity/browser.rb
CHANGED
@@ -5,22 +5,38 @@ module Celerity
|
|
5
5
|
attr_accessor :page, :object, :charset
|
6
6
|
attr_reader :webclient, :viewer
|
7
7
|
|
8
|
+
#
|
8
9
|
# Initialize a browser and goto the given URL
|
9
|
-
#
|
10
|
-
# @
|
10
|
+
#
|
11
|
+
# @param [String] uri The URL to go to.
|
12
|
+
# @return [Celerity::Browser] instance.
|
13
|
+
#
|
14
|
+
|
11
15
|
def self.start(uri)
|
12
16
|
browser = new
|
13
17
|
browser.goto(uri)
|
14
18
|
browser
|
15
19
|
end
|
16
20
|
|
21
|
+
#
|
17
22
|
# Not implemented. Use ClickableElement#click_and_attach instead.
|
23
|
+
#
|
24
|
+
|
18
25
|
def self.attach(*args)
|
19
26
|
raise NotImplementedError, "use ClickableElement#click_and_attach instead"
|
20
27
|
end
|
21
28
|
|
29
|
+
def inspect
|
30
|
+
vars = (instance_variables - %w[@webclient @browser @object])
|
31
|
+
vars = vars.map { |var| "#{var}=#{instance_variable_get(var).inspect}" }.join(" ")
|
32
|
+
'#<%s:0x%s %s>' % [self.class.name, self.hash.to_s(16), vars]
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
22
36
|
# Creates a browser object.
|
23
37
|
#
|
38
|
+
# @see Celerity::Container for an introduction to the main API.
|
39
|
+
#
|
24
40
|
# @option opts :log_level [Symbol] (:warning) @see log_level=
|
25
41
|
# @option opts :browser [:firefox, :internet_explorer] (:internet_explorer) Set the BrowserVersion used by HtmlUnit. Defaults to Internet Explorer.
|
26
42
|
# @option opts :css [Boolean] (false) Enable CSS. Disabled by default.
|
@@ -33,8 +49,10 @@ module Celerity
|
|
33
49
|
# @option opts :proxy [String] (nil) Proxy server to use, in address:port format.
|
34
50
|
#
|
35
51
|
# @return [Celerity::Browser] An instance of the browser.
|
36
|
-
#
|
52
|
+
#
|
37
53
|
# @api public
|
54
|
+
#
|
55
|
+
|
38
56
|
def initialize(opts = {})
|
39
57
|
unless opts.is_a?(Hash)
|
40
58
|
raise TypeError, "wrong argument type #{opts.class}, expected Hash"
|
@@ -58,10 +76,13 @@ module Celerity
|
|
58
76
|
find_viewer
|
59
77
|
end
|
60
78
|
|
79
|
+
#
|
61
80
|
# Goto the given URL
|
62
81
|
#
|
63
82
|
# @param [String] uri The url.
|
64
83
|
# @return [String] The url.
|
84
|
+
#
|
85
|
+
|
65
86
|
def goto(uri)
|
66
87
|
uri = "http://#{uri}" unless uri =~ %r{://}
|
67
88
|
|
@@ -73,37 +94,71 @@ module Celerity
|
|
73
94
|
url()
|
74
95
|
end
|
75
96
|
|
97
|
+
#
|
98
|
+
# Set the credentials used for basic HTTP authentication. (Celerity only)
|
99
|
+
#
|
100
|
+
# Example:
|
101
|
+
# browser.credentials = "username:password"
|
102
|
+
#
|
103
|
+
# @param [String] A string with username / password, separated by a colon
|
104
|
+
#
|
105
|
+
|
106
|
+
def credentials=(string)
|
107
|
+
user, pass = string.split(":")
|
108
|
+
dcp = HtmlUnit::DefaultCredentialsProvider.new
|
109
|
+
dcp.addCredentials(user, pass)
|
110
|
+
@webclient.setCredentialsProvider(dcp)
|
111
|
+
end
|
112
|
+
|
113
|
+
#
|
76
114
|
# Unsets the current page / closes all windows
|
115
|
+
#
|
116
|
+
|
77
117
|
def close
|
78
118
|
@page = nil
|
79
119
|
@webclient.closeAllWindows
|
80
120
|
end
|
81
121
|
|
122
|
+
#
|
82
123
|
# @return [String] the URL of the current page
|
124
|
+
#
|
125
|
+
|
83
126
|
def url
|
84
127
|
assert_exists
|
85
128
|
# will be renamed getUrl => getRequestUrl
|
86
129
|
@page.getWebResponse.getUrl.toString
|
87
130
|
end
|
88
131
|
|
132
|
+
#
|
89
133
|
# @return [String] the title of the current page
|
134
|
+
#
|
135
|
+
|
90
136
|
def title
|
91
137
|
@page ? @page.getTitleText : ''
|
92
138
|
end
|
93
139
|
|
140
|
+
#
|
94
141
|
# @return [String] the HTML content of the current page
|
142
|
+
#
|
143
|
+
|
95
144
|
def html
|
96
145
|
@page ? @page.getWebResponse.getContentAsString : ''
|
97
146
|
end
|
98
|
-
|
147
|
+
|
148
|
+
#
|
99
149
|
# @return [String] the XML representation of the DOM
|
150
|
+
#
|
151
|
+
|
100
152
|
def xml
|
101
153
|
return '' unless @page
|
102
154
|
return @page.asXml if @page.respond_to?(:asXml)
|
103
155
|
return text # fallback to text (for exampel for "plain/text" pages)
|
104
156
|
end
|
105
157
|
|
158
|
+
#
|
106
159
|
# @return [String] a text representation of the current page
|
160
|
+
#
|
161
|
+
|
107
162
|
def text
|
108
163
|
return '' unless @page
|
109
164
|
|
@@ -116,33 +171,45 @@ module Celerity
|
|
116
171
|
# Celerity::Util.normalize_text(string)
|
117
172
|
string
|
118
173
|
end
|
119
|
-
|
174
|
+
|
175
|
+
#
|
120
176
|
# @return [Hash] response headers as a hash
|
177
|
+
#
|
178
|
+
|
121
179
|
def response_headers
|
122
180
|
return {} unless @page
|
123
181
|
|
124
182
|
Hash[*@page.getWebResponse.getResponseHeaders.map { |obj| [obj.name, obj.value] }.flatten]
|
125
183
|
end
|
126
|
-
|
184
|
+
|
185
|
+
#
|
127
186
|
# @return [String] content-type as in 'text/html'
|
187
|
+
#
|
188
|
+
|
128
189
|
def content_type
|
129
190
|
return '' unless @page
|
130
191
|
|
131
192
|
@page.getWebResponse.getContentType
|
132
193
|
end
|
133
|
-
|
194
|
+
|
195
|
+
#
|
134
196
|
# @return [IO, nil] page contents as an IO, returns nil if no page is loaded.
|
197
|
+
#
|
198
|
+
|
135
199
|
def io
|
136
200
|
return nil unless @page
|
137
201
|
|
138
202
|
@page.getWebResponse.getContentAsStream.to_io
|
139
203
|
end
|
140
204
|
|
205
|
+
#
|
141
206
|
# Check if the current page contains the given text.
|
142
207
|
#
|
143
208
|
# @param [String, Regexp] expected_text The text to look for.
|
209
|
+
# @return [Numeric, nil] The index of the matched text, or nil if it isn't found.
|
144
210
|
# @raise [TypeError]
|
145
|
-
#
|
211
|
+
#
|
212
|
+
|
146
213
|
def contains_text(expected_text)
|
147
214
|
return nil unless exist?
|
148
215
|
super
|
@@ -167,36 +234,54 @@ module Celerity
|
|
167
234
|
objects.map { |o| element_from_dom_node(o) }.compact
|
168
235
|
end
|
169
236
|
|
170
|
-
#
|
237
|
+
#
|
238
|
+
# @return [HtmlUnit::HtmlHtml] the underlying HtmlUnit document.
|
239
|
+
#
|
240
|
+
|
171
241
|
def document
|
172
242
|
@object
|
173
243
|
end
|
174
244
|
|
245
|
+
#
|
175
246
|
# Goto the last url - HtmlUnit doesn't have a 'back' functionality, so we only have 1 history item :)
|
176
247
|
# @return [String, nil] The url of the resulting page, or nil if none was stored.
|
248
|
+
#
|
249
|
+
|
177
250
|
def back
|
178
251
|
# TODO: this is naive, need capability from HtmlUnit
|
179
252
|
goto(@last_url) if @last_url
|
180
253
|
end
|
181
254
|
|
255
|
+
#
|
182
256
|
# Wait for javascript jobs to finish
|
257
|
+
#
|
258
|
+
|
183
259
|
def wait
|
184
260
|
assert_exists
|
185
261
|
@page.getEnclosingWindow.getJobManager.waitForAllJobsToFinish(10000)
|
186
262
|
end
|
187
263
|
|
264
|
+
#
|
188
265
|
# Refresh the current page
|
266
|
+
#
|
267
|
+
|
189
268
|
def refresh
|
190
269
|
assert_exists
|
191
270
|
self.page = @page.refresh
|
192
271
|
end
|
193
272
|
|
273
|
+
#
|
194
274
|
# Clears all cookies. (Celerity only)
|
275
|
+
#
|
276
|
+
|
195
277
|
def clear_cookies
|
196
278
|
@webclient.getCookieManager.clearCookies
|
197
279
|
end
|
198
280
|
|
281
|
+
#
|
199
282
|
# Get the cookies for this session. (Celerity only)
|
283
|
+
#
|
284
|
+
|
200
285
|
def cookies
|
201
286
|
result = {}
|
202
287
|
|
@@ -208,8 +293,11 @@ module Celerity
|
|
208
293
|
result
|
209
294
|
end
|
210
295
|
|
296
|
+
#
|
211
297
|
# Execute the given JavaScript on the current page. (Celerity only)
|
212
298
|
# @return [Object] The resulting Object
|
299
|
+
#
|
300
|
+
|
213
301
|
def execute_script(source)
|
214
302
|
assert_exists
|
215
303
|
@page.executeJavaScript(source.to_s).getJavaScriptResult
|
@@ -231,11 +319,14 @@ module Celerity
|
|
231
319
|
end
|
232
320
|
end
|
233
321
|
|
322
|
+
#
|
234
323
|
# Wait until the given block evaluates to true (Celerity only)
|
235
324
|
#
|
236
325
|
# @param [Fixnum] timeout Number of seconds to wait before timing out (default: 30).
|
237
326
|
# @yieldparam [Celerity::Browser] browser The browser instance.
|
238
327
|
# @see Celerity::Browser#resynchronized
|
328
|
+
#
|
329
|
+
|
239
330
|
def wait_until(timeout = 30, &block)
|
240
331
|
Timeout.timeout(timeout) do
|
241
332
|
until yield(self)
|
@@ -245,11 +336,14 @@ module Celerity
|
|
245
336
|
end
|
246
337
|
end
|
247
338
|
|
339
|
+
#
|
248
340
|
# Wait while the given block evaluates to true (Celerity only)
|
249
341
|
#
|
250
342
|
# @param [Fixnum] timeout Number of seconds to wait before timing out (default: 30).
|
251
343
|
# @yieldparam [Celerity::Browser] browser The browser instance.
|
252
344
|
# @see Celerity::Browser#resynchronized
|
345
|
+
#
|
346
|
+
|
253
347
|
def wait_while(timeout = 30, &block)
|
254
348
|
Timeout.timeout(timeout) do
|
255
349
|
while yield(self)
|
@@ -259,11 +353,77 @@ module Celerity
|
|
259
353
|
end
|
260
354
|
end
|
261
355
|
|
356
|
+
#
|
357
|
+
# Allows you to temporarily switch to HtmlUnit's NicelyResynchronizingAjaxController to resynchronize ajax calls.
|
358
|
+
#
|
359
|
+
# @browser.resynchronized do |b|
|
360
|
+
# b.link(:id, 'load_fancy_ajax_stuff').click
|
361
|
+
# end
|
362
|
+
#
|
363
|
+
# @yieldparam [Celerity::Browser] browser The current browser object.
|
364
|
+
# @see Celerity::Browser#new for options on how to always use this.
|
365
|
+
#
|
366
|
+
|
367
|
+
def resynchronized(&block)
|
368
|
+
old_controller = @webclient.ajaxController
|
369
|
+
@webclient.setAjaxController(::HtmlUnit::NicelyResynchronizingAjaxController.new)
|
370
|
+
|
371
|
+
yield(self)
|
372
|
+
|
373
|
+
@webclient.setAjaxController(old_controller)
|
374
|
+
end
|
375
|
+
|
376
|
+
#
|
377
|
+
# Start or stop HtmlUnit's DebuggingWebConnection. (Celerity only)
|
378
|
+
# The output will go to /tmp/«name»
|
379
|
+
#
|
380
|
+
# @param [Boolean] bool start or stop
|
381
|
+
# @param [String] name required if bool is true
|
382
|
+
#
|
383
|
+
|
384
|
+
def debug_web_connection(bool, name = nil)
|
385
|
+
if bool
|
386
|
+
raise "no name given" unless name
|
387
|
+
@old_webconnection = @webclient.getWebConnection
|
388
|
+
dwc = HtmlUnit::Util::DebuggingWebConnection.new(@old_webconnection, name)
|
389
|
+
@webclient.setWebConnection(dwc)
|
390
|
+
$stderr.puts "debug-webconnection on"
|
391
|
+
else
|
392
|
+
@webclient.setWebConnection(@old_webconnection) if @old_webconnection
|
393
|
+
$stderr.puts "debug-webconnection off"
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
#
|
398
|
+
# Add a listener block for one of the available types. (Celerity only)
|
399
|
+
# Types map to HtmlUnit interfaces like this:
|
400
|
+
#
|
401
|
+
# :status => StatusHandler
|
402
|
+
# :alert => AlertHandler ( window.alert() )
|
403
|
+
# :web_window_event => WebWindowListener
|
404
|
+
# :html_parser => HTMLParserListener
|
405
|
+
# :incorrectness => IncorrectnessListener
|
406
|
+
# :confirm => ConfirmHandler ( window.confirm() )
|
407
|
+
# :prompt => PromptHandler ( window.prompt() )
|
408
|
+
#
|
409
|
+
#
|
410
|
+
# @param [Symbol] type One of the above symbols.
|
411
|
+
# @param [Proc] block A block to be executed for events of this type.
|
412
|
+
#
|
413
|
+
|
414
|
+
def add_listener(type, &block)
|
415
|
+
@listener ||= Celerity::Listener.new(@webclient)
|
416
|
+
@listener.add_listener(type, &block)
|
417
|
+
end
|
418
|
+
|
419
|
+
#
|
262
420
|
# Add a 'checker' proc that will be run on every page load
|
263
421
|
#
|
264
422
|
# @param [Proc] checker The proc to be run (can also be given as a block)
|
265
423
|
# @yieldparam [Celerity::Browser] browser The current browser object.
|
266
424
|
# @raise [ArgumentError] if no Proc or block was given.
|
425
|
+
#
|
426
|
+
|
267
427
|
def add_checker(checker = nil, &block)
|
268
428
|
if block_given?
|
269
429
|
@error_checkers << block
|
@@ -274,76 +434,52 @@ module Celerity
|
|
274
434
|
end
|
275
435
|
end
|
276
436
|
|
437
|
+
#
|
277
438
|
# Remove the given checker from the list of checkers
|
278
439
|
# @param [Proc] checker The Proc to disable.
|
440
|
+
#
|
441
|
+
|
279
442
|
def disable_checker(checker)
|
280
443
|
@error_checkers.delete(checker)
|
281
444
|
end
|
282
|
-
|
445
|
+
|
446
|
+
#
|
283
447
|
# :finest, :finer, :fine, :config, :info, :warning, :severe, or :off, :all
|
448
|
+
#
|
284
449
|
# @return [Symbol] the current log level
|
450
|
+
#
|
451
|
+
|
285
452
|
def log_level
|
286
453
|
java.util.logging.Logger.getLogger('com.gargoylesoftware.htmlunit').level.to_s.downcase.to_sym
|
287
454
|
end
|
288
455
|
|
456
|
+
#
|
289
457
|
# Set Java log level (default is :warning)
|
290
458
|
#
|
291
459
|
# @param [Symbol] level :finest, :finer, :fine, :config, :info, :warning, :severe, or :off, :all
|
460
|
+
#
|
461
|
+
|
292
462
|
def log_level=(level)
|
293
463
|
java.util.logging.Logger.getLogger('com.gargoylesoftware.htmlunit').level = java.util.logging.Level.const_get(level.to_s.upcase)
|
294
464
|
end
|
295
465
|
|
466
|
+
#
|
296
467
|
# Checks if we have a page currently loaded.
|
297
468
|
# @return [true, false]
|
469
|
+
#
|
470
|
+
|
298
471
|
def exist?
|
299
472
|
!!@page
|
300
473
|
end
|
301
474
|
alias_method :exists?, :exist?
|
302
475
|
|
303
|
-
# Allows you to temporarily switch to HtmlUnit's NicelyResynchronizingAjaxController to resynchronize ajax calls.
|
304
|
-
#
|
305
|
-
# @browser.resynchronized do |b|
|
306
|
-
# b.link(:id, 'load_fancy_ajax_stuff').click
|
307
|
-
# end
|
308
|
-
#
|
309
|
-
# @yieldparam [Celerity::Browser] browser The current browser object.
|
310
|
-
# @see Celerity::Browser#new for options on how to always use this.
|
311
|
-
def resynchronized(&block)
|
312
|
-
old_controller = @webclient.ajaxController
|
313
|
-
@webclient.setAjaxController(::HtmlUnit::NicelyResynchronizingAjaxController.new)
|
314
|
-
|
315
|
-
yield(self)
|
316
|
-
|
317
|
-
@webclient.setAjaxController(old_controller)
|
318
|
-
end
|
319
|
-
|
320
|
-
#--
|
321
|
-
# TODO: could be private?
|
322
|
-
#++
|
323
476
|
#
|
324
|
-
#
|
477
|
+
# Sets the current page object for the browser
|
325
478
|
#
|
326
|
-
# @
|
479
|
+
# @param [HtmlUnit::HtmlPage] value The page to set.
|
327
480
|
# @api private
|
328
|
-
def assert_exists
|
329
|
-
raise UnknownObjectException, "no page loaded" unless exist?
|
330
|
-
end
|
331
|
-
|
332
|
-
#--
|
333
|
-
# TODO: could be private?
|
334
|
-
#++
|
335
|
-
# Runs the all the checker procs added by +add_checker+
|
336
481
|
#
|
337
|
-
# @see add_checker
|
338
|
-
# @api private
|
339
|
-
def run_error_checks
|
340
|
-
@error_checkers.each { |e| e[self] }
|
341
|
-
end
|
342
482
|
|
343
|
-
# Set the current page object for the browser
|
344
|
-
#
|
345
|
-
# @param [HtmlUnit::HtmlPage] value The page to set.
|
346
|
-
# @api private
|
347
483
|
def page=(value)
|
348
484
|
@last_url = url() if exist?
|
349
485
|
@page = value
|
@@ -360,47 +496,35 @@ module Celerity
|
|
360
496
|
value
|
361
497
|
end
|
362
498
|
|
363
|
-
# Start or stop HtmlUnit's DebuggingWebConnection.
|
364
|
-
# The output will go to /tmp/«name»
|
365
|
-
#
|
366
|
-
# @param [Boolean] bool start or stop
|
367
|
-
# @param [String] name required if bool is true
|
368
|
-
def debug_web_connection(bool, name = nil)
|
369
|
-
if bool
|
370
|
-
raise "no name given" unless name
|
371
|
-
@old_webconnection = @webclient.getWebConnection
|
372
|
-
dwc = HtmlUnit::Util::DebuggingWebConnection.new(@old_webconnection, name)
|
373
|
-
@webclient.setWebConnection(dwc)
|
374
|
-
$stderr.puts "debug-webconnection on"
|
375
|
-
else
|
376
|
-
@webclient.setWebConnection(@old_webconnection) if @old_webconnection
|
377
|
-
$stderr.puts "debug-webconnection off"
|
378
|
-
end
|
379
|
-
end
|
380
|
-
|
381
|
-
# Add a listener block for one of the available types.
|
382
|
-
# Types map to HtmlUnit interfaces like this:
|
383
|
-
#
|
384
|
-
# :status => StatusHandler
|
385
|
-
# :alert => AlertHandler ( window.alert() )
|
386
|
-
# :web_window_event => WebWindowListener
|
387
|
-
# :html_parser => HTMLParserListener
|
388
|
-
# :incorrectness => IncorrectnessListener
|
389
|
-
# :confirm => ConfirmHandler ( window.confirm() )
|
390
|
-
# :prompt => PromptHandler ( window.prompt() )
|
391
499
|
#
|
500
|
+
# Check that we have a @page object.
|
392
501
|
#
|
393
|
-
# @
|
394
|
-
# @
|
395
|
-
|
396
|
-
|
397
|
-
|
502
|
+
# @raise [Celerity::Exception::UnknownObjectException] if no page is loaded.
|
503
|
+
# @api private
|
504
|
+
#
|
505
|
+
|
506
|
+
def assert_exists
|
507
|
+
raise UnknownObjectException, "no page loaded" unless exist?
|
398
508
|
end
|
399
509
|
|
400
510
|
private
|
401
511
|
|
512
|
+
#
|
513
|
+
# Runs the all the checker procs added by +add_checker+
|
514
|
+
#
|
515
|
+
# @see add_checker
|
516
|
+
# @api private
|
517
|
+
#
|
518
|
+
|
519
|
+
def run_error_checks
|
520
|
+
@error_checkers.each { |e| e[self] }
|
521
|
+
end
|
522
|
+
|
523
|
+
#
|
402
524
|
# Configure the webclient according to the options given to #new.
|
403
525
|
# @see initialize
|
526
|
+
#
|
527
|
+
|
404
528
|
def setup_webclient(opts)
|
405
529
|
browser = case opts.delete(:browser)
|
406
530
|
when :firefox then ::HtmlUnit::BrowserVersion::FIREFOX_2
|
@@ -421,9 +545,12 @@ module Celerity
|
|
421
545
|
@webclient.setAjaxController(::HtmlUnit::NicelyResynchronizingAjaxController.new) if opts.delete(:resynchronize)
|
422
546
|
end
|
423
547
|
|
548
|
+
#
|
424
549
|
# This *should* be unneccessary, but sometimes the page we get from the
|
425
550
|
# window is different (ie. a different object) from our current @page
|
426
551
|
# (Used by #wait_while and #wait_until)
|
552
|
+
#
|
553
|
+
|
427
554
|
def refresh_page_from_window
|
428
555
|
new_page = @page.getEnclosingWindow.getEnclosedPage
|
429
556
|
|
@@ -433,17 +560,23 @@ module Celerity
|
|
433
560
|
Log.debug "unneccessary refresh"
|
434
561
|
end
|
435
562
|
end
|
436
|
-
|
563
|
+
|
564
|
+
#
|
437
565
|
# Render the current page on the viewer.
|
438
566
|
# @api private
|
567
|
+
#
|
568
|
+
|
439
569
|
def render
|
440
570
|
@viewer.render_html(self.send(@render_type), url)
|
441
571
|
rescue DRb::DRbConnError, Errno::ECONNREFUSED => e
|
442
572
|
@viewer = DefaultViewer
|
443
573
|
end
|
444
574
|
|
575
|
+
#
|
445
576
|
# Check if we have a viewer available on druby://127.0.0.1:6429
|
446
577
|
# @api private
|
578
|
+
#
|
579
|
+
|
447
580
|
def find_viewer
|
448
581
|
viewer = DRbObject.new_with_uri("druby://127.0.0.1:6429")
|
449
582
|
if viewer.respond_to?(:render_html)
|
@@ -455,6 +588,10 @@ module Celerity
|
|
455
588
|
@viewer = DefaultViewer
|
456
589
|
end
|
457
590
|
|
591
|
+
#
|
592
|
+
# Convert the given HtmlUnit object to a Celerity object
|
593
|
+
#
|
594
|
+
|
458
595
|
def element_from_dom_node(obj)
|
459
596
|
if element_class = Celerity::Util.htmlunit2celerity(obj.class)
|
460
597
|
element_class.new(self, :object, obj)
|