jarib-celerity 0.0.6.7 → 0.0.6.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/README.txt +4 -0
  2. data/lib/celerity/browser.rb +36 -21
  3. data/lib/celerity/clickable_element.rb +16 -1
  4. data/lib/celerity/collections.rb +2 -2
  5. data/lib/celerity/default_viewer.rb +1 -1
  6. data/lib/celerity/disabled_element.rb +5 -5
  7. data/lib/celerity/element.rb +25 -21
  8. data/lib/celerity/element_collection.rb +14 -14
  9. data/lib/celerity/element_locator.rb +9 -9
  10. data/lib/celerity/elements/button.rb +9 -9
  11. data/lib/celerity/elements/file_field.rb +3 -3
  12. data/lib/celerity/elements/form.rb +5 -5
  13. data/lib/celerity/elements/frame.rb +2 -2
  14. data/lib/celerity/elements/image.rb +2 -2
  15. data/lib/celerity/elements/label.rb +1 -1
  16. data/lib/celerity/elements/link.rb +4 -4
  17. data/lib/celerity/elements/non_control_elements.rb +3 -3
  18. data/lib/celerity/elements/option.rb +5 -5
  19. data/lib/celerity/elements/radio_check.rb +16 -16
  20. data/lib/celerity/elements/select_list.rb +16 -16
  21. data/lib/celerity/elements/table.rb +15 -12
  22. data/lib/celerity/elements/table_row.rb +3 -3
  23. data/lib/celerity/elements/text_field.rb +22 -25
  24. data/lib/celerity/exception.rb +5 -5
  25. data/lib/celerity/htmlunit.rb +8 -2
  26. data/lib/celerity/htmlunit/htmlunit-2.6-SNAPSHOT.jar +0 -0
  27. data/lib/celerity/htmlunit/{nekohtml-1.9.12.jar → nekohtml-1.9.13-20090507.082850-2.jar} +0 -0
  28. data/lib/celerity/listener.rb +17 -17
  29. data/lib/celerity/util.rb +1 -1
  30. data/lib/celerity/version.rb +2 -2
  31. data/lib/celerity/watir_compatibility.rb +2 -2
  32. metadata +7 -9
  33. data/lib/celerity/extra/method_generator.rb +0 -170
  34. data/lib/celerity/htmlunit/htmlunit-2.5.jar +0 -0
data/README.txt CHANGED
@@ -50,6 +50,10 @@ The source code is available at http://github.com/jarib/celerity/tree/master
50
50
 
51
51
  * http://github.com/jarib/celerity/wikis
52
52
 
53
+ == BUG TRACKER:
54
+
55
+ * http://github.com/jarib/celerity/issues
56
+
53
57
  == LICENSE:
54
58
 
55
59
  Celerity - JRuby wrapper for HtmlUnit
@@ -3,7 +3,7 @@ module Celerity
3
3
  include Container
4
4
 
5
5
  attr_accessor :page, :object, :charset
6
- attr_reader :webclient, :viewer
6
+ attr_reader :webclient, :viewer, :options
7
7
 
8
8
  #
9
9
  # Initialize a browser and go to the given URL
@@ -27,7 +27,7 @@ module Celerity
27
27
  end
28
28
 
29
29
  def inspect
30
- short_inspect :exclude => %w[@webclient @browser @object]
30
+ short_inspect :exclude => %w[@webclient @browser @object @options]
31
31
  end
32
32
 
33
33
  #
@@ -43,7 +43,7 @@ module Celerity
43
43
  # @option opts :javascript_exceptions [Boolean] (false) Raise exceptions on script errors. Disabled by default.
44
44
  # @option opts :status_code_exceptions [Boolean] (false) Raise exceptions on failing status codes (404 etc.). Disabled by default.
45
45
  # @option opts :render [:html, :xml] (:html) What DOM representation to send to connected viewers.
46
- # @option opts :charset [String] ("UTF-8") Specify the charset that webclient will use by default.
46
+ # @option opts :charset [String] ("UTF-8") Specify the charset that webclient will use for requests, and those where texts are getting gibberished, like Browser#html.
47
47
  # @option opts :proxy [String] (nil) Proxy server to use, in address:port format.
48
48
  # @option opts :user_agent [String] Override the User-Agent set by the :browser option
49
49
  #
@@ -61,6 +61,8 @@ module Celerity
61
61
  raise ArgumentError, "expected one of #{render_types.inspect} for key :render"
62
62
  end
63
63
 
64
+ @options = opts.dup # for ClickableElement#click_and_attach
65
+
64
66
  @render_type = opts.delete(:render) || :html
65
67
  @charset = opts.delete(:charset) || "UTF-8"
66
68
  self.log_level = opts.delete(:log_level) || :warning
@@ -142,7 +144,7 @@ module Celerity
142
144
  #
143
145
 
144
146
  def html
145
- @page ? @page.getWebResponse.getContentAsString : ''
147
+ @page ? @page.getWebResponse.getContentAsString(@charset) : ''
146
148
  end
147
149
 
148
150
  #
@@ -164,8 +166,10 @@ module Celerity
164
166
 
165
167
  if @page.respond_to?("getContent")
166
168
  string = @page.getContent.strip
167
- else
169
+ elsif @page.documentElement
168
170
  string = @page.documentElement.asText.strip
171
+ else
172
+ string = ''
169
173
  end
170
174
 
171
175
  # Celerity::Util.normalize_text(string)
@@ -421,7 +425,8 @@ module Celerity
421
425
  end
422
426
 
423
427
  #
424
- # Allows you to temporarily switch to HtmlUnit's NicelyResynchronizingAjaxController to resynchronize ajax calls.
428
+ # Allows you to temporarily switch to HtmlUnit's NicelyResynchronizingAjaxController
429
+ # to resynchronize ajax calls.
425
430
  #
426
431
  # @browser.resynchronized do |b|
427
432
  # b.link(:id, 'trigger_ajax_call').click
@@ -439,8 +444,9 @@ module Celerity
439
444
  end
440
445
 
441
446
  #
442
- # Allows you to temporarliy switch to HtmlUnit's default AjaxController, so ajax calls are performed asynchronously.
443
- # This is useful if you have created the Browser with :resynchronize => true, but want to switch it off temporarily.
447
+ # Allows you to temporarliy switch to HtmlUnit's default AjaxController, so
448
+ # ajax calls are performed asynchronously. This is useful if you have created
449
+ # the Browser with :resynchronize => true, but want to switch it off temporarily.
444
450
  #
445
451
  # @yieldparam [Celerity::Browser] browser The current browser object.
446
452
  # @see Celerity::Browser#new
@@ -485,6 +491,16 @@ module Celerity
485
491
  # :incorrectness => IncorrectnessListener
486
492
  # :confirm => ConfirmHandler ( window.confirm() )
487
493
  # :prompt => PromptHandler ( window.prompt() )
494
+ #
495
+ # Examples:
496
+ #
497
+ # browser.add_listener(:status) { |page, message| ... }
498
+ # browser.add_listener(:alert) { |page, message| ... }
499
+ # browser.add_listener(:web_window_event) { |web_window_event| ... }
500
+ # browser.add_listener(:html_parser) { |message, url, line, column, key| ... }
501
+ # browser.add_listener(:incorrectness) { |message, origin| ... }
502
+ # browser.add_listener(:confirm) { |page, message| ...; true }
503
+ # browser.add_listener(:prompt) { |page, message| ... }
488
504
  #
489
505
  #
490
506
  # @param [Symbol] type One of the above symbols.
@@ -551,18 +567,18 @@ module Celerity
551
567
  end
552
568
 
553
569
  #
554
- # Set Java log level (default is :warning)
570
+ # Set Java log level (default is :warning, can be any of :all, :finest, :finer, :fine, :config, :info, :warning, :severe, :off)
555
571
  #
556
- # @param [Symbol] level :finest, :finer, :fine, :config, :info, :warning, :severe, or :off, :all
572
+ # @param [Symbol] level The new log level.
557
573
  #
558
574
 
559
575
  def log_level=(level)
560
576
  log_level = java.util.logging.Level.const_get(level.to_s.upcase)
561
577
 
562
- [ logger_for('com.gargoylesoftware.htmlunit'),
563
- logger_for("org.apache.commons.htmlunit.html"),
564
- logger_for("org.apache.commons.httpclient")
565
- ].each { |logger| logger.level = log_level }
578
+ [ 'com.gargoylesoftware.htmlunit',
579
+ 'com.gargoylesoftware.htmlunit.html',
580
+ 'org.apache.commons.httpclient'
581
+ ].each { |package| logger_for(package).level = log_level }
566
582
 
567
583
  level
568
584
  end
@@ -707,8 +723,7 @@ module Celerity
707
723
 
708
724
  if ua = opts.delete(:user_agent)
709
725
  browser_version.setUserAgent(ua)
710
- end
711
-
726
+ end
712
727
 
713
728
  if proxy = opts.delete(:proxy)
714
729
  phost, pport = proxy.split(":")
@@ -757,6 +772,9 @@ module Celerity
757
772
  #
758
773
 
759
774
  def find_viewer
775
+ # needed to avoid DRb raising and rescuing lots exceptions
776
+ DRb.start_service unless DRb.primary_server
777
+
760
778
  viewer = DRbObject.new_with_uri("druby://127.0.0.1:6429")
761
779
  if viewer.respond_to?(:render_html)
762
780
  @viewer = viewer
@@ -772,11 +790,8 @@ module Celerity
772
790
  #
773
791
 
774
792
  def element_from_dom_node(obj)
775
- if element_class = Celerity::Util.htmlunit2celerity(obj.class)
776
- element_class.new(self, :object, obj)
777
- else
778
- Element.new(self, :object, obj)
779
- end
793
+ element_class = Celerity::Util.htmlunit2celerity(obj.class) || Element
794
+ element_class.new(self, :object, obj)
780
795
  end
781
796
 
782
797
  def logger_for(class_string)
@@ -37,12 +37,27 @@ module Celerity
37
37
 
38
38
  def click_and_attach
39
39
  assert_exists_and_enabled
40
- browser = Browser.new(:log_level => @browser.log_level)
40
+ browser = Browser.new(@browser.options.dup)
41
+ browser.webclient.set_cookie_manager(
42
+ @browser.webclient.get_cookie_manager
43
+ ) # hirobumi: we do want cookies as well.
44
+
41
45
  rescue_status_code_exception { browser.update_page(@object.click) }
42
46
 
43
47
  browser
44
48
  end
45
49
 
50
+ #
51
+ # Click the element and just return the content as IO. Current page stays unchanged.
52
+ #
53
+ # @return [IO]
54
+ #
55
+
56
+ def download
57
+ assert_exists_and_enabled
58
+ @object.click.getWebResponse.getContentAsStream.to_io
59
+ end
60
+
46
61
  private
47
62
 
48
63
  def assert_exists_and_enabled
@@ -51,7 +51,7 @@ module Celerity
51
51
  class Dts < ElementCollection
52
52
  def element_class; Dt; end
53
53
  end
54
-
54
+
55
55
  class Ems < ElementCollection
56
56
  def element_class; Em; end
57
57
  end
@@ -113,7 +113,7 @@ module Celerity
113
113
  class Spans < ElementCollection
114
114
  def element_class; Span; end
115
115
  end
116
-
116
+
117
117
  class Strongs < ElementCollection
118
118
  def element_class; Strong; end
119
119
  end
@@ -1,7 +1,7 @@
1
1
  module Celerity
2
2
  class DefaultViewer
3
3
  IMAGE = "#{Celerity::DIR}/resources/no_viewer.png"
4
-
4
+
5
5
  def self.save(path = nil)
6
6
  return unless path
7
7
  FileUtils.copy(IMAGE, path)
@@ -1,12 +1,12 @@
1
1
  module Celerity
2
-
2
+
3
3
  #
4
4
  # Mixed in to all elements that can have the 'disabled' attribute.
5
5
  #
6
6
 
7
7
  module DisabledElement
8
8
  include Celerity::Exception
9
-
9
+
10
10
  #
11
11
  # Returns false if the element is disabled.
12
12
  #
@@ -17,14 +17,14 @@ module Celerity
17
17
 
18
18
  #
19
19
  # Returns true if the element is disabled.
20
- #
21
-
20
+ #
21
+
22
22
  def disabled?
23
23
  assert_exists unless defined?(@object) && @object
24
24
  @object.isDisabled
25
25
  end
26
26
  alias_method :disabled, :disabled?
27
-
27
+
28
28
  #
29
29
  # Used internally.
30
30
  # @api private
@@ -1,9 +1,9 @@
1
1
  module Celerity
2
-
2
+
3
3
  #
4
4
  # Superclass for all HTML elements.
5
- #
6
-
5
+ #
6
+
7
7
  class Element
8
8
  include Exception
9
9
  include Container
@@ -57,7 +57,7 @@ module Celerity
57
57
  #
58
58
  # Get the parent element
59
59
  # @return [Celerity::Element, nil] subclass of Celerity::Element, or nil if no parent was found
60
- #
60
+ #
61
61
 
62
62
  def parent
63
63
  assert_exists
@@ -73,13 +73,13 @@ module Celerity
73
73
 
74
74
  #
75
75
  # Sets the focus to this element.
76
- #
76
+ #
77
77
 
78
78
  def focus
79
79
  assert_exists
80
80
  @object.focus
81
81
  end
82
-
82
+
83
83
  #
84
84
  # Fires the given event for this element
85
85
  #
@@ -92,12 +92,16 @@ module Celerity
92
92
  #
93
93
  # Used internally. Find the element on the page.
94
94
  # @api private
95
- #
95
+ #
96
96
 
97
97
  def locate
98
98
  @object = ElementLocator.new(@container, self.class).find_by_conditions(@conditions)
99
99
  end
100
100
 
101
+ #
102
+ # Returns the HtmlUnit object backing this element
103
+ #
104
+
101
105
  def object
102
106
  @object || locate
103
107
  end
@@ -114,7 +118,7 @@ module Celerity
114
118
  #
115
119
  # @param [String, #to_s] The attribute.
116
120
  # @return [String] The value of the given attribute.
117
- #
121
+ #
118
122
 
119
123
  def attribute_value(attribute)
120
124
  assert_exists
@@ -127,7 +131,7 @@ module Celerity
127
131
  # its parents) into account - styles from applied CSS is not considered.
128
132
  #
129
133
  # @return [boolean]
130
- #
134
+ #
131
135
 
132
136
  def visible?
133
137
  assert_exists
@@ -139,7 +143,7 @@ module Celerity
139
143
  #
140
144
  # @raise [Celerity::Exception::UnknownObjectException] if the element can't be found.
141
145
  # @api private
142
- #
146
+ #
143
147
 
144
148
  def assert_exists
145
149
  locate
@@ -147,11 +151,11 @@ module Celerity
147
151
  raise UnknownObjectException, "Unable to locate #{self.class.name[/::(.*)$/, 1]}, using #{identifier_string}"
148
152
  end
149
153
  end
150
-
154
+
151
155
  #
152
156
  # Checks if the element exists.
153
157
  # @return [true, false]
154
- #
158
+ #
155
159
 
156
160
  def exists?
157
161
  assert_exists
@@ -160,13 +164,13 @@ module Celerity
160
164
  false
161
165
  end
162
166
  alias_method :exist?, :exists?
163
-
167
+
164
168
  #
165
169
  # Return a text representation of the element as it would appear in a browser.
166
170
  #
167
171
  # @see inner_text
168
172
  # @return [String]
169
- #
173
+ #
170
174
 
171
175
  def text
172
176
  assert_exists
@@ -180,7 +184,7 @@ module Celerity
180
184
  #
181
185
  # @see text
182
186
  # @return [String]
183
- #
187
+ #
184
188
 
185
189
  def inner_text
186
190
  assert_exists
@@ -189,7 +193,7 @@ module Celerity
189
193
 
190
194
  #
191
195
  # @return [String] The normative XML representation of the element (including children).
192
- #
196
+ #
193
197
 
194
198
  def to_xml
195
199
  assert_exists
@@ -201,7 +205,7 @@ module Celerity
201
205
 
202
206
  #
203
207
  # @return [String] A string representation of the element's attributes.
204
- #
208
+ #
205
209
 
206
210
  def attribute_string
207
211
  assert_exists
@@ -216,7 +220,7 @@ module Celerity
216
220
 
217
221
  #
218
222
  # return the canonical xpath for this element (Celerity-specific)
219
- #
223
+ #
220
224
 
221
225
  def xpath
222
226
  assert_exists
@@ -230,7 +234,7 @@ module Celerity
230
234
  #
231
235
  # @return [String] The resulting attribute.
232
236
  # @raise [NoMethodError] if the element doesn't support this attribute.
233
- #
237
+ #
234
238
 
235
239
  def method_missing(meth, *args, &blk)
236
240
  assert_exists
@@ -243,9 +247,9 @@ module Celerity
243
247
  Log.warn "Element\#method_missing calling super with #{meth.inspect}"
244
248
  super
245
249
  end
246
-
250
+
247
251
  def methods(*args)
248
- ms = super
252
+ ms = super
249
253
  ms += self.class::ATTRIBUTES.map { |e| e.to_s }
250
254
  ms.sort
251
255
  end
@@ -1,13 +1,13 @@
1
1
  module Celerity
2
-
2
+
3
3
  #
4
4
  # This class is the superclass for the iterator classes (Buttons, Links, Spans etc.)
5
5
  # It would normally only be accessed by the iterator methods (Browser#spans, Browser#links, ...).
6
- #
7
-
6
+ #
7
+
8
8
  class ElementCollection
9
9
  include Enumerable
10
-
10
+
11
11
  #
12
12
  # @api private
13
13
  #
@@ -17,10 +17,10 @@ module Celerity
17
17
  @object = (how == :object ? what : nil)
18
18
  @length = length
19
19
  end
20
-
20
+
21
21
  #
22
22
  # @return [Fixnum] The number of elements in this collection.
23
- #
23
+ #
24
24
 
25
25
  def length
26
26
  if @object
@@ -45,7 +45,7 @@ module Celerity
45
45
 
46
46
  @length
47
47
  end
48
-
48
+
49
49
  #
50
50
  # Get the element at the given index.
51
51
  # This is 1-indexed to keep compatibility with Watir - subject to change.
@@ -54,7 +54,7 @@ module Celerity
54
54
  #
55
55
  # @param [Fixnum] n Index of wanted element, 1-indexed.
56
56
  # @return [Celerity::Element] Returns a subclass of Celerity::Element
57
- #
57
+ #
58
58
 
59
59
  def [](n)
60
60
  if @elements && @elements[n - INDEX_OFFSET]
@@ -68,8 +68,8 @@ module Celerity
68
68
  # Get the first element in this collection. (Celerity-specific)
69
69
  #
70
70
  # @return [Celerity::Element] Returns a subclass of Celerity::Element
71
- #
72
-
71
+ #
72
+
73
73
  def first
74
74
  self[INDEX_OFFSET]
75
75
  end
@@ -78,8 +78,8 @@ module Celerity
78
78
  # Get the last element in this collection. (Celerity-specific)
79
79
  #
80
80
  # @return [Celerity::Element] Returns a subclass of Celerity::Element
81
- #
82
-
81
+ #
82
+
83
83
  def last
84
84
  self[INDEX_OFFSET - 1]
85
85
  end
@@ -90,8 +90,8 @@ module Celerity
90
90
  # puts browser.text_fields
91
91
  #
92
92
  # @return [String] A string representation of all elements in this collection.
93
- #
94
-
93
+ #
94
+
95
95
  def to_s
96
96
  map { |e| e.to_s }.join("\n")
97
97
  end