oki-celerity 0.8.1.dev

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 (77) hide show
  1. data/HISTORY +111 -0
  2. data/LICENSE +621 -0
  3. data/README.rdoc +80 -0
  4. data/Rakefile +11 -0
  5. data/VERSION.yml +5 -0
  6. data/celerity.gemspec +126 -0
  7. data/lib/celerity/browser.rb +908 -0
  8. data/lib/celerity/clickable_element.rb +73 -0
  9. data/lib/celerity/collections.rb +164 -0
  10. data/lib/celerity/container.rb +800 -0
  11. data/lib/celerity/default_viewer.rb +14 -0
  12. data/lib/celerity/disabled_element.rb +40 -0
  13. data/lib/celerity/element.rb +311 -0
  14. data/lib/celerity/element_collection.rb +107 -0
  15. data/lib/celerity/element_locator.rb +164 -0
  16. data/lib/celerity/elements/button.rb +54 -0
  17. data/lib/celerity/elements/file_field.rb +29 -0
  18. data/lib/celerity/elements/form.rb +22 -0
  19. data/lib/celerity/elements/frame.rb +86 -0
  20. data/lib/celerity/elements/image.rb +89 -0
  21. data/lib/celerity/elements/label.rb +16 -0
  22. data/lib/celerity/elements/link.rb +43 -0
  23. data/lib/celerity/elements/meta.rb +14 -0
  24. data/lib/celerity/elements/non_control_elements.rb +124 -0
  25. data/lib/celerity/elements/option.rb +38 -0
  26. data/lib/celerity/elements/radio_check.rb +114 -0
  27. data/lib/celerity/elements/select_list.rb +146 -0
  28. data/lib/celerity/elements/table.rb +153 -0
  29. data/lib/celerity/elements/table_cell.rb +36 -0
  30. data/lib/celerity/elements/table_elements.rb +42 -0
  31. data/lib/celerity/elements/table_row.rb +49 -0
  32. data/lib/celerity/elements/text_field.rb +168 -0
  33. data/lib/celerity/exception.rb +83 -0
  34. data/lib/celerity/htmlunit/apache-mime4j-0.6.jar +0 -0
  35. data/lib/celerity/htmlunit/commons-codec-1.4.jar +0 -0
  36. data/lib/celerity/htmlunit/commons-collections-3.2.1.jar +0 -0
  37. data/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
  38. data/lib/celerity/htmlunit/commons-lang-2.5.jar +0 -0
  39. data/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
  40. data/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
  41. data/lib/celerity/htmlunit/htmlunit-2.9-SNAPSHOT.jar +0 -0
  42. data/lib/celerity/htmlunit/htmlunit-core-js-2.8.jar +0 -0
  43. data/lib/celerity/htmlunit/httpclient-4.0.1.jar +0 -0
  44. data/lib/celerity/htmlunit/httpcore-4.0.1.jar +0 -0
  45. data/lib/celerity/htmlunit/httpmime-4.0.1.jar +0 -0
  46. data/lib/celerity/htmlunit/nekohtml-1.9.14.jar +0 -0
  47. data/lib/celerity/htmlunit/sac-1.3.jar +0 -0
  48. data/lib/celerity/htmlunit/serializer-2.7.1.jar +0 -0
  49. data/lib/celerity/htmlunit/xalan-2.7.1.jar +0 -0
  50. data/lib/celerity/htmlunit/xercesImpl-2.9.1.jar +0 -0
  51. data/lib/celerity/htmlunit/xml-apis-1.3.04.jar +0 -0
  52. data/lib/celerity/htmlunit.rb +64 -0
  53. data/lib/celerity/identifier.rb +28 -0
  54. data/lib/celerity/ignoring_web_connection.rb +15 -0
  55. data/lib/celerity/input_element.rb +25 -0
  56. data/lib/celerity/javascript_debugger.rb +32 -0
  57. data/lib/celerity/listener.rb +143 -0
  58. data/lib/celerity/resources/no_viewer.png +0 -0
  59. data/lib/celerity/short_inspect.rb +20 -0
  60. data/lib/celerity/util.rb +129 -0
  61. data/lib/celerity/version.rb +3 -0
  62. data/lib/celerity/viewer_connection.rb +89 -0
  63. data/lib/celerity/watir_compatibility.rb +70 -0
  64. data/lib/celerity/xpath_support.rb +52 -0
  65. data/lib/celerity.rb +77 -0
  66. data/tasks/benchmark.rake +4 -0
  67. data/tasks/check.rake +24 -0
  68. data/tasks/clean.rake +3 -0
  69. data/tasks/fix.rake +25 -0
  70. data/tasks/jar.rake +55 -0
  71. data/tasks/jeweler.rake +28 -0
  72. data/tasks/rdoc.rake +4 -0
  73. data/tasks/snapshot.rake +25 -0
  74. data/tasks/spec.rake +26 -0
  75. data/tasks/website.rake +10 -0
  76. data/tasks/yard.rake +16 -0
  77. metadata +204 -0
@@ -0,0 +1,800 @@
1
+ module Celerity
2
+
3
+ #
4
+ # This class contains methods for accessing elements inside a container,
5
+ # usually the Browser object, meaning the current page.
6
+ # The most common syntax is
7
+ # browser.elem(:attribute, 'value')
8
+ #
9
+ # Note that the element is located lazily, so no exceptions will be raised
10
+ # if the element doesn't exist until you call a method on the resulting object.
11
+ # To do this you would normally use Element#exists? or an action method,
12
+ # like ClickableElement#click.
13
+ # You can also pass in a hash:
14
+ #
15
+ # browser.link(:index => 1).click
16
+ #
17
+ # All elements support multiple attributes identification using the
18
+ # hash syntax (though this might not always be compatible with Watir):
19
+ #
20
+ # browser.span(:class_name => 'product', :index => 5).text
21
+ #
22
+ # Checkboxes and radio buttons support a special three-argument syntax:
23
+ #
24
+ # browser.check_box(:name, 'a_name', '1234').set
25
+ #
26
+ # You can also get all the elements of a certain type by using the plural form (@see Celerity::ElementCollection):
27
+ #
28
+ # browser.links # => #<Celerity::Links:0x7a1c2da2 ...>
29
+ #
30
+
31
+ module Container
32
+ include Celerity::Exception
33
+ include Celerity::ShortInspect
34
+
35
+ # Points back to the Browser instance that contains this element
36
+ attr_reader :browser
37
+
38
+ #
39
+ # Check if the element contains the given text.
40
+ #
41
+ # @param [String, Regexp] expected_text The text to look for.
42
+ # @return [Fixnum, nil] The index of the matched text, or nil if it doesn't match.
43
+ #
44
+
45
+ def contains_text(expected_text)
46
+ assert_exists
47
+ return nil unless respond_to? :text
48
+
49
+ case expected_text
50
+ when Regexp
51
+ text() =~ expected_text
52
+ when String
53
+ text().index(expected_text)
54
+ else
55
+ raise TypeError, "expected String or Regexp, got #{expected_text.inspect}:#{expected_text.class}"
56
+ end
57
+ end
58
+
59
+ #
60
+ # Override inspect for readability
61
+ #
62
+
63
+ def inspect
64
+ short_inspect :include => %w[@conditions @object]
65
+ end
66
+
67
+ #
68
+ # Used internally to update the container object.
69
+ # @api private
70
+ #
71
+
72
+ def container=(container)
73
+ @container = container
74
+ @browser = container.browser
75
+ container
76
+ end
77
+
78
+ #--
79
+ # below methods sorted alphabetically
80
+ #++
81
+
82
+ #
83
+ # @return [Celerity::Area]
84
+ #
85
+
86
+ def area(*args)
87
+ Area.new(self, *args)
88
+ end
89
+
90
+ #
91
+ # @return [Celerity::Areas]
92
+ #
93
+
94
+ def areas
95
+ Areas.new(self)
96
+ end
97
+
98
+ #
99
+ # @return [Celerity::Button]
100
+ #
101
+
102
+ def button(*args)
103
+ Button.new(self, *args)
104
+ end
105
+
106
+ #
107
+ # @return [Celerity::Buttons]
108
+ #
109
+
110
+ def buttons
111
+ Buttons.new(self)
112
+ end
113
+
114
+ #
115
+ # @return [Celerity::TableCell]
116
+ #
117
+
118
+ def cell(*args)
119
+ TableCell.new(self, *args)
120
+ end
121
+ alias_method :td, :cell
122
+
123
+ #
124
+ # @return [Celerity::TableCells]
125
+ #
126
+
127
+ def cells
128
+ TableCells.new(self)
129
+ end
130
+ alias_method :tds, :cells
131
+
132
+ #
133
+ # Since finding checkboxes by value is very common, you can use this shorthand:
134
+ #
135
+ # browser.check_box(:name, 'a_name', '1234').set
136
+ #
137
+ # or
138
+ #
139
+ # browser.check_box(:name => 'a_name', :value => '1234').set
140
+ #
141
+ # @return [Celerity::CheckBox]
142
+ #
143
+
144
+ def check_box(*args)
145
+ CheckBox.new(self, *args)
146
+ end
147
+
148
+ #
149
+ # @return [Celerity::CheckBoxes]
150
+ #
151
+
152
+ def checkboxes
153
+ CheckBoxes.new(self)
154
+ end
155
+
156
+ #
157
+ # @return [Celerity::Dd]
158
+ #
159
+
160
+ def dd(*args)
161
+ Dd.new(self, *args)
162
+ end
163
+
164
+ #
165
+ # @return [Celerity::Dds]
166
+ #
167
+
168
+ def dds
169
+ Dds.new(self)
170
+ end
171
+
172
+ #
173
+ # @return [Celerity::Del]
174
+ #
175
+
176
+ def del(*args)
177
+ Del.new(self, *args)
178
+ end
179
+
180
+ #
181
+ # @return [Celerity::Dels]
182
+ #
183
+
184
+ def dels
185
+ Dels.new(self)
186
+ end
187
+
188
+ #
189
+ # @return [Celerity::Div]
190
+ #
191
+
192
+ def div(*args)
193
+ Div.new(self, *args)
194
+ end
195
+
196
+ #
197
+ # @return [Celerity::Divs]
198
+ #
199
+
200
+ def divs
201
+ Divs.new(self)
202
+ end
203
+
204
+ #
205
+ # @return [Celerity::Dl]
206
+ #
207
+
208
+ def dl(*args)
209
+ Dl.new(self, *args)
210
+ end
211
+
212
+ #
213
+ # @return [Celerity::Dls]
214
+ #
215
+
216
+ def dls
217
+ Dls.new(self)
218
+ end
219
+
220
+ #
221
+ # @return [Celerity::Dt]
222
+ #
223
+
224
+ def dt(*args)
225
+ Dt.new(self, *args)
226
+ end
227
+
228
+ #
229
+ # @return [Celerity::Dts]
230
+ #
231
+
232
+ def dts
233
+ Dts.new(self)
234
+ end
235
+
236
+ #
237
+ # @return [Celerity::Em]
238
+ #
239
+
240
+ def em(*args)
241
+ Em.new(self, *args)
242
+ end
243
+
244
+ #
245
+ # @return [Celerity::Ems]
246
+ #
247
+
248
+ def ems
249
+ Ems.new(self)
250
+ end
251
+
252
+ #
253
+ # @return [Celerity::FileField]
254
+ #
255
+
256
+ def file_field(*args)
257
+ FileField.new(self, *args)
258
+ end
259
+
260
+ #
261
+ # @return [Celerity::FileFields]
262
+ #
263
+
264
+ def file_fields
265
+ FileFields.new(self)
266
+ end
267
+
268
+ #
269
+ # @return [Celerity::Form]
270
+ #
271
+
272
+ def form(*args)
273
+ Form.new(self, *args)
274
+ end
275
+
276
+ #
277
+ # @return [Celerity::Forms]
278
+ #
279
+
280
+ def forms
281
+ Forms.new(self)
282
+ end
283
+
284
+ #
285
+ # @return [Celerity::Frame]
286
+ #
287
+
288
+ def frame(*args)
289
+ Frame.new(self, *args)
290
+ end
291
+
292
+ #
293
+ # @return [Celerity::Frames]
294
+ #
295
+
296
+ def frames
297
+ Frames.new(self)
298
+ end
299
+
300
+ #
301
+ # @return [Celerity::H1]
302
+ #
303
+
304
+ def h1(*args)
305
+ H1.new(self, *args)
306
+ end
307
+
308
+ #
309
+ # @return [Celerity::H1s]
310
+ #
311
+
312
+ def h1s
313
+ H1s.new(self)
314
+ end
315
+
316
+ #
317
+ # @return [Celerity::H2]
318
+ #
319
+
320
+ def h2(*args)
321
+ H2.new(self, *args)
322
+ end
323
+
324
+ #
325
+ # @return [Celerity::H2s]
326
+ #
327
+
328
+ def h2s
329
+ H2s.new(self)
330
+ end
331
+
332
+ #
333
+ # @return [Celerity::H3]
334
+ #
335
+
336
+ def h3(*args)
337
+ H3.new(self, *args)
338
+ end
339
+
340
+ #
341
+ # @return [Celerity::H3s]
342
+ #
343
+
344
+ def h3s
345
+ H3s.new(self)
346
+ end
347
+
348
+ #
349
+ # @return [Celerity::H4]
350
+ #
351
+
352
+ def h4(*args)
353
+ H4.new(self, *args)
354
+ end
355
+
356
+ #
357
+ # @return [Celerity::H4s]
358
+ #
359
+
360
+ def h4s
361
+ H4s.new(self)
362
+ end
363
+
364
+ #
365
+ # @return [Celerity::H5]
366
+ #
367
+
368
+ def h5(*args)
369
+ H5.new(self, *args)
370
+ end
371
+
372
+ #
373
+ # @return [Celerity::H5s]
374
+ #
375
+
376
+ def h5s
377
+ H5s.new(self)
378
+ end
379
+
380
+ #
381
+ # @return [Celerity::H6]
382
+ #
383
+
384
+ def h6(*args)
385
+ H6.new(self, *args)
386
+ end
387
+
388
+ #
389
+ # @return [Celerity::H6s]
390
+ #
391
+
392
+ def h6s
393
+ H6s.new(self)
394
+ end
395
+
396
+ #
397
+ # @return [Celerity::Hidden]
398
+ #
399
+
400
+ def hidden(*args)
401
+ Hidden.new(self, *args)
402
+ end
403
+
404
+ #
405
+ # @return [Celerity::Hiddens]
406
+ #
407
+
408
+ def hiddens
409
+ Hiddens.new(self)
410
+ end
411
+
412
+ #
413
+ # @return [Celerity::Ins]
414
+ #
415
+
416
+ def ins(*args)
417
+ Ins.new(self, *args)
418
+ end
419
+
420
+ #
421
+ # @return [Celerity::Inses]
422
+ #
423
+
424
+ def inses(*args)
425
+ Inses.new(self, *args)
426
+ end
427
+
428
+
429
+ #
430
+ # @return [Celerity::Image]
431
+ #
432
+
433
+ def image(*args)
434
+ Image.new(self, *args)
435
+ end
436
+
437
+ #
438
+ # @return [Celerity::Images]
439
+ #
440
+
441
+ def images
442
+ Images.new(self)
443
+ end
444
+
445
+ #
446
+ # @return [Celerity::Label]
447
+ #
448
+
449
+ def label(*args)
450
+ Label.new(self, *args)
451
+ end
452
+
453
+ #
454
+ # @return [Celerity::Labels]
455
+ #
456
+
457
+ def labels
458
+ Labels.new(self)
459
+ end
460
+
461
+ #
462
+ # @return [Celerity::Li]
463
+ #
464
+
465
+ def li(*args)
466
+ Li.new(self, *args)
467
+ end
468
+
469
+ #
470
+ # @return [Celerity::Lis]
471
+ #
472
+
473
+ def lis
474
+ Lis.new(self)
475
+ end
476
+
477
+ #
478
+ # @return [Celerity::Link]
479
+ #
480
+
481
+ def link(*args)
482
+ Link.new(self, *args)
483
+ end
484
+
485
+ #
486
+ # @return [Celerity::Links]
487
+ #
488
+
489
+ def links
490
+ Links.new(self)
491
+ end
492
+
493
+ #
494
+ # @return [Celerity::Map]
495
+ #
496
+
497
+ def map(*args)
498
+ Map.new(self, *args)
499
+ end
500
+
501
+ #
502
+ # @return [Celerity::Maps]
503
+ #
504
+
505
+ def maps
506
+ Maps.new(self)
507
+ end
508
+
509
+ #
510
+ # @return [Celerity::Meta]
511
+ #
512
+
513
+ def meta(*args)
514
+ Meta.new(self, *args)
515
+ end
516
+
517
+ #
518
+ # @return [Celerity::Metas]
519
+ #
520
+
521
+ def metas(*args)
522
+ Metas.new(self, *args)
523
+ end
524
+
525
+ #
526
+ # @return [Celerity::Ol]
527
+ #
528
+
529
+ def ol(*args)
530
+ Ol.new(self, *args)
531
+ end
532
+
533
+ #
534
+ # @return [Celerity::Ols]
535
+ #
536
+
537
+ def ols
538
+ Ols.new(self)
539
+ end
540
+
541
+ #
542
+ # @return [Celerity::Option]
543
+ #
544
+
545
+ def option(*args)
546
+ Option.new(self, *args)
547
+ end
548
+
549
+ #
550
+ # @return [Celerity::P]
551
+ #
552
+
553
+ def p(*args)
554
+ P.new(self, *args)
555
+ end
556
+
557
+ #
558
+ # @return [Celerity::Ps]
559
+ #
560
+
561
+ def ps
562
+ Ps.new(self)
563
+ end
564
+
565
+ #
566
+ # @return [Celerity::Pre]
567
+ #
568
+
569
+ def pre(*args)
570
+ Pre.new(self, *args)
571
+ end
572
+
573
+ #
574
+ # @return [Celerity::Pres]
575
+ #
576
+
577
+ def pres
578
+ Pres.new(self)
579
+ end
580
+
581
+ #
582
+ # Since finding radios by value is very common, you can use this shorthand:
583
+ #
584
+ # browser.radio(:name, 'a_name', '1234').set
585
+ #
586
+ # or
587
+ #
588
+ # browser.radio(:name => 'a_name', :value => '1234').set
589
+ #
590
+ # @return [Celerity::Radio]
591
+ #
592
+
593
+ def radio(*args)
594
+ Radio.new(self, *args)
595
+ end
596
+
597
+ #
598
+ # @return [Celerity::Radios]
599
+ #
600
+
601
+ def radios
602
+ Radios.new(self)
603
+ end
604
+
605
+ #
606
+ # @return [Celerity::TableRow]
607
+ #
608
+
609
+ def row(*args)
610
+ TableRow.new(self, *args)
611
+ end
612
+
613
+ #
614
+ # @return [Celerity::TableRows]
615
+ #
616
+
617
+ def rows
618
+ TableRows.new(self)
619
+ end
620
+
621
+ #
622
+ # @return [Celerity::SelectList]
623
+ #
624
+
625
+ def select_list(*args)
626
+ SelectList.new(self, *args)
627
+ end
628
+
629
+ #
630
+ # @return [Celerity::SelectLists]
631
+ #
632
+
633
+ def select_lists
634
+ SelectLists.new(self)
635
+ end
636
+
637
+ #
638
+ # @return [Celerity::Span]
639
+ #
640
+
641
+ def span(*args)
642
+ Span.new(self, *args)
643
+ end
644
+
645
+ #
646
+ # @return [Celerity::Spans]
647
+ #
648
+
649
+ def spans
650
+ Spans.new(self)
651
+ end
652
+
653
+ #
654
+ # @return [Celerity::Spans]
655
+ #
656
+
657
+ def strong(*args)
658
+ Strong.new(self, *args)
659
+ end
660
+
661
+ #
662
+ # @return [Celerity::Strongs]
663
+ #
664
+
665
+ def strongs
666
+ Strongs.new(self)
667
+ end
668
+
669
+ #
670
+ # @return [Celerity::Table]
671
+ #
672
+
673
+ def table(*args)
674
+ Table.new(self, *args)
675
+ end
676
+
677
+ #
678
+ # @return [Celerity::Tables]
679
+ #
680
+
681
+ def tables
682
+ Tables.new(self)
683
+ end
684
+
685
+ #
686
+ # @return [Celerity::TableBody]
687
+ #
688
+
689
+ def tbody(*args)
690
+ TableBody.new(self, *args)
691
+ end
692
+
693
+ #
694
+ # @return [Celerity::TableBodies]
695
+ #
696
+
697
+ def tbodies
698
+ TableBodies.new(self)
699
+ end
700
+
701
+ #
702
+ # @return [Celerity::TextField]
703
+ #
704
+
705
+ def text_field(*args)
706
+ TextField.new(self, *args)
707
+ end
708
+
709
+ #
710
+ # @return [Celerity::TextFields]
711
+ #
712
+
713
+ def text_fields
714
+ TextFields.new(self)
715
+ end
716
+
717
+ #
718
+ # @return [Celerity::TableFooter]
719
+ #
720
+
721
+ def tfoot(*args)
722
+ TableFooter.new(self, *args)
723
+ end
724
+
725
+ #
726
+ # @return [Celerity::TableFooters]
727
+ #
728
+
729
+ def tfoots
730
+ TableFooters.new(self)
731
+ end
732
+ alias_method :tfeet, :tfoots # :-)
733
+
734
+ #
735
+ # Watir's cells() won't find <th> elements.
736
+ # This is a workaround.
737
+ #
738
+ # @return [Celerity::Th]
739
+ #
740
+
741
+ def th(*args)
742
+ Th.new(self, *args)
743
+ end
744
+
745
+ #
746
+ # FIXME: implement or change api,
747
+ # @see th
748
+ #
749
+
750
+ def ths
751
+ raise NotImplementedError
752
+ end
753
+
754
+ #
755
+ # @return [Celerity::TableHeader]
756
+ #
757
+
758
+ def thead(*args)
759
+ TableHeader.new(self, *args)
760
+ end
761
+
762
+ #
763
+ # @return [Celerity::TableHeaders]
764
+ #
765
+
766
+ def theads
767
+ TableHeaders.new(self)
768
+ end
769
+
770
+ #
771
+ # @return [Celerity::Ul]
772
+ #
773
+
774
+ def ul(*args)
775
+ Ul.new(self, *args)
776
+ end
777
+
778
+ #
779
+ # @return [Celerity::Uls]
780
+ #
781
+
782
+ def uls
783
+ Uls.new(self)
784
+ end
785
+
786
+ private
787
+
788
+ #
789
+ # Rescues HtmlUnit::FailingHttpStatusCodeException and re-raises as
790
+ # Celerity::NavigationException to avoid the huge JRuby backtrace
791
+ #
792
+
793
+ def rescue_status_code_exception(&blk)
794
+ yield
795
+ rescue HtmlUnit::FailingHttpStatusCodeException => e
796
+ raise NavigationException, e.message, caller
797
+ end
798
+
799
+ end # Container
800
+ end # Celerity