firewatir 1.2.1 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
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