firewatir 1.2.1 → 1.6.2

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 (47) hide show
  1. data/lib/firewatir.rb +50 -0
  2. data/lib/firewatir/MozillaBaseElement.rb +1863 -0
  3. data/lib/firewatir/container.rb +534 -0
  4. data/lib/firewatir/exceptions.rb +10 -0
  5. data/lib/firewatir/firefox.rb +1127 -0
  6. data/lib/firewatir/htmlelements.rb +1911 -0
  7. data/lib/firewatir/version.rb +5 -0
  8. data/{firewatir → lib/firewatir}/winClicker.rb +0 -0
  9. data/{firewatir → lib/firewatir}/x11.rb +0 -0
  10. data/unittests/attach_to_new_window_test.rb +20 -12
  11. data/unittests/bug_fixes_test.rb +79 -69
  12. data/unittests/buttons_xpath_test.rb +45 -44
  13. data/unittests/checkbox_test.rb +86 -85
  14. data/unittests/checkbox_xpath_test.rb +58 -58
  15. data/unittests/div_test.rb +117 -115
  16. data/unittests/filefield_test.rb +12 -12
  17. data/unittests/filefield_xpath_test.rb +11 -11
  18. data/unittests/form_test.rb +134 -133
  19. data/unittests/frame_test.rb +42 -41
  20. data/unittests/hidden_test.rb +40 -40
  21. data/unittests/hidden_xpath_test.rb +32 -32
  22. data/unittests/images_test.rb +85 -84
  23. data/unittests/images_xpath_test.rb +57 -56
  24. data/unittests/iostring_test.rb +1 -1
  25. data/unittests/javascript_test.rb +42 -38
  26. data/unittests/links_test.rb +88 -86
  27. data/unittests/links_xpath_test.rb +38 -38
  28. data/unittests/mozilla_all_tests.rb +2 -14
  29. data/unittests/pre_test.rb +27 -25
  30. data/unittests/radios_test.rb +86 -86
  31. data/unittests/radios_xpath_test.rb +48 -48
  32. data/unittests/redirect_test.rb +20 -19
  33. data/unittests/selectbox_test.rb +72 -71
  34. data/unittests/selectbox_xpath_test.rb +58 -56
  35. data/unittests/setup.rb +22 -27
  36. data/unittests/table_test.rb +89 -88
  37. data/unittests/table_xpath_test.rb +37 -36
  38. data/unittests/textfields_test.rb +105 -102
  39. data/unittests/textfields_xpath_test.rb +53 -52
  40. metadata +37 -18
  41. data/MozillaBaseElement.rb +0 -1780
  42. data/container.rb +0 -900
  43. data/firewatir.rb +0 -1195
  44. data/firewatir/exceptions.rb +0 -44
  45. data/firewatir/testUnitAddons.rb +0 -8
  46. data/htmlelements.rb +0 -2281
  47. data/unittests/buttons_test.rb +0 -215
@@ -0,0 +1,1911 @@
1
+ =begin
2
+ #
3
+ # Contains class definition of each HTML element that FireWatir can address.
4
+ # All classes inehrit from Element base class defined in MozillaBaseElement.rb
5
+ # User should not create instance of these classes. As they are created by using
6
+ # container#element methods. For e.g. container#button, container#link etc.
7
+ #
8
+ # All the methods in the classes first checks if element exists or not. If not then
9
+ # raises UnknownObjectException.
10
+ #
11
+ =end
12
+
13
+ require 'active_support'
14
+ module FireWatir
15
+
16
+ class Frame < Element
17
+
18
+ attr_accessor :element_name
19
+ #
20
+ # Description:
21
+ # Initializes the instance of frame or iframe object.
22
+ #
23
+ # Input:
24
+ # - how - Attribute to identify the frame element.
25
+ # - what - Value of that attribute.
26
+ #
27
+ def initialize(container, how, what)
28
+ @how = how
29
+ @what = what
30
+ @container = container
31
+ end
32
+
33
+ def locate
34
+ if(@how == :jssh_name)
35
+ @element_name = @what
36
+ else
37
+ @element_name = locate_frame(@how, @what)
38
+ end
39
+ #puts @element_name
40
+ @o = self
41
+
42
+ unless @element_name
43
+ raise UnknownFrameException, "Unable to locate a frame using #{@how} and #{@what}. "
44
+ end
45
+ end
46
+
47
+ def html
48
+ assert_exists
49
+ get_frame_html
50
+ end
51
+ end
52
+
53
+ class Form < Element
54
+
55
+ attr_accessor :element_name
56
+ #
57
+ # Description:
58
+ # Initializes the instance of form object.
59
+ #
60
+ # Input:
61
+ # - how - Attribute to identify the form element.
62
+ # - what - Value of that attribute.
63
+ #
64
+ def initialize(container, how, what)
65
+ @how = how
66
+ @what = what
67
+ @container = container
68
+ end
69
+
70
+ def locate
71
+ # Get form using xpath.
72
+ if @how == :jssh_name
73
+ @element_name = @what
74
+ elsif @how == :xpath
75
+ @element_name = element_by_xpath(container, @what)
76
+ else
77
+ @element_name = locate_tagged_element("form", @how, @what)
78
+ end
79
+ @o = self
80
+ end
81
+
82
+ # Submit the form. Equivalent to pressing Enter or Return to submit a form.
83
+ def submit
84
+ assert_exists
85
+ submit_form
86
+ @o.wait
87
+ end
88
+
89
+ end # class Form
90
+
91
+ # Base class containing items that are common between the span, div, label, p and pre classes.
92
+ class NonControlElement < Element
93
+ def self.inherited subclass
94
+ class_name = subclass.to_s.demodulize
95
+ method_name = class_name.underscore
96
+ FireWatir::Container.module_eval "def #{method_name}(how, what=nil)
97
+ locate if defined?(locate)
98
+ return #{class_name}.new(self, how, what); end"
99
+ end
100
+
101
+ attr_accessor :element_name
102
+ #def get_element_name
103
+ # return @element_name
104
+ #end
105
+ #
106
+ # Description:
107
+ # Locate the element on the page. Element can be a span, div, label, p or pre HTML tag.
108
+ #
109
+ def locate
110
+ if(@how == :jssh_name)
111
+ @element_name = @what
112
+ elsif @how == :xpath
113
+ @element_name = element_by_xpath(@container, @what)
114
+ else
115
+ @element_name = locate_tagged_element(self.class::TAG, @how, @what)
116
+ end
117
+ @o = self
118
+ end
119
+
120
+ # - how - Attribute to identify the element.
121
+ # - what - Value of that attribute.
122
+ def initialize(container, how, what)
123
+ #@element = Element.new(nil)
124
+ @how = how
125
+ @what = what
126
+ @container = container
127
+ @o = nil
128
+ end
129
+
130
+ # Returns a string of properties of the object.
131
+ def to_s(attributes = nil)
132
+ assert_exists
133
+ hash_properties = {"text"=>"innerHTML"}
134
+ hash_properties.update(attributes) if attributes != nil
135
+ r = super(hash_properties)
136
+ #r = string_creator
137
+ #r += span_div_string_creator
138
+ return r.join("\n")
139
+ end
140
+
141
+ end
142
+
143
+ class Pre < NonControlElement
144
+ TAG = 'PRE'
145
+ end
146
+
147
+ class P < NonControlElement
148
+ TAG = 'P'
149
+ end
150
+
151
+ class Div < NonControlElement
152
+ TAG = 'DIV'
153
+ end
154
+
155
+ class Span < NonControlElement
156
+ TAG = 'SPAN'
157
+ end
158
+
159
+ class Label < NonControlElement
160
+ TAG = 'LABEL'
161
+
162
+ #
163
+ # Description:
164
+ # Used to populate the properties in the to_s method.
165
+ #
166
+ #def label_string_creator
167
+ # n = []
168
+ # n << "for:".ljust(TO_S_SIZE) + self.for
169
+ # n << "inner text:".ljust(TO_S_SIZE) + self.text
170
+ # return n
171
+ #end
172
+ #private :label_string_creator
173
+
174
+ #
175
+ # Description:
176
+ # Creates string of properties of the object.
177
+ #
178
+ def to_s
179
+ assert_exists
180
+ super({"for" => "htmlFor","text" => "innerHTML"})
181
+ # r=r + label_string_creator
182
+ end
183
+ end
184
+
185
+ class Table < Element
186
+ attr_accessor :element_name
187
+ TAG = 'TABLE'
188
+
189
+ # - how - Attribute to identify the table element.
190
+ # - what - Value of that attribute.
191
+ def initialize(container, how, what)
192
+ @how = how
193
+ @what = what
194
+ @container = container
195
+ @o = nil
196
+ #super nil
197
+ end
198
+
199
+ #
200
+ # Description:
201
+ # Locate the table element.
202
+ #
203
+ def locate
204
+ if @how == :jssh_name
205
+ @element_name = @what
206
+ elsif @how == :xpath
207
+ @element_name = element_by_xpath(@container, @what)
208
+ else
209
+ @element_name = locate_tagged_element('TABLE', @how, @what)
210
+ end
211
+ @o = self
212
+ end
213
+
214
+ #
215
+ # Description:
216
+ # Override the highlight method, as if the tables rows are set to have a background color,
217
+ # this will override the table background color, and the normal flash method wont work
218
+ #
219
+ def highlight(set_or_clear )
220
+
221
+ if set_or_clear == :set
222
+ begin
223
+ @original_border = @o.border.to_i
224
+ if @o.border.to_i==1
225
+ @o.border = 2
226
+ else
227
+ @o.border=1
228
+ end
229
+ rescue
230
+ @original_border = nil
231
+ end
232
+ else
233
+ begin
234
+ @o.border= @original_border unless @original_border == nil
235
+ @original_border = nil
236
+ rescue
237
+ # we could be here for a number of reasons...
238
+ ensure
239
+ @original_border = nil
240
+ end
241
+ end
242
+ super
243
+ end
244
+
245
+ #
246
+ # Description:
247
+ # Used to populate the properties in the to_s method.
248
+ #
249
+ #def table_string_creator
250
+ # n = []
251
+ # n << "rows:".ljust(TO_S_SIZE) + self.row_count.to_s
252
+ # n << "cols:".ljust(TO_S_SIZE) + self.column_count.to_s
253
+ # return n
254
+ #end
255
+ #private :table_string_creator
256
+
257
+ # returns the properties of the object in a string
258
+ # raises an ObjectNotFound exception if the object cannot be found
259
+ # TODO: Implement to_s method for this class.
260
+
261
+ def to_s
262
+ assert_exists
263
+ r = super({"rows" => "rows.length","columns" => "columnLength", "cellspacing" => "cellspacing", "cellpadding" => "cellpadding", "border" => "border"})
264
+ # r += self.column_count.to_s
265
+ end
266
+
267
+ #
268
+ # Description:
269
+ # Gets the number of rows in the table.
270
+ #
271
+ # Output:
272
+ # Number of rows.
273
+ #
274
+ def row_count
275
+ assert_exists
276
+ return rows.length
277
+ end
278
+
279
+ #
280
+ # Description:
281
+ # Gets the table as a 2 dimensional array. Dont expect too much if there are nested tables, colspan etc.
282
+ #
283
+ # Output:
284
+ # 2D array with rows and column text of the table.
285
+ #
286
+ def to_a
287
+ assert_exists
288
+ y = []
289
+ table_rows = rows
290
+ for row in table_rows
291
+ x = []
292
+ row.each do |td|
293
+ x << td.to_s.strip
294
+ end
295
+ y << x
296
+ end
297
+ return y
298
+ end
299
+
300
+ #
301
+ # Description:
302
+ # Gets the array of rows in the table.
303
+ #
304
+ # Output:
305
+ # Array of rows.
306
+ #
307
+ def rows
308
+ assert_exists
309
+ arr_rows = get_rows
310
+ table_rows = Array.new(arr_rows.length)
311
+ for i in 0..arr_rows.length - 1 do
312
+ table_rows[i] = TableRow.new(@container, :jssh_name, arr_rows[i])
313
+ end
314
+ return table_rows
315
+ end
316
+
317
+ #
318
+ # Description:
319
+ # Get row at particular index in table.
320
+ #
321
+ # Input:
322
+ # key - row index
323
+ #
324
+ # Output:
325
+ # Table Row element
326
+ #
327
+ def [](key)
328
+ assert_exists
329
+ arr_rows = rows
330
+ return arr_rows[key - 1]
331
+ end
332
+
333
+ #
334
+ # Desription:
335
+ # Iterate over each table row element.
336
+ #
337
+ def each
338
+ assert_exists
339
+ arr_rows = rows
340
+ for i in 0..arr_rows.length - 1 do
341
+ yield arr_rows[i]
342
+ end
343
+ end
344
+
345
+ #
346
+ # Description:
347
+ # Get column count of first row in the table.
348
+ #
349
+ # Output:
350
+ # Number of columns in first row.
351
+ #
352
+ def column_count
353
+ assert_exists
354
+ arr_rows = rows
355
+ return arr_rows[0].column_count
356
+ end
357
+
358
+ #
359
+ # Description:
360
+ # Get values of specified column in each row.
361
+ #
362
+ # Input:
363
+ # Column number
364
+ #
365
+ # Output:
366
+ # Values of column (specified as input) in each row
367
+ #
368
+ def column_values(column)
369
+ assert_exists
370
+ arr_rows = rows
371
+ values = Array.new(arr_rows.length)
372
+ for i in 0..arr_rows.length - 1 do
373
+ values[i] = arr_rows[i][column].to_s
374
+ end
375
+ return values
376
+ end
377
+
378
+ #
379
+ # Description:
380
+ # Get values of all the column in specified row.
381
+ #
382
+ # Input:
383
+ # Row number.
384
+ #
385
+ # Output:
386
+ # Value of all columns present in the row.
387
+ #
388
+ def row_values(row)
389
+ assert_exists
390
+ arr_rows = rows
391
+ cells = arr_rows[row - 1].cells
392
+ values = Array.new(cells.length)
393
+ for i in 0..cells.length - 1 do
394
+ values[i] = cells[i].to_s
395
+ end
396
+ return values
397
+ end
398
+ end
399
+
400
+ # this class is a collection of the table body objects that exist in the table
401
+ # it wouldnt normally be created by a user, but gets returned by the bodies method of the Table object
402
+ # many of the methods available to this object are inherited from the Element class
403
+ # TODO: Implement TableBodies class.
404
+ #class TableBodies < Element
405
+ #
406
+ # Description:
407
+ # Initializes the form element.
408
+ #
409
+ # Input:
410
+ # - how - Attribute to identify the form element.
411
+ # - what - Value of that attribute.
412
+ #
413
+ #def initialize( parent_table)
414
+ # element = container
415
+ # @o = parent_table # in this case, @o is the parent table
416
+ #end
417
+
418
+ # returns the number of TableBodies that exist in the table
419
+ #def length
420
+ # assert_exists
421
+ # return @o.tBodies.length
422
+ #end
423
+
424
+ # returns the n'th Body as a FireWatir TableBody object
425
+ #def []n
426
+ # assert_exists
427
+ # return TableBody.new(element, :direct, ole_table_body_at_index(n))
428
+ #end
429
+
430
+ # returns an ole table body
431
+ #def ole_table_body_at_index(n)
432
+ # return @o.tBodies[(n-1).to_s]
433
+ #end
434
+
435
+ # iterates through each of the TableBodies in the Table. Yields a TableBody object
436
+ #def each
437
+ # 1.upto( @o.tBodies.length ) { |i| yield TableBody.new(element, :direct, ole_table_body_at_index(i)) }
438
+ #end
439
+
440
+ #end
441
+
442
+ # this class is a table body
443
+ # TODO: Implement TableBody class
444
+ #class TableBody < Element
445
+ #def locate
446
+ # @o = nil
447
+ # if @how == :direct
448
+ # @o = @what # in this case, @o is the table body
449
+ # elsif @how == :index
450
+ # @o = @parent_table.bodies.ole_table_body_at_index(@what)
451
+ # end
452
+ # @rows = []
453
+ # if @o
454
+ # @o.rows.each do |oo|
455
+ # @rows << TableRow.new(element, :direct, oo)
456
+ # end
457
+ # end
458
+ #end
459
+
460
+ #
461
+ # Description:
462
+ # Initializes the form element.
463
+ #
464
+ # Input:
465
+ # - how - Attribute to identify the form element.
466
+ # - what - Value of that attribute.
467
+ #
468
+ #def initialize( how, what, parent_table = nil)
469
+ # element = container
470
+ # @how = how
471
+ # @what = what
472
+ # @parent_table = parent_table
473
+ # super nil
474
+ #end
475
+
476
+ # returns the specified row as a TableRow object
477
+ #def [](n)
478
+ # assert_exists
479
+ # return @rows[n - 1]
480
+ #end
481
+
482
+ # iterates through all the rows in the table body
483
+ #def each
484
+ # locate
485
+ # 0.upto(@rows.length - 1) { |i| yield @rows[i] }
486
+ #end
487
+
488
+ # returns the number of rows in this table body.
489
+ #def length
490
+ # return @rows.length
491
+ #end
492
+ #end
493
+
494
+
495
+ #
496
+ # Description:
497
+ # Class for Table row element.
498
+ #
499
+ class TableRow < Element
500
+ attr_accessor :element_name
501
+
502
+ #
503
+ # Description:
504
+ # Locate the table row element on the page.
505
+ #
506
+ def locate
507
+ @o = nil
508
+ if @how == :jssh_name
509
+ @element_name = @what
510
+ elsif @how == :xpath
511
+ @element_name = element_by_xpath(@container, @what)
512
+ else
513
+ @element_name = locate_tagged_element("TR", @how, @what)
514
+ end
515
+ @o = self
516
+ end
517
+
518
+ #
519
+ # Description:
520
+ # Initializes the instance of table row object.
521
+ #
522
+ # Input:
523
+ # - how - Attribute to identify the table row element.
524
+ # - what - Value of that attribute.
525
+ #
526
+ def initialize(container, how, what)
527
+ @how = how
528
+ @what = what
529
+ @container = container
530
+ #super nil
531
+ end
532
+
533
+ #
534
+ # Description:
535
+ # Gets the length of columns in table row.
536
+ #
537
+ # Output:
538
+ # Length of columns in table row.
539
+ #
540
+ def column_count
541
+ assert_exists
542
+ arr_cells = cells
543
+ return arr_cells.length
544
+ end
545
+
546
+ #
547
+ # Description:
548
+ # Get cell at specified index in a row.
549
+ #
550
+ # Input:
551
+ # key - column index.
552
+ #
553
+ # Output:
554
+ # Table cell element at specified index.
555
+ #
556
+ def [] (key)
557
+ assert_exists
558
+ arr_cells = cells
559
+ return arr_cells[key - 1]
560
+ end
561
+
562
+ #
563
+ # Description:
564
+ # Iterate over each cell in a row.
565
+ #
566
+ def each
567
+ assert_exists
568
+ arr_cells = cells
569
+ for i in 0..arr_cells.length - 1 do
570
+ yield arr_cells[i]
571
+ end
572
+ end
573
+
574
+ #
575
+ # Description:
576
+ # Get array of all cells in Table Row
577
+ #
578
+ # Output:
579
+ # Array containing Table Cell elements.
580
+ #
581
+ def cells
582
+ assert_exists
583
+ arr_cells = get_cells
584
+ row_cells = Array.new(arr_cells.length)
585
+ for i in 0..arr_cells.length - 1 do
586
+ row_cells[i] = TableCell.new(@container, :jssh_name, arr_cells[i])
587
+ end
588
+ return row_cells
589
+ end
590
+ end
591
+
592
+ #
593
+ # Description:
594
+ # Class for Table Cell.
595
+ #
596
+ class TableCell < Element
597
+ attr_accessor :element_name
598
+
599
+ # Description:
600
+ # Locate the table cell element on the page.
601
+ #
602
+ def locate
603
+ if @how == :jssh_name
604
+ @element_name = @what
605
+ elsif @how == :xpath
606
+ @element_name = element_by_xpath(@container, @what)
607
+ else
608
+ @element_name = locate_tagged_element("TD", @how, @what)
609
+ end
610
+ @o = self
611
+ end
612
+
613
+ #
614
+ # Description:
615
+ # Initializes the instance of table cell object.
616
+ #
617
+ # Input:
618
+ # - how - Attribute to identify the table cell element.
619
+ # - what - Value of that attribute.
620
+ #
621
+ def initialize(container, how, what)
622
+ @how = how
623
+ @what = what
624
+ @container = container
625
+ #super nil
626
+ end
627
+
628
+ alias to_s text
629
+
630
+ #
631
+ # Description:
632
+ # Gets the col span of table cell.
633
+ #
634
+ # Output:
635
+ # Colspan of table cell.
636
+ #
637
+ def colspan
638
+ assert_exists
639
+ @o.colSpan
640
+ end
641
+
642
+ end
643
+
644
+ #
645
+ # Description:
646
+ # Class for Image element.
647
+ #
648
+ class Image < Element
649
+ attr_accessor :element_name
650
+ TAG = 'IMG'
651
+ #
652
+ # Description:
653
+ # Initializes the instance of image object.
654
+ #
655
+ # Input:
656
+ # - how - Attribute to identify the image element.
657
+ # - what - Value of that attribute.
658
+ #
659
+ def initialize(container, how, what)
660
+ @how = how
661
+ @what = what
662
+ @container = container
663
+ end
664
+
665
+ # Description:
666
+ # Locate the image element on the page.
667
+ #
668
+ def locate
669
+ if @how == :jssh_name
670
+ @element_name = @what
671
+ elsif @how == :xpath
672
+ @element_name = element_by_xpath(@container, @what)
673
+ else
674
+ @element_name = locate_tagged_element('IMG', @how, @what)
675
+ end
676
+ @o = self
677
+ end
678
+
679
+ #
680
+ # Description:
681
+ # Used to populate the properties in to_s method. Not used anymore
682
+ #
683
+ def image_string_creator
684
+ n = []
685
+ n << "src:".ljust(TO_S_SIZE) + self.src.to_s
686
+ n << "file date:".ljust(TO_S_SIZE) + self.fileCreatedDate.to_s
687
+ n << "file size:".ljust(TO_S_SIZE) + self.fileSize.to_s
688
+ n << "width:".ljust(TO_S_SIZE) + self.width.to_s
689
+ n << "height:".ljust(TO_S_SIZE) + self.height.to_s
690
+ n << "alt:".ljust(TO_S_SIZE) + self.alt.to_s
691
+ return n
692
+ end
693
+ private :image_string_creator
694
+
695
+ # returns a string representation of the object
696
+ def to_s
697
+ assert_exists
698
+ super({"src" => "src","width" => "width","height" => "height","alt" => "alt"})
699
+ end
700
+
701
+ # this method returns the file created date of the image
702
+ #def fileCreatedDate
703
+ # assert_exists
704
+ # return @o.invoke("fileCreatedDate")
705
+ #end
706
+
707
+ # this method returns the filesize of the image
708
+ #def fileSize
709
+ # assert_exists
710
+ # return @o.invoke("fileSize").to_s
711
+ #end
712
+
713
+ #
714
+ # Description:
715
+ # Gets the width of the image in pixels, as a string.
716
+ #
717
+ # Output:
718
+ # Width of image (in pixels).
719
+ #
720
+ def width
721
+ assert_exists
722
+ return @o.invoke("width").to_s
723
+ end
724
+
725
+ #
726
+ # Description:
727
+ # Gets the height of the image in pixels, as a string.
728
+ #
729
+ # Output:
730
+ # Height of image (in pixels).
731
+ #
732
+ def height
733
+ assert_exists
734
+ return @o.invoke("height").to_s
735
+ end
736
+
737
+ # This method attempts to find out if the image was actually loaded by the web browser.
738
+ # If the image was not loaded, the browser is unable to determine some of the properties.
739
+ # We look for these missing properties to see if the image is really there or not.
740
+ # If the Disk cache is full ( tools menu -> Internet options -> Temporary Internet Files) , it may produce incorrect responses.
741
+ #def hasLoaded?
742
+ # locate
743
+ # raise UnknownObjectException, "Unable to locate image using #{@how} and #{@what}" if @o == nil
744
+ # return false if @o.fileCreatedDate == "" and @o.fileSize.to_i == -1
745
+ # return true
746
+ #end
747
+
748
+ #
749
+ # Description:
750
+ # Highlights the image ( in fact it adds or removes a border around the image)
751
+ #
752
+ # Input:
753
+ # - set_or_clear - :set to set the border, :clear to remove it
754
+ #
755
+ def highlight( set_or_clear )
756
+ if set_or_clear == :set
757
+ begin
758
+ @original_border = @o.border
759
+ @o.border = 1
760
+ rescue
761
+ @original_border = nil
762
+ end
763
+ else
764
+ begin
765
+ @o.border = @original_border
766
+ @original_border = nil
767
+ rescue
768
+ # we could be here for a number of reasons...
769
+ ensure
770
+ @original_border = nil
771
+ end
772
+ end
773
+ end
774
+ private :highlight
775
+ end
776
+
777
+
778
+ #
779
+ # Description:
780
+ # Class for Link element.
781
+ #
782
+ class Link < Element
783
+ attr_accessor :element_name
784
+ TAG = 'A'
785
+ #
786
+ # Description:
787
+ # Initializes the instance of link element.
788
+ #
789
+ # Input:
790
+ # - how - Attribute to identify the link element.
791
+ # - what - Value of that attribute.
792
+ #
793
+ def initialize(container, how, what)
794
+ @how = how
795
+ @what = what
796
+ @container = container
797
+ end
798
+
799
+ #
800
+ # Description:
801
+ # Locate the link element on the page.
802
+ #
803
+ def locate
804
+ if @how == :jssh_name
805
+ @element_name = @what
806
+ elsif @how == :xpath
807
+ @element_name = element_by_xpath(@container, @what)
808
+ else
809
+ @element_name = locate_tagged_element('A', @how, @what)
810
+ end
811
+ @o = self
812
+ end
813
+
814
+ #TODO: if an image is used as part of the link, this will return true
815
+ #def link_has_image
816
+ # assert_exists
817
+ # return true if @o.getElementsByTagName("IMG").length > 0
818
+ # return false
819
+ #end
820
+
821
+ #TODO: this method returns the src of an image, if an image is used as part of the link
822
+ #def src # BUG?
823
+ # assert_exists
824
+ # if @o.getElementsByTagName("IMG").length > 0
825
+ # return @o.getElementsByTagName("IMG")[0.to_s].src
826
+ # else
827
+ # return ""
828
+ # end
829
+ #end
830
+
831
+ #
832
+ # Description:
833
+ # Used to populate the properties in to_s method.
834
+ #
835
+ #def link_string_creator
836
+ # n = []
837
+ # n << "href:".ljust(TO_S_SIZE) + self.href
838
+ # n << "inner text:".ljust(TO_S_SIZE) + self.text
839
+ # n << "img src:".ljust(TO_S_SIZE) + self.src if self.link_has_image
840
+ # return n
841
+ # end
842
+
843
+ # returns a textual description of the link
844
+
845
+ def to_s
846
+ assert_exists
847
+ super({"href" => "href","inner text" => "text"})
848
+ end
849
+ end
850
+
851
+ #
852
+ # Description:
853
+ # Base class containing items that are common between select list, text field, button, hidden, file field classes.
854
+ #
855
+ class InputElement < Element
856
+ attr_accessor :element_name
857
+ #
858
+ # Description:
859
+ # Locate the element on the page. Element can be a select list, text field, button, hidden, file field.
860
+ #
861
+ def locate
862
+ if @how == :jssh_name
863
+ @element_name = @what
864
+ elsif @how == :xpath
865
+ @element_name = element_by_xpath(@container, @what)
866
+ else
867
+ if(self.class::INPUT_TYPES.include?("select-one"))
868
+ @element_name = locate_tagged_element("select", @how, @what, self.class::INPUT_TYPES)
869
+ else
870
+ @element_name = locate_tagged_element("input", @how, @what, self.class::INPUT_TYPES)
871
+ end
872
+ end
873
+ @o = self
874
+ end
875
+ #
876
+ # Description:
877
+ # Initializes the instance of element.
878
+ #
879
+ # Input:
880
+ # - how - Attribute to identify the element.
881
+ # - what - Value of that attribute.
882
+ #
883
+ def initialize(container, how, what)
884
+ @how = how
885
+ @what = what
886
+ @container = container
887
+ @element_name = ""
888
+ #super(nil)
889
+ end
890
+ end
891
+
892
+ #
893
+ # Description:
894
+ # Class for SelectList element.
895
+ #
896
+ class SelectList < InputElement
897
+ INPUT_TYPES = ["select-one", "select-multiple"]
898
+
899
+ attr_accessor :o
900
+
901
+ #
902
+ # Description:
903
+ # Clears the selected items in the select box.
904
+ #
905
+ def clearSelection
906
+ assert_exists
907
+ #highlight( :set)
908
+ wait = false
909
+ @o.each do |selectBoxItem|
910
+ if selectBoxItem.selected
911
+ selectBoxItem.selected = false
912
+ wait = true
913
+ end
914
+ end
915
+ @o.wait if wait
916
+ #highlight( :clear)
917
+ end
918
+
919
+ def each
920
+ assert_exists
921
+ arr_options = options
922
+ #puts arr_options[0]#.length
923
+ for i in 0..arr_options.length - 1 do
924
+ yield Option.new(self, :jssh_name, arr_options[i])
925
+ end
926
+ end
927
+
928
+ #
929
+ # Description:
930
+ # Get option element at specified index in select list.
931
+ #
932
+ # Input:
933
+ # key - option index
934
+ #
935
+ # Output:
936
+ # Option element at specified index
937
+ #
938
+ def [] (key)
939
+ assert_exists
940
+ arr_options = options
941
+ return Option.new(self, :jssh_name, arr_options[key - 1])
942
+ end
943
+
944
+ #
945
+ # Description:
946
+ # Selects an item by text. If you need to select multiple items you need to call this function for each item.
947
+ #
948
+ # Input:
949
+ # - item - Text of item to be selected.
950
+ #
951
+ def select( item )
952
+ select_item_in_select_list(:text, item)
953
+ end
954
+
955
+ #
956
+ # Description:
957
+ # Selects an item by value. If you need to select multiple items you need to call this function for each item.
958
+ #
959
+ # Input:
960
+ # - item - Value of the item to be selected.
961
+ #
962
+ def select_value( item )
963
+ select_item_in_select_list( :value , item )
964
+ end
965
+
966
+ # Description:
967
+ # Selects item from the select box.
968
+ #
969
+ # Input:
970
+ # - name - :value or :text - how we find an item in the select box
971
+ # - item - value of either item text or item value.
972
+ #
973
+ def select_item_in_select_list(attribute, value)
974
+ assert_exists
975
+ highlight( :set )
976
+ doBreak = false
977
+ #element.log "Setting box #{@o.name} to #{attribute} #{value} "
978
+ @o.each do |option| # items in the list
979
+ if value.matches( option.invoke(attribute.to_s))
980
+ if option.selected
981
+ doBreak = true
982
+ break
983
+ else
984
+ option.selected = true
985
+ @o.fireEvent("onChange")
986
+ @o.wait
987
+ doBreak = true
988
+ break
989
+ end
990
+ end
991
+ end
992
+ unless doBreak
993
+ raise NoValueFoundException,
994
+ "No option with #{attribute.to_s} of #{value} in this select element"
995
+ end
996
+ highlight( :clear )
997
+ end
998
+ private :select_item_in_select_list
999
+
1000
+ #
1001
+ # Description:
1002
+ # Gets all the items in the select list as an array.
1003
+ # An empty array is returned if the select box has no contents.
1004
+ #
1005
+ # Output:
1006
+ # Array containing the items of the select list.
1007
+ #
1008
+ def getAllContents() # BUG: camel_case.rb
1009
+ assert_exists
1010
+ #element.log "There are #{@o.length} items"
1011
+ returnArray = []
1012
+ @o.each { |thisItem| returnArray << thisItem.text }
1013
+ return returnArray
1014
+ end
1015
+
1016
+ #
1017
+ # Description:
1018
+ # Gets all the selected items in the select list as an array.
1019
+ # An empty array is returned if the select box has no selected item.
1020
+ #
1021
+ # Output:
1022
+ # Array containing the selected items of the select list.
1023
+ #
1024
+ def getSelectedItems
1025
+ assert_exists
1026
+ returnArray = []
1027
+ #element.log "There are #{@o.length} items"
1028
+ @o.each do |thisItem|
1029
+ #puts "#{thisItem.selected}"
1030
+ if thisItem.selected
1031
+ #element.log "Item ( #{thisItem.text} ) is selected"
1032
+ returnArray << thisItem.text
1033
+ end
1034
+ end
1035
+ return returnArray
1036
+ end
1037
+
1038
+ #
1039
+ # Description:
1040
+ # Get the option using attribute and its value.
1041
+ #
1042
+ # Input:
1043
+ # - attribute - Attribute used to find the option.
1044
+ # - value - value of that attribute.
1045
+ #
1046
+ def option (attribute, value)
1047
+ assert_exists
1048
+ Option.new(self, attribute, value)
1049
+ end
1050
+ end
1051
+
1052
+ #
1053
+ # Description:
1054
+ # Class for Option element.
1055
+ #
1056
+ class Option < SelectList
1057
+ #
1058
+ # Description:
1059
+ # Initializes the instance of option object.
1060
+ #
1061
+ # Input:
1062
+ # - select_list - instance of select list element.
1063
+ # - attribute - Attribute to identify the option.
1064
+ # - value - Value of that attribute.
1065
+ #
1066
+ def initialize (select_list, attribute, value)
1067
+ @select_list = @container = select_list
1068
+ @how = attribute
1069
+ @what = value
1070
+ @option = nil
1071
+ @element_name = ""
1072
+
1073
+ unless [:text, :value, :jssh_name].include? attribute
1074
+ raise MissingWayOfFindingObjectException,
1075
+ "Option does not support attribute #{@how}"
1076
+ end
1077
+ #puts @select_list.o.length
1078
+ #puts "what is : #{@what}, how is #{@how}, list name is : #{@select_list.element_name}"
1079
+ if(attribute == :jssh_name)
1080
+ @element_name = @what
1081
+ @option = self
1082
+ else
1083
+ @select_list.o.each do |option| # items in the list
1084
+ #puts "option is : #{option}"
1085
+ if(attribute == :value)
1086
+ match_value = option.value
1087
+ else
1088
+ match_value = option.text
1089
+ end
1090
+ #puts "value is #{match_value}"
1091
+ if value.matches( match_value) #option.invoke(attribute))
1092
+ @option = option
1093
+ @element_name = option.element_name
1094
+ break
1095
+ end
1096
+ end
1097
+ end
1098
+ end
1099
+
1100
+ #
1101
+ # Description:
1102
+ # Checks if option exists or not.
1103
+ #
1104
+ def assert_exists
1105
+ unless @option
1106
+ raise UnknownObjectException,
1107
+ "Unable to locate an option using #{@how} and #{@what}"
1108
+ end
1109
+ end
1110
+ private :assert_exists
1111
+
1112
+ #
1113
+ # Description:
1114
+ # Selects the option.
1115
+ #
1116
+ def select
1117
+ assert_exists
1118
+ if(@how == :text)
1119
+ @select_list.select(@what)
1120
+ elsif(@how == :value)
1121
+ @select_list.select_value(@what)
1122
+ end
1123
+ end
1124
+
1125
+ #
1126
+ # Description:
1127
+ # Gets the class name of the option.
1128
+ #
1129
+ # Output:
1130
+ # Class name of the option.
1131
+ #
1132
+ def class_name
1133
+ assert_exists
1134
+ option_class_name
1135
+ end
1136
+
1137
+ #
1138
+ # Description:
1139
+ # Gets the text of the option.
1140
+ #
1141
+ # Output:
1142
+ # Text of the option.
1143
+ #
1144
+ def text
1145
+ assert_exists
1146
+ option_text
1147
+ end
1148
+
1149
+ #
1150
+ # Description:
1151
+ # Gets the value of the option.
1152
+ #
1153
+ # Output:
1154
+ # Value of the option.
1155
+ #
1156
+ def value
1157
+ assert_exists
1158
+ option_value
1159
+ end
1160
+
1161
+ #
1162
+ # Description:
1163
+ # Gets the status of the option; whether it is selected or not.
1164
+ #
1165
+ # Output:
1166
+ # True if option is selected, false otherwise.
1167
+ #
1168
+ def selected
1169
+ assert_exists
1170
+ #@option.selected
1171
+ option_selected
1172
+ end
1173
+ end
1174
+
1175
+ #
1176
+ # Description:
1177
+ # Class for Button element.
1178
+ #
1179
+ class Button < InputElement
1180
+ INPUT_TYPES = ["button", "submit", "image", "reset"]
1181
+ def locate
1182
+ super
1183
+ @o = @element.locate_tagged_element("button", @how, @what, self.class::INPUT_TYPES) unless @o
1184
+ end
1185
+ end
1186
+
1187
+ #
1188
+ # Description:
1189
+ # Class for Text Field element.
1190
+ #
1191
+ class TextField < InputElement
1192
+ INPUT_TYPES = ["text", "password", "textarea"]
1193
+
1194
+ # Gets the size of the text field element.
1195
+ def_wrap :size
1196
+ # Gets max length of the text field element.
1197
+ def_wrap :maxlength_string, :maxlength
1198
+ def maxlength
1199
+ maxlength_string.to_i
1200
+ end
1201
+ # Returns true if the text field is read only, false otherwise.
1202
+ def_wrap :readonly?, :readOnly
1203
+
1204
+ #
1205
+ # Description:
1206
+ # Used to populate the properties in to_s method
1207
+ #
1208
+ #def text_string_creator
1209
+ # n = []
1210
+ # n << "length:".ljust(TO_S_SIZE) + self.size.to_s
1211
+ # n << "max length:".ljust(TO_S_SIZE) + self.maxlength.to_s
1212
+ # n << "read only:".ljust(TO_S_SIZE) + self.readonly?.to_s
1213
+ #
1214
+ # return n
1215
+ #end
1216
+ #private :text_string_creator
1217
+
1218
+ # TODO: Impelement the to_s method.
1219
+ def to_s
1220
+ assert_exists
1221
+ super({"length" => "size","max length" => "maxlength","read only" => "readOnly" })
1222
+ end
1223
+
1224
+ #
1225
+ # Description:
1226
+ # Checks if object is read-only or not.
1227
+ #
1228
+ def assert_not_readonly
1229
+ raise ObjectReadOnlyException, "Textfield #{@how} and #{@what} is read only." if self.readonly?
1230
+ end
1231
+
1232
+ #
1233
+ # Description:
1234
+ # Checks if the provided text matches with the contents of text field. Text can be a string or regular expression.
1235
+ #
1236
+ # Input:
1237
+ # - containsThis - Text to verify.
1238
+ #
1239
+ # Output:
1240
+ # True if provided text matches with the contents of text field, false otherwise.
1241
+ #
1242
+ def verify_contains( containsThis )
1243
+ assert_exists
1244
+ if containsThis.kind_of? String
1245
+ return true if self.value == containsThis
1246
+ elsif containsThis.kind_of? Regexp
1247
+ return true if self.value.match(containsThis) != nil
1248
+ end
1249
+ return false
1250
+ end
1251
+
1252
+ # this method is used to drag the entire contents of the text field to another text field
1253
+ # 19 Jan 2005 - It is added as prototype functionality, and may change
1254
+ # * destination_how - symbol, :id, :name how we identify the drop target
1255
+ # * destination_what - string or regular expression, the name, id, etc of the text field that will be the drop target
1256
+ # TODO: Can we have support for this in Firefox.
1257
+ #def dragContentsTo( destination_how , destination_what)
1258
+ # assert_exists
1259
+ # destination = element.text_field(destination_how, destination_what)
1260
+ # raise UnknownObjectException , "Unable to locate destination using #{destination_how } and #{destination_what } " if destination.exists? == false
1261
+
1262
+ # @o.focus
1263
+ # @o.select()
1264
+ # value = self.value
1265
+
1266
+ # @o.fireEvent("onSelect")
1267
+ # @o.fireEvent("ondragstart")
1268
+ # @o.fireEvent("ondrag")
1269
+ # destination.fireEvent("onDragEnter")
1270
+ # destination.fireEvent("onDragOver")
1271
+ # destination.fireEvent("ondrop")
1272
+
1273
+ # @o.fireEvent("ondragend")
1274
+ # destination.value= ( destination.value + value.to_s )
1275
+ # self.value = ""
1276
+ #end
1277
+
1278
+ #
1279
+ # Description:
1280
+ # Clears the contents of the text field.
1281
+ # Raises ObjectDisabledException if text field is disabled.
1282
+ # Raises ObjectReadOnlyException if text field is read only.
1283
+ #
1284
+ def clear
1285
+ assert_exists
1286
+ assert_enabled
1287
+ assert_not_readonly
1288
+
1289
+ highlight(:set)
1290
+
1291
+ @o.scrollIntoView
1292
+ @o.focus
1293
+ @o.select()
1294
+ @o.fireEvent("onSelect")
1295
+ @o.value = ""
1296
+ @o.fireEvent("onKeyPress")
1297
+ @o.fireEvent("onChange")
1298
+ @container.wait()
1299
+ highlight(:clear)
1300
+ end
1301
+
1302
+ #
1303
+ # Description:
1304
+ # Append the provided text to the contents of the text field.
1305
+ # Raises ObjectDisabledException if text field is disabled.
1306
+ # Raises ObjectReadOnlyException if text field is read only.
1307
+ #
1308
+ # Input:
1309
+ # - setThis - Text to be appended.
1310
+ #
1311
+ def append( setThis)
1312
+ assert_exists
1313
+ assert_enabled
1314
+ assert_not_readonly
1315
+
1316
+ highlight(:set)
1317
+ @o.scrollIntoView
1318
+ @o.focus
1319
+ doKeyPress( setThis )
1320
+ highlight(:clear)
1321
+ end
1322
+
1323
+ #
1324
+ # Description:
1325
+ # Sets the contents of the text field to the provided text. Overwrite the existing contents.
1326
+ # Raises ObjectDisabledException if text field is disabled.
1327
+ # Raises ObjectReadOnlyException if text field is read only.
1328
+ #
1329
+ # Input:
1330
+ # - setThis - Text to be set.
1331
+ #
1332
+ def set( setThis )
1333
+ assert_exists
1334
+ assert_enabled
1335
+ assert_not_readonly
1336
+
1337
+ highlight(:set)
1338
+ @o.scrollIntoView
1339
+ @o.focus
1340
+ @o.select()
1341
+ @o.fireEvent("onSelect")
1342
+ @o.value = ""
1343
+ @o.fireEvent("onKeyPress")
1344
+ doKeyPress( setThis )
1345
+ highlight(:clear)
1346
+ @o.fireEvent("onChange")
1347
+ @o.fireEvent("onBlur")
1348
+ end
1349
+
1350
+ #
1351
+ # Description:
1352
+ # Sets the text of the text field withoud firing the events like onKeyPress, onKeyDown etc. This should not be used generally, but it
1353
+ # is useful in situations where you need to set large text to the text field and you know that you don't have any event to be
1354
+ # fired.
1355
+ #
1356
+ # Input:
1357
+ # - v - Text to be set.
1358
+ #
1359
+ #def value=(v)
1360
+ # assert_exists
1361
+ # @o.value = v.to_s
1362
+ #end
1363
+
1364
+ #
1365
+ # Description:
1366
+ # Used to set the value of text box and fires the event onKeyPress, onKeyDown, onKeyUp after each character.
1367
+ # Shouldnot be used externally. Used internally by set and append methods.
1368
+ #
1369
+ # Input:
1370
+ # - value - The string to enter into the text field
1371
+ #
1372
+ def doKeyPress( value )
1373
+ begin
1374
+ max = maxlength
1375
+ if (max > 0 && value.length > max)
1376
+ original_value = value
1377
+ value = original_value[0...max]
1378
+ element.log " Supplied string is #{suppliedValue.length} chars, which exceeds the max length (#{max}) of the field. Using value: #{value}"
1379
+ end
1380
+ rescue
1381
+ # probably a text area - so it doesnt have a max Length
1382
+ end
1383
+ for i in 0..value.length-1
1384
+ #sleep element.typingspeed # typing speed
1385
+ c = value[i,1]
1386
+ #element.log " adding c.chr " + c #.chr.to_s
1387
+ @o.value = "#{(@o.value.to_s + c)}" #c.chr
1388
+ @o.fireEvent("onKeyDown")
1389
+ @o.fireEvent("onKeyPress")
1390
+ @o.fireEvent("onKeyUp")
1391
+ end
1392
+
1393
+ end
1394
+ private :doKeyPress
1395
+
1396
+ alias readOnly? :readonly?
1397
+ alias getContents value
1398
+ alias maxLength maxlength
1399
+
1400
+ end
1401
+
1402
+ #
1403
+ # Description:
1404
+ # Class for Hidden Field element.
1405
+ #
1406
+ class Hidden < TextField
1407
+ INPUT_TYPES = ["hidden"]
1408
+
1409
+ #
1410
+ # Description:
1411
+ # Sets the value of the hidden field. Overriden in this class, as there is no way to set focus to a hidden field
1412
+ #
1413
+ # Input:
1414
+ # n - Value to be set.
1415
+ #
1416
+ def set(n)
1417
+ self.value=n
1418
+ end
1419
+
1420
+ #
1421
+ # Description:
1422
+ # Appends the value to the value of the hidden field. Overriden in this class, as there is no way to set focus to a hidden field
1423
+ #
1424
+ # Input:
1425
+ # n - Value to be appended.
1426
+ #
1427
+ def append(n)
1428
+ self.value = self.value.to_s + n.to_s
1429
+ end
1430
+
1431
+ #
1432
+ # Description:
1433
+ # Clears the value of the hidden field. Overriden in this class, as there is no way to set focus to a hidden field
1434
+ #
1435
+ def clear
1436
+ self.value = ""
1437
+ end
1438
+
1439
+ #
1440
+ # Description:
1441
+ # Does nothing, as you cant set focus to a hidden field. Overridden here so that exception doesn't occurs.
1442
+ #
1443
+ def focus
1444
+ end
1445
+
1446
+ end
1447
+
1448
+ #
1449
+ # Description:
1450
+ # Class for FileField element.
1451
+ #
1452
+ class FileField < InputElement
1453
+ INPUT_TYPES = ["file"]
1454
+
1455
+ #
1456
+ # Description:
1457
+ # Sets the path of the file in the textbox.
1458
+ #
1459
+ # Input:
1460
+ # setPath - Path of the file.
1461
+ #
1462
+ def set(setPath)
1463
+ assert_exists
1464
+
1465
+ setFileFieldValue(setPath)
1466
+ end
1467
+ end
1468
+
1469
+ #
1470
+ # Description:
1471
+ # Base class for checkbox and radio button elements.
1472
+ #
1473
+ class RadioCheckCommon < Element
1474
+ attr_accessor :element_name
1475
+ #
1476
+ # Description:
1477
+ # Initializes the instance of element object. Element can be checkbox or radio button.
1478
+ #
1479
+ # Input:
1480
+ # - how - Attribute to identify the element.
1481
+ # - what - Value of that attribute.
1482
+ # - value - value of the element.
1483
+ #
1484
+ def initialize(container, how, what, value = nil)
1485
+ @how = how
1486
+ @what = what
1487
+ @value = value
1488
+ @container = container
1489
+ end
1490
+
1491
+ #
1492
+ # Description:
1493
+ # Locate the element on the page. Element can be a checkbox or radio button.
1494
+ #
1495
+ def locate
1496
+ if @how == :jssh_name
1497
+ @element_name = @what
1498
+ elsif @how == :xpath
1499
+ @element_name = element_by_xpath(@container, @what)
1500
+ else
1501
+ @element_name = locate_tagged_element("input", @how, @what, @type, @value)
1502
+ end
1503
+ @o = self
1504
+ end
1505
+
1506
+ #
1507
+ # Description:
1508
+ # Checks if element i.e. radio button or check box is checked or not.
1509
+ #
1510
+ # Output:
1511
+ # True if element is checked, false otherwise.
1512
+ #
1513
+ def isSet?
1514
+ assert_exists
1515
+ return @o.checked
1516
+ end
1517
+ alias getState isSet?
1518
+ alias checked? isSet?
1519
+
1520
+ #
1521
+ # Description:
1522
+ # Unchecks the radio button or check box element.
1523
+ # Raises ObjectDisabledException exception if element is disabled.
1524
+ #
1525
+ def clear
1526
+ assert_exists
1527
+ assert_enabled
1528
+ #highlight(:set)
1529
+ set_clear_item(false)
1530
+ #highlight(:clear)
1531
+ end
1532
+
1533
+ #
1534
+ # Description:
1535
+ # Checks the radio button or check box element.
1536
+ # Raises ObjectDisabledException exception if element is disabled.
1537
+ #
1538
+ def set
1539
+ assert_exists
1540
+ assert_enabled
1541
+ #highlight(:set)
1542
+ set_clear_item(true)
1543
+ #highlight(:clear)
1544
+ end
1545
+
1546
+ #
1547
+ # Description:
1548
+ # Used by clear and set method to uncheck and check radio button and checkbox element respectively.
1549
+ #
1550
+ def set_clear_item(set)
1551
+ @o.fire_event("onclick")
1552
+ @container.wait
1553
+ end
1554
+ private :set_clear_item
1555
+
1556
+ end
1557
+
1558
+ #
1559
+ # Description:
1560
+ # Class for RadioButton element.
1561
+ #
1562
+ class Radio < RadioCheckCommon
1563
+ def initialize *args
1564
+ super
1565
+ @type = ["radio"]
1566
+ end
1567
+
1568
+ def clear
1569
+ assert_exists
1570
+ assert_enabled
1571
+ #higlight(:set)
1572
+ @o.checked = false
1573
+ #highlight(:clear)
1574
+ end
1575
+ end
1576
+
1577
+ #
1578
+ # Description:
1579
+ # Class for Checkbox element.
1580
+ #
1581
+ class CheckBox < RadioCheckCommon
1582
+ def initialize *args
1583
+ super
1584
+ @type = ["checkbox"]
1585
+ end
1586
+
1587
+ #
1588
+ # Description:
1589
+ # Checks or unchecks the checkbox. If no value is supplied it will check the checkbox.
1590
+ # Raises ObjectDisabledException exception if the object is disabled
1591
+ #
1592
+ # Input:
1593
+ # - set_or_clear - Parameter indicated whether to check or uncheck the checkbox.
1594
+ # True to check the check box, false for unchecking the checkbox.
1595
+ #
1596
+ def set( set_or_clear=true )
1597
+ assert_exists
1598
+ assert_enabled
1599
+ highlight(:set)
1600
+
1601
+ if set_or_clear == true
1602
+ if @o.checked == false
1603
+ set_clear_item( true )
1604
+ end
1605
+ else
1606
+ self.clear
1607
+ end
1608
+ highlight(:clear )
1609
+ end
1610
+
1611
+ #
1612
+ # Description:
1613
+ # Unchecks the checkbox.
1614
+ # Raises ObjectDisabledException exception if the object is disabled
1615
+ #
1616
+ def clear
1617
+ assert_exists
1618
+ assert_enabled
1619
+ highlight( :set)
1620
+ if @o.checked == true
1621
+ set_clear_item( false )
1622
+ end
1623
+ highlight( :clear)
1624
+ end
1625
+ end
1626
+
1627
+ # this class is the super class for the iterator classes ( buttons, links, spans etc
1628
+ # it would normally only be accessed by the iterator methods ( spans , links etc) of IE
1629
+
1630
+ #class ElementCollections
1631
+ # include Enumerable
1632
+ # include Container
1633
+ # Super class for all the iteractor classes
1634
+ # * container - an instance of an IE object
1635
+ # def initialize( container)
1636
+ # element = container
1637
+ # @length = length() # defined by subclasses
1638
+
1639
+ # set up the items we want to display when the show method s used
1640
+ # set_show_items
1641
+ # end
1642
+
1643
+ # private
1644
+ # def set_show_items
1645
+ # @show_attributes = AttributeLengthPairs.new( "id" , 20)
1646
+ # @show_attributes.add( "name" , 20)
1647
+ # end
1648
+
1649
+ # public
1650
+ # def get_length_of_input_objects(object_type)
1651
+ # object_types =
1652
+ # if object_type.kind_of? Array
1653
+ # object_type
1654
+ # else
1655
+ # [ object_type ]
1656
+ # end
1657
+
1658
+ # length = 0
1659
+ # objects = element.document.getElementsByTagName("INPUT")
1660
+ # if objects.length > 0
1661
+ # objects.each do |o|
1662
+ # length += 1 if object_types.include?(o.invoke("type").downcase )
1663
+ # end
1664
+ # end
1665
+ # return length
1666
+ # end
1667
+
1668
+ # iterate through each of the elements in the collection in turn
1669
+ # def each
1670
+ # 0.upto( @length-1 ) { |i | yield iterator_object(i) }
1671
+ # end
1672
+
1673
+ # allows access to a specific item in the collection
1674
+ # def [](n)
1675
+ # return iterator_object(n-1)
1676
+ # end
1677
+
1678
+ # this method is the way to show the objects, normally used from irb
1679
+ # def show
1680
+ # s="index".ljust(6)
1681
+ # @show_attributes.each do |attribute_length_pair|
1682
+ # s=s + attribute_length_pair.attribute.ljust(attribute_length_pair.length)
1683
+ # end
1684
+
1685
+ # index = 1
1686
+ # self.each do |o|
1687
+ # s= s+"\n"
1688
+ # s=s + index.to_s.ljust(6)
1689
+ # @show_attributes.each do |attribute_length_pair|
1690
+ # begin
1691
+ # s=s + eval( 'o.getOLEObject.invoke("#{attribute_length_pair.attribute}")').to_s.ljust( attribute_length_pair.length )
1692
+ # rescue=>e
1693
+ # s=s+ " ".ljust( attribute_length_pair.length )
1694
+ # end
1695
+ # end
1696
+ # index+=1
1697
+ # end
1698
+ # puts s
1699
+ # end
1700
+
1701
+ # this method creates an object of the correct type that the iterators use
1702
+ # private
1703
+ # def iterator_object(i)
1704
+ # element_class.new(element, :index, i+1)
1705
+ # end
1706
+ #end
1707
+
1708
+ #--
1709
+ # These classes are not for public consumption, so we switch off rdoc
1710
+
1711
+ # presumes element_class or element_tag is defined
1712
+ # for subclasses of ElementCollections
1713
+ # module CommonCollection
1714
+ # def element_tag
1715
+ # element_class.tag
1716
+ # end
1717
+ # def length
1718
+ # element.document.getElementsByTagName(element_tag).length
1719
+ # end
1720
+ # end
1721
+
1722
+ # This class is used as part of the .show method of the iterators class
1723
+ # it would not normally be used by a user
1724
+ #class AttributeLengthPairs
1725
+
1726
+ # This class is used as part of the .show method of the iterators class
1727
+ # it would not normally be used by a user
1728
+ # class AttributeLengthHolder
1729
+ # attr_accessor :attribute
1730
+ # attr_accessor :length
1731
+
1732
+ # def initialize( attrib, length)
1733
+ # @attribute = attrib
1734
+ # @length = length
1735
+ # end
1736
+ # end
1737
+
1738
+ # def initialize( attrib=nil , length=nil)
1739
+ # @attr=[]
1740
+ # add( attrib , length ) if attrib
1741
+ # @index_counter=0
1742
+ # end
1743
+
1744
+ # # BUG: Untested. (Null implementation passes all tests.)
1745
+ # def add( attrib , length)
1746
+ # @attr << AttributeLengthHolder.new( attrib , length )
1747
+ # end
1748
+
1749
+ # def delete(attrib)
1750
+ # item_to_delete=nil
1751
+ # @attr.each_with_index do |e,i|
1752
+ # item_to_delete = i if e.attribute==attrib
1753
+ # end
1754
+ # @attr.delete_at(item_to_delete ) unless item_to_delete == nil
1755
+ # end
1756
+
1757
+ # def next
1758
+ # temp = @attr[@index_counter]
1759
+ # @index_counter +=1
1760
+ # return temp
1761
+ # end
1762
+
1763
+ # def each
1764
+ # 0.upto( @attr.length-1 ) { |i | yield @attr[i] }
1765
+ # end
1766
+ #end
1767
+
1768
+ # resume rdoc
1769
+ #
1770
+
1771
+ # Class for accessing all the button elements in the document.
1772
+ # It would normally only be accessed by the FireWatir::Container#buttons method
1773
+ class Buttons < ElementCollections
1774
+ def locate_elements
1775
+ locate_tagged_elements("input", ["button", "image", "submit", "reset"])
1776
+ end
1777
+ end
1778
+
1779
+ # Class for accessing all the File Field elements in the document.
1780
+ # It would normally only be accessed by the FireWatir::Container#file_fields method
1781
+ class FileFields < ElementCollections
1782
+ def locate_elements
1783
+ locate_tagged_elements("input", ["file"])
1784
+ end
1785
+ end
1786
+
1787
+ # Class for accessing all the CheckBox elements in the document.
1788
+ # It would normally only be accessed by the FireWatir::Container#checkboxes method
1789
+ class CheckBoxes < ElementCollections
1790
+ def locate_elements
1791
+ locate_tagged_elements("input", ["checkbox"])
1792
+ end
1793
+ end
1794
+ module Container
1795
+ alias checkboxes check_boxes
1796
+ end
1797
+
1798
+ # Class for accessing all the Radio button elements in the document.
1799
+ # It would normally only be accessed by the FireWatir::Container#radios method
1800
+ class Radios < ElementCollections
1801
+ def locate_elements
1802
+ locate_tagged_elements("input", ["radio"])
1803
+ end
1804
+ end
1805
+
1806
+ # Class for accessing all the select list elements in the document.
1807
+ # It would normally only be accessed by the FireWatir::Container#select_lists method
1808
+ class SelectLists < ElementCollections
1809
+ def locate_elements
1810
+ locate_tagged_elements("select", ["select-one", "select-multiple"])
1811
+ end
1812
+ end
1813
+
1814
+ # Class for accessing all the link elements in the document.
1815
+ # It would normally only be accessed by the FireWatir::Container#links method
1816
+ class Links < ElementCollections; end
1817
+
1818
+ # Class for accessing all the image elements in the document.
1819
+ # It would normally only be accessed by the FireWatir::Container#images method
1820
+ class Images < ElementCollections; end
1821
+
1822
+ # Class for accessing all the text field elements in the document.
1823
+ # It would normally only be accessed by the FireWatir::Container#text_fields method
1824
+ class TextFields < ElementCollections
1825
+ def locate_elements
1826
+ locate_tagged_elements("input", ["text", "textarea", "password"])
1827
+ end
1828
+ end
1829
+
1830
+ # Class for accessing all the hidden elements in the document.
1831
+ # It would normally only be accessed by the FireWatir::Container#hiddens method
1832
+ class Hiddens < ElementCollections
1833
+ def locate_elements
1834
+ locate_tagged_elements("input", ["hidden"])
1835
+ end
1836
+ end
1837
+
1838
+ # Class for accessing all the table elements in the document.
1839
+ # It would normally only be accessed by the FireWatir::Container#tables method
1840
+ class Tables < ElementCollections; end
1841
+
1842
+ # Class for accessing all the label elements in the document.
1843
+ # It would normally only be accessed by the FireWatir::Container#labels method
1844
+ class Labels < ElementCollections; end
1845
+
1846
+ # Class for accessing all the pre element in the document.
1847
+ # It would normally only be accessed by the FireWatir::Container#pres method
1848
+ class Pres < ElementCollections; end
1849
+
1850
+ # Class for accessing all the paragraph elements in the document.
1851
+ # It would normally only be accessed by the FireWatir::Container#ps method
1852
+ class Ps < ElementCollections; end
1853
+
1854
+ # Class for accessing all the span elements in the document.
1855
+ # It would normally only be accessed by the FireWatir::Container#spans method
1856
+ class Spans < ElementCollections; end
1857
+
1858
+ # Class for accessing all the div elements in the document.
1859
+ # It would normally only be accessed by the FireWatir::Container#divs method
1860
+ class Divs < ElementCollections; end
1861
+
1862
+ class Ul < NonControlElement
1863
+ TAG = 'UL'
1864
+ end
1865
+ class Uls < ElementCollections; end
1866
+
1867
+ class Li < NonControlElement
1868
+ TAG = 'LI'
1869
+ end
1870
+ class Lis < ElementCollections; end
1871
+
1872
+ class H1 < NonControlElement
1873
+ TAG = 'H1'
1874
+ end
1875
+
1876
+ class H2 < NonControlElement
1877
+ TAG = 'H2'
1878
+ end
1879
+
1880
+ class H3 < NonControlElement
1881
+ TAG = 'H3'
1882
+ end
1883
+
1884
+ class H4 < NonControlElement
1885
+ TAG = 'H4'
1886
+ end
1887
+
1888
+ class H5 < NonControlElement
1889
+ TAG = 'H5'
1890
+ end
1891
+
1892
+ class H6 < NonControlElement
1893
+ TAG = 'H6'
1894
+ end
1895
+
1896
+ class Map < NonControlElement
1897
+ TAG = 'MAP'
1898
+ end
1899
+ class Maps < ElementCollections; end
1900
+
1901
+ class Area < NonControlElement
1902
+ TAG = 'AREA'
1903
+ end
1904
+ class Areas < ElementCollections; end
1905
+
1906
+ class Body < NonControlElement
1907
+ TAG = 'TBODY'
1908
+ end
1909
+ class Bodies < ElementCollections; end
1910
+
1911
+ end