celerity 0.0.6 → 0.0.7

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 (75) hide show
  1. data/History.txt +36 -0
  2. data/Manifest.txt +82 -0
  3. data/README.rdoc +78 -0
  4. data/Rakefile +25 -10
  5. data/celerity.gemspec +40 -0
  6. data/lib/celerity.rb +36 -20
  7. data/lib/celerity/browser.rb +396 -189
  8. data/lib/celerity/clickable_element.rb +25 -5
  9. data/lib/celerity/collections.rb +2 -2
  10. data/lib/celerity/container.rb +74 -61
  11. data/lib/celerity/default_viewer.rb +8 -4
  12. data/lib/celerity/disabled_element.rb +5 -5
  13. data/lib/celerity/element.rb +57 -35
  14. data/lib/celerity/element_collection.rb +22 -21
  15. data/lib/celerity/element_locator.rb +25 -18
  16. data/lib/celerity/elements/button.rb +13 -11
  17. data/lib/celerity/elements/file_field.rb +8 -4
  18. data/lib/celerity/elements/form.rb +7 -5
  19. data/lib/celerity/elements/frame.rb +6 -4
  20. data/lib/celerity/elements/image.rb +4 -4
  21. data/lib/celerity/elements/label.rb +1 -1
  22. data/lib/celerity/elements/link.rb +5 -5
  23. data/lib/celerity/elements/meta.rb +2 -1
  24. data/lib/celerity/elements/non_control_elements.rb +3 -3
  25. data/lib/celerity/elements/option.rb +7 -7
  26. data/lib/celerity/elements/radio_check.rb +18 -18
  27. data/lib/celerity/elements/select_list.rb +55 -25
  28. data/lib/celerity/elements/table.rb +21 -18
  29. data/lib/celerity/elements/table_cell.rb +1 -1
  30. data/lib/celerity/elements/table_elements.rb +1 -1
  31. data/lib/celerity/elements/table_row.rb +5 -5
  32. data/lib/celerity/elements/text_field.rb +33 -28
  33. data/lib/celerity/exception.rb +11 -5
  34. data/lib/celerity/htmlunit.rb +24 -8
  35. data/lib/celerity/htmlunit/commons-codec-1.4.jar +0 -0
  36. data/lib/celerity/htmlunit/htmlunit-2.6.jar +0 -0
  37. data/lib/celerity/htmlunit/htmlunit-core-js-2.6.jar +0 -0
  38. data/lib/celerity/htmlunit/nekohtml-1.9.13.jar +0 -0
  39. data/lib/celerity/htmlunit/{xercesImpl-2.8.1.jar → xercesImpl-2.9.1.jar} +0 -0
  40. data/lib/celerity/ignoring_web_connection.rb +15 -0
  41. data/lib/celerity/input_element.rb +1 -1
  42. data/lib/celerity/listener.rb +23 -17
  43. data/lib/celerity/short_inspect.rb +20 -0
  44. data/lib/celerity/util.rb +5 -2
  45. data/lib/celerity/version.rb +3 -10
  46. data/lib/celerity/viewer_connection.rb +89 -0
  47. data/lib/celerity/watir_compatibility.rb +2 -5
  48. data/lib/celerity/xpath_support.rb +48 -0
  49. data/spec/browser_authentication_spec.rb +16 -0
  50. data/spec/browser_spec.rb +300 -0
  51. data/spec/clickable_element_spec.rb +39 -0
  52. data/spec/default_viewer_spec.rb +23 -0
  53. data/spec/element_spec.rb +51 -0
  54. data/spec/filefield_spec.rb +18 -0
  55. data/spec/htmlunit_spec.rb +56 -0
  56. data/spec/index_offset_spec.rb +24 -0
  57. data/spec/listener_spec.rb +142 -0
  58. data/spec/spec_helper.rb +8 -0
  59. data/tasks/benchmark.rake +4 -0
  60. data/tasks/deployment.rake +43 -0
  61. data/tasks/environment.rake +7 -0
  62. data/tasks/fix.rake +25 -0
  63. data/tasks/jar.rake +4 -6
  64. data/tasks/rspec.rake +43 -0
  65. data/tasks/simple_ci.rake +94 -0
  66. data/tasks/snapshot.rake +22 -0
  67. data/tasks/website.rake +17 -0
  68. data/tasks/yard.rake +9 -0
  69. metadata +59 -26
  70. data/README.txt +0 -69
  71. data/lib/celerity/extra/method_generator.rb +0 -170
  72. data/lib/celerity/htmlunit/commons-codec-1.3.jar +0 -0
  73. data/lib/celerity/htmlunit/htmlunit-2.5-SNAPSHOT.jar +0 -0
  74. data/lib/celerity/htmlunit/htmlunit-core-js-2.5-SNAPSHOT.jar +0 -0
  75. data/lib/celerity/htmlunit/nekohtml-1.9.12-20090308.130127-11.jar +0 -0
@@ -7,7 +7,7 @@ module Celerity
7
7
 
8
8
  def click
9
9
  assert_exists_and_enabled
10
- @container.update_page(@object.click)
10
+ rescue_status_code_exception { @object.click }
11
11
  end
12
12
 
13
13
  #
@@ -16,7 +16,7 @@ module Celerity
16
16
 
17
17
  def double_click
18
18
  assert_exists_and_enabled
19
- @container.update_page(@object.dblClick)
19
+ rescue_status_code_exception { @object.dblClick }
20
20
  end
21
21
 
22
22
  #
@@ -25,7 +25,7 @@ module Celerity
25
25
 
26
26
  def right_click
27
27
  assert_exists_and_enabled
28
- @container.update_page(@object.rightClick)
28
+ rescue_status_code_exception { @object.rightClick }
29
29
  end
30
30
 
31
31
  #
@@ -37,12 +37,32 @@ 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)
41
- browser.update_page(@object.click)
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
+
45
+ @browser.disable_event_listener do
46
+ rescue_status_code_exception { browser.page = @object.click }
47
+ end
42
48
 
43
49
  browser
44
50
  end
45
51
 
52
+ #
53
+ # Click the element and just return the content as IO. Current page stays unchanged.
54
+ # This can be used to download content that normally isn't rendered in a browser.
55
+ #
56
+ # @return [IO]
57
+ #
58
+
59
+ def download
60
+ assert_exists_and_enabled
61
+ @browser.disable_event_listener do
62
+ @object.click.getWebResponse.getContentAsStream.to_io
63
+ end
64
+ end
65
+
46
66
  private
47
67
 
48
68
  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,5 +1,5 @@
1
1
  module Celerity
2
-
2
+
3
3
  #
4
4
  # This class contains methods for accessing elements inside a container,
5
5
  # usually the Browser object, meaning the current page.
@@ -30,6 +30,7 @@ module Celerity
30
30
 
31
31
  module Container
32
32
  include Celerity::Exception
33
+ include Celerity::ShortInspect
33
34
 
34
35
  # Points back to the Browser instance that contains this element
35
36
  attr_reader :browser
@@ -39,8 +40,8 @@ module Celerity
39
40
  #
40
41
  # @param [String, Regexp] expected_text The text to look for.
41
42
  # @return [Fixnum, nil] The index of the matched text, or nil if it doesn't match.
42
- #
43
-
43
+ #
44
+
44
45
  def contains_text(expected_text)
45
46
  assert_exists
46
47
  return nil unless respond_to? :text
@@ -54,41 +55,26 @@ module Celerity
54
55
  raise TypeError, "expected String or Regexp, got #{expected_text.inspect}:#{expected_text.class}"
55
56
  end
56
57
  end
57
-
58
+
59
+ #
60
+ # Override inspect for readability
61
+ #
62
+
63
+ def inspect
64
+ short_inspect :include => %w[@conditions @object]
65
+ end
66
+
58
67
  #
59
68
  # Used internally to update the container object.
60
69
  # @api private
61
70
  #
62
-
71
+
63
72
  def container=(container)
64
73
  @container = container
65
74
  @browser = container.browser
66
75
  container
67
76
  end
68
77
 
69
- #
70
- # Used internally to update the page object.
71
- # @api private
72
- #
73
-
74
- def update_page(page)
75
- @browser.page = page
76
- end
77
-
78
- #
79
- # Used internally.
80
- #
81
- # @param [String] string The string to match against.
82
- # @param [Regexp, String, #to_s] what The match we're looking for.
83
- # @return [Fixnum, true, false, nil]
84
- #
85
- # @api private
86
- #
87
-
88
- def matches?(string, what)
89
- Regexp === what ? string =~ what : string == what.to_s
90
- end
91
-
92
78
  #--
93
79
  # below methods sorted alphabetically
94
80
  #++
@@ -96,23 +82,23 @@ module Celerity
96
82
  #
97
83
  # @return [Celerity::Area]
98
84
  #
99
-
85
+
100
86
  def area(*args)
101
87
  Area.new(self, *args)
102
88
  end
103
-
89
+
104
90
  #
105
91
  # @return [Celerity::Areas]
106
92
  #
107
-
93
+
108
94
  def areas
109
95
  Areas.new(self)
110
96
  end
111
-
97
+
112
98
  #
113
99
  # @return [Celerity::Button]
114
100
  #
115
-
101
+
116
102
  def button(*args)
117
103
  Button.new(self, *args)
118
104
  end
@@ -120,23 +106,23 @@ module Celerity
120
106
  #
121
107
  # @return [Celerity::Buttons]
122
108
  #
123
-
109
+
124
110
  def buttons
125
111
  Buttons.new(self)
126
112
  end
127
-
113
+
128
114
  #
129
115
  # @return [Celerity::TableCell]
130
116
  #
131
-
117
+
132
118
  def cell(*args)
133
119
  TableCell.new(self, *args)
134
120
  end
135
-
121
+
136
122
  #
137
123
  # @return [Celerity::TableCells]
138
124
  #
139
-
125
+
140
126
  def cells
141
127
  TableCells.new(self)
142
128
  end
@@ -172,7 +158,7 @@ module Celerity
172
158
  def dd(*args)
173
159
  Dd.new(self, *args)
174
160
  end
175
-
161
+
176
162
  #
177
163
  # @return [Celerity::Dds]
178
164
  #
@@ -180,7 +166,7 @@ module Celerity
180
166
  def dds
181
167
  Dds.new(self)
182
168
  end
183
-
169
+
184
170
  #
185
171
  # @return [Celerity::Div]
186
172
  #
@@ -188,7 +174,7 @@ module Celerity
188
174
  def div(*args)
189
175
  Div.new(self, *args)
190
176
  end
191
-
177
+
192
178
  #
193
179
  # @return [Celerity::Divs]
194
180
  #
@@ -196,7 +182,7 @@ module Celerity
196
182
  def divs
197
183
  Divs.new(self)
198
184
  end
199
-
185
+
200
186
  #
201
187
  # @return [Celerity::Dl]
202
188
  #
@@ -212,7 +198,7 @@ module Celerity
212
198
  def dls
213
199
  Dls.new(self)
214
200
  end
215
-
201
+
216
202
  #
217
203
  # @return [Celerity::Dt]
218
204
  #
@@ -228,19 +214,19 @@ module Celerity
228
214
  def dts
229
215
  Dts.new(self)
230
216
  end
231
-
217
+
232
218
  #
233
219
  # @return [Celerity::Em]
234
- #
235
-
220
+ #
221
+
236
222
  def em(*args)
237
223
  Em.new(self, *args)
238
224
  end
239
-
225
+
240
226
  #
241
227
  # @return [Celerity::Ems]
242
- #
243
-
228
+ #
229
+
244
230
  def ems
245
231
  Ems.new(self)
246
232
  end
@@ -284,7 +270,7 @@ module Celerity
284
270
  def frame(*args)
285
271
  Frame.new(self, *args)
286
272
  end
287
-
273
+
288
274
  #
289
275
  # @return [Celerity::Frames]
290
276
  #
@@ -300,7 +286,7 @@ module Celerity
300
286
  def h1(*args)
301
287
  H1.new(self, *args)
302
288
  end
303
-
289
+
304
290
  #
305
291
  # @return [Celerity::H1s]
306
292
  #
@@ -340,7 +326,7 @@ module Celerity
340
326
  def h3s
341
327
  H3s.new(self)
342
328
  end
343
-
329
+
344
330
  #
345
331
  # @return [Celerity::H4]
346
332
  #
@@ -356,7 +342,7 @@ module Celerity
356
342
  def h4s
357
343
  H4s.new(self)
358
344
  end
359
-
345
+
360
346
  #
361
347
  # @return [Celerity::H5]
362
348
  #
@@ -372,7 +358,7 @@ module Celerity
372
358
  def h5s
373
359
  H5s.new(self)
374
360
  end
375
-
361
+
376
362
  #
377
363
  # @return [Celerity::H6]
378
364
  #
@@ -568,7 +554,7 @@ module Celerity
568
554
  #
569
555
  # @return [Celerity::Radio]
570
556
  #
571
-
557
+
572
558
  def radio(*args)
573
559
  Radio.new(self, *args)
574
560
  end
@@ -612,7 +598,7 @@ module Celerity
612
598
  def select_lists
613
599
  SelectLists.new(self)
614
600
  end
615
-
601
+
616
602
  #
617
603
  # @return [Celerity::Span]
618
604
  #
@@ -676,7 +662,7 @@ module Celerity
676
662
  def tbodies
677
663
  TableBodies.new(self)
678
664
  end
679
-
665
+
680
666
  #
681
667
  # @return [Celerity::TextField]
682
668
  #
@@ -692,7 +678,7 @@ module Celerity
692
678
  def text_fields
693
679
  TextFields.new(self)
694
680
  end
695
-
681
+
696
682
  #
697
683
  # @return [Celerity::TableFooter]
698
684
  #
@@ -709,14 +695,14 @@ module Celerity
709
695
  TableFooters.new(self)
710
696
  end
711
697
  alias_method :tfeet, :tfoots # :-)
712
-
698
+
713
699
  #
714
700
  # Watir's cells() won't find <th> elements.
715
701
  # This is a workaround.
716
702
  #
717
703
  # @return [Celerity::Th]
718
704
  #
719
-
705
+
720
706
  def th(*args)
721
707
  Th.new(self, *args)
722
708
  end
@@ -729,7 +715,7 @@ module Celerity
729
715
  def ths
730
716
  raise NotImplementedError
731
717
  end
732
-
718
+
733
719
  #
734
720
  # @return [Celerity::TableHeader]
735
721
  #
@@ -762,5 +748,32 @@ module Celerity
762
748
  Uls.new(self)
763
749
  end
764
750
 
751
+ private
752
+
753
+ #
754
+ # Used internally.
755
+ #
756
+ # @param [String] string The string to match against.
757
+ # @param [Regexp, String, #to_s] what The match we're looking for.
758
+ # @return [Fixnum, true, false, nil]
759
+ #
760
+ # @api private
761
+ #
762
+
763
+ def matches?(string, what)
764
+ Regexp === what ? string =~ what : string == what.to_s
765
+ end
766
+
767
+ #
768
+ # Rescues HtmlUnit::FailingHttpStatusCodeException and re-raises as
769
+ # Celerity::NavigationException to avoid the huge JRuby backtrace
770
+ #
771
+
772
+ def rescue_status_code_exception(&blk)
773
+ yield
774
+ rescue HtmlUnit::FailingHttpStatusCodeException => e
775
+ raise NavigationException, e.message, caller
776
+ end
777
+
765
778
  end # Container
766
779
  end # Celerity
@@ -1,10 +1,14 @@
1
1
  module Celerity
2
2
  class DefaultViewer
3
3
  IMAGE = "#{Celerity::DIR}/resources/no_viewer.png"
4
-
5
- def self.save(path = nil)
6
- return unless path
7
- FileUtils.copy(IMAGE, path)
4
+
5
+ class << self
6
+ def save(path = nil)
7
+ return unless path
8
+ FileUtils.copy(IMAGE, path)
9
+ end
10
+
11
+ def close; end
8
12
  end
9
13
  end
10
14
  end
@@ -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