operawatir 0.3-jruby

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 (171) hide show
  1. data/.gitmodules +3 -0
  2. data/.yardopts +5 -0
  3. data/AUTHORS +7 -0
  4. data/Gemfile +9 -0
  5. data/LICENSE +30 -0
  6. data/README.md +158 -0
  7. data/Rakefile +59 -0
  8. data/VERSION +1 -0
  9. data/bin/desktopwatir +106 -0
  10. data/bin/operawatir +95 -0
  11. data/lib/operadriver/APACHE_2.0_LICENSE.txt +204 -0
  12. data/lib/operadriver/NEW_BSD_LICENSE.txt +36 -0
  13. data/lib/operadriver/commons-jxpath-1.3.jar +0 -0
  14. data/lib/operadriver/protobuf-java-2.3.0.jar +0 -0
  15. data/lib/operadriver/selenium-common.jar +0 -0
  16. data/lib/operadriver/webdriver-opera.jar +0 -0
  17. data/lib/operawatir.rb +46 -0
  18. data/lib/operawatir/browser.rb +181 -0
  19. data/lib/operawatir/collection.rb +133 -0
  20. data/lib/operawatir/compat.rb +25 -0
  21. data/lib/operawatir/compat/browser.rb +20 -0
  22. data/lib/operawatir/compat/collection.rb +99 -0
  23. data/lib/operawatir/compat/deprecation.rb +46 -0
  24. data/lib/operawatir/compat/element.rb +165 -0
  25. data/lib/operawatir/compat/element_finders.rb +159 -0
  26. data/lib/operawatir/compat/window.rb +27 -0
  27. data/lib/operawatir/element.rb +228 -0
  28. data/lib/operawatir/exceptions.rb +38 -0
  29. data/lib/operawatir/helper.rb +53 -0
  30. data/lib/operawatir/selector.rb +111 -0
  31. data/lib/operawatir/version.rb +15 -0
  32. data/lib/operawatir/window.rb +174 -0
  33. data/spec/fire_event/fire_event.rb +268 -0
  34. data/spec/fire_event/interactive/onBlur.html +45 -0
  35. data/spec/fire_event/interactive/onChange.html +47 -0
  36. data/spec/fire_event/interactive/onClick.html +45 -0
  37. data/spec/fire_event/interactive/onDblClick.html +45 -0
  38. data/spec/fire_event/interactive/onFocus.html +45 -0
  39. data/spec/fire_event/interactive/onMouseDown.html +45 -0
  40. data/spec/fire_event/interactive/onMouseMove.html +45 -0
  41. data/spec/fire_event/interactive/onMouseOut.html +45 -0
  42. data/spec/fire_event/interactive/onMouseOver.html +45 -0
  43. data/spec/fire_event/interactive/onMouseUp.html +45 -0
  44. data/spec/fire_event/interactive/onScroll.html +14 -0
  45. data/spec/legacy_watirspec/area_spec.rb +106 -0
  46. data/spec/legacy_watirspec/areas_spec.rb +38 -0
  47. data/spec/legacy_watirspec/browser_spec.rb +297 -0
  48. data/spec/legacy_watirspec/button_spec.rb +260 -0
  49. data/spec/legacy_watirspec/buttons_spec.rb +54 -0
  50. data/spec/legacy_watirspec/checkbox_spec.rb +280 -0
  51. data/spec/legacy_watirspec/checkboxes_spec.rb +38 -0
  52. data/spec/legacy_watirspec/collections_spec.rb +18 -0
  53. data/spec/legacy_watirspec/dd_spec.rb +140 -0
  54. data/spec/legacy_watirspec/dds_spec.rb +38 -0
  55. data/spec/legacy_watirspec/del_spec.rb +181 -0
  56. data/spec/legacy_watirspec/dels_spec.rb +62 -0
  57. data/spec/legacy_watirspec/div_spec.rb +244 -0
  58. data/spec/legacy_watirspec/divs_spec.rb +38 -0
  59. data/spec/legacy_watirspec/dl_spec.rb +140 -0
  60. data/spec/legacy_watirspec/dls_spec.rb +38 -0
  61. data/spec/legacy_watirspec/dt_spec.rb +140 -0
  62. data/spec/legacy_watirspec/dts_spec.rb +38 -0
  63. data/spec/legacy_watirspec/element_spec.rb +86 -0
  64. data/spec/legacy_watirspec/em_spec.rb +114 -0
  65. data/spec/legacy_watirspec/ems_spec.rb +38 -0
  66. data/spec/legacy_watirspec/filefield_spec.rb +127 -0
  67. data/spec/legacy_watirspec/filefields_spec.rb +38 -0
  68. data/spec/legacy_watirspec/fixtures/2000_spans.html +2009 -0
  69. data/spec/legacy_watirspec/fixtures/bug_duplicate_attributes.html +14 -0
  70. data/spec/legacy_watirspec/fixtures/bug_javascript_001.html +11 -0
  71. data/spec/legacy_watirspec/fixtures/buttons_with_duplicate_ids.html +18 -0
  72. data/spec/legacy_watirspec/fixtures/collections.html +15 -0
  73. data/spec/legacy_watirspec/fixtures/definition_lists.html +48 -0
  74. data/spec/legacy_watirspec/fixtures/euc-jp_text.html +17 -0
  75. data/spec/legacy_watirspec/fixtures/forms_with_input_elements.html +126 -0
  76. data/spec/legacy_watirspec/fixtures/frame_1.html +18 -0
  77. data/spec/legacy_watirspec/fixtures/frame_2.html +16 -0
  78. data/spec/legacy_watirspec/fixtures/frames.html +11 -0
  79. data/spec/legacy_watirspec/fixtures/iframes.html +12 -0
  80. data/spec/legacy_watirspec/fixtures/images.html +27 -0
  81. data/spec/legacy_watirspec/fixtures/images/1.gif +0 -0
  82. data/spec/legacy_watirspec/fixtures/images/2.gif +0 -0
  83. data/spec/legacy_watirspec/fixtures/images/3.gif +0 -0
  84. data/spec/legacy_watirspec/fixtures/images/button.jpg +0 -0
  85. data/spec/legacy_watirspec/fixtures/images/circle.jpg +0 -0
  86. data/spec/legacy_watirspec/fixtures/images/map.gif +0 -0
  87. data/spec/legacy_watirspec/fixtures/images/map2.gif +0 -0
  88. data/spec/legacy_watirspec/fixtures/images/minus.gif +0 -0
  89. data/spec/legacy_watirspec/fixtures/images/originaltriangle.jpg +0 -0
  90. data/spec/legacy_watirspec/fixtures/images/plus.gif +0 -0
  91. data/spec/legacy_watirspec/fixtures/images/square.jpg +0 -0
  92. data/spec/legacy_watirspec/fixtures/images/triangle.jpg +0 -0
  93. data/spec/legacy_watirspec/fixtures/iso-2022-jp_text.html +17 -0
  94. data/spec/legacy_watirspec/fixtures/javascript/helpers.js +16 -0
  95. data/spec/legacy_watirspec/fixtures/jquery.html +28 -0
  96. data/spec/legacy_watirspec/fixtures/latin1_text.html +17 -0
  97. data/spec/legacy_watirspec/fixtures/multiple_ids.html +14 -0
  98. data/spec/legacy_watirspec/fixtures/non_control_elements.html +135 -0
  99. data/spec/legacy_watirspec/fixtures/parser_bug_001.html +12 -0
  100. data/spec/legacy_watirspec/fixtures/prevent_form_submit.html +20 -0
  101. data/spec/legacy_watirspec/fixtures/right_click.html +11 -0
  102. data/spec/legacy_watirspec/fixtures/shift_jis_text.html +17 -0
  103. data/spec/legacy_watirspec/fixtures/tables.html +121 -0
  104. data/spec/legacy_watirspec/fixtures/timeout.html +16 -0
  105. data/spec/legacy_watirspec/fixtures/timeout_window_location.html +19 -0
  106. data/spec/legacy_watirspec/fixtures/tiny_mce.html +27 -0
  107. data/spec/legacy_watirspec/fixtures/utf8_text.html +15 -0
  108. data/spec/legacy_watirspec/fixtures/watirspec.css +0 -0
  109. data/spec/legacy_watirspec/form_spec.rb +73 -0
  110. data/spec/legacy_watirspec/forms_spec.rb +39 -0
  111. data/spec/legacy_watirspec/frame_spec.rb +161 -0
  112. data/spec/legacy_watirspec/frames_spec.rb +75 -0
  113. data/spec/legacy_watirspec/guards.rb +38 -0
  114. data/spec/legacy_watirspec/hidden_spec.rb +120 -0
  115. data/spec/legacy_watirspec/hiddens_spec.rb +38 -0
  116. data/spec/legacy_watirspec/hn_spec.rb +101 -0
  117. data/spec/legacy_watirspec/hns_spec.rb +39 -0
  118. data/spec/legacy_watirspec/image_spec.rb +237 -0
  119. data/spec/legacy_watirspec/images_spec.rb +38 -0
  120. data/spec/legacy_watirspec/ins_spec.rb +181 -0
  121. data/spec/legacy_watirspec/inses_spec.rb +62 -0
  122. data/spec/legacy_watirspec/label_spec.rb +85 -0
  123. data/spec/legacy_watirspec/labels_spec.rb +38 -0
  124. data/spec/legacy_watirspec/li_spec.rb +135 -0
  125. data/spec/legacy_watirspec/link_spec.rb +194 -0
  126. data/spec/legacy_watirspec/links_spec.rb +39 -0
  127. data/spec/legacy_watirspec/lis_spec.rb +38 -0
  128. data/spec/legacy_watirspec/map_spec.rb +100 -0
  129. data/spec/legacy_watirspec/maps_spec.rb +38 -0
  130. data/spec/legacy_watirspec/meta_spec.rb +26 -0
  131. data/spec/legacy_watirspec/metas_spec.rb +36 -0
  132. data/spec/legacy_watirspec/ol_spec.rb +86 -0
  133. data/spec/legacy_watirspec/ols_spec.rb +38 -0
  134. data/spec/legacy_watirspec/option_spec.rb +187 -0
  135. data/spec/legacy_watirspec/p_spec.rb +167 -0
  136. data/spec/legacy_watirspec/pre_spec.rb +133 -0
  137. data/spec/legacy_watirspec/pres_spec.rb +38 -0
  138. data/spec/legacy_watirspec/ps_spec.rb +38 -0
  139. data/spec/legacy_watirspec/radio_spec.rb +286 -0
  140. data/spec/legacy_watirspec/radios_spec.rb +35 -0
  141. data/spec/legacy_watirspec/select_list_spec.rb +326 -0
  142. data/spec/legacy_watirspec/select_lists_spec.rb +39 -0
  143. data/spec/legacy_watirspec/server.rb +91 -0
  144. data/spec/legacy_watirspec/span_spec.rb +181 -0
  145. data/spec/legacy_watirspec/spans_spec.rb +64 -0
  146. data/spec/legacy_watirspec/spec_helper.rb +12 -0
  147. data/spec/legacy_watirspec/strong_spec.rb +97 -0
  148. data/spec/legacy_watirspec/strongs_spec.rb +39 -0
  149. data/spec/legacy_watirspec/table_bodies_spec.rb +61 -0
  150. data/spec/legacy_watirspec/table_body_spec.rb +119 -0
  151. data/spec/legacy_watirspec/table_cell_spec.rb +76 -0
  152. data/spec/legacy_watirspec/table_cells_spec.rb +71 -0
  153. data/spec/legacy_watirspec/table_footer_spec.rb +94 -0
  154. data/spec/legacy_watirspec/table_footers_spec.rb +61 -0
  155. data/spec/legacy_watirspec/table_header_spec.rb +98 -0
  156. data/spec/legacy_watirspec/table_headers_spec.rb +59 -0
  157. data/spec/legacy_watirspec/table_row_spec.rb +104 -0
  158. data/spec/legacy_watirspec/table_rows_spec.rb +64 -0
  159. data/spec/legacy_watirspec/table_spec.rb +170 -0
  160. data/spec/legacy_watirspec/tables_spec.rb +40 -0
  161. data/spec/legacy_watirspec/text_field_spec.rb +315 -0
  162. data/spec/legacy_watirspec/text_fields_spec.rb +38 -0
  163. data/spec/legacy_watirspec/ul_spec.rb +84 -0
  164. data/spec/legacy_watirspec/uls_spec.rb +40 -0
  165. data/spec/legacy_watirspec/watir_compatibility_spec.rb +176 -0
  166. data/spec/legacy_watirspec/watirspec_helper.rb +57 -0
  167. data/utils/Rakefile +79 -0
  168. data/utils/launchers/launcher-linux-i686 +0 -0
  169. data/utils/launchers/launcher-linux-x86_64 +0 -0
  170. data/utils/launchers/launcher-win32-i86pc.exe +0 -0
  171. metadata +404 -0
@@ -0,0 +1,133 @@
1
+ require 'forwardable'
2
+ require 'set'
3
+
4
+ class OperaWatir::Collection
5
+ extend Forwardable
6
+ include Enumerable
7
+
8
+ attr_accessor :parent, :selector
9
+
10
+ def initialize(parent, elms=nil)
11
+ self.parent, self.selector = parent, OperaWatir::Selector.new(self)
12
+ @_elms = elms
13
+ end
14
+
15
+ def add_selector_from_arguments(args)
16
+ if not args.empty?
17
+ args.each do |arg|
18
+ selector.attribute arg
19
+ end
20
+ end
21
+ end
22
+
23
+ def exist?
24
+ !raw_elements.empty?
25
+ rescue OperaWatir::Exceptions::UnknownObjectException
26
+ false
27
+ end
28
+ alias_method :exists?, :exist? # LOL Ruby
29
+
30
+ def single?
31
+ raw_elements.length == 1
32
+ end
33
+
34
+ def_delegators :raw_elements, :each,
35
+ :length,
36
+ :size,
37
+ :first,
38
+ :last,
39
+ :empty?
40
+
41
+
42
+ def [](n)
43
+ self.class.new(self).tap {|c| c.selector.index(n) }
44
+ end
45
+
46
+ # Set union, used for joining complex finders (specifically for Watir1)
47
+ def +(other)
48
+ self.class.new(parent, raw_elements + other.raw_elements)
49
+ end
50
+
51
+ # Public interface to elms, used in Selector
52
+ def raw_elements
53
+ _elms.tap do |e|
54
+ raise(OperaWatir::Exceptions::UnknownObjectException) if e.empty?
55
+ end
56
+ end
57
+
58
+
59
+ # Attributes
60
+
61
+ def id
62
+ map_or_return {|elm| elm.id}
63
+ end
64
+
65
+ def attr(name)
66
+ raw_elements[0].attr(name)
67
+ end
68
+
69
+ def attrs(name)
70
+ raw_elements.map do |el|
71
+ el.attr(name)
72
+ end
73
+ end
74
+
75
+
76
+ # Finding
77
+
78
+ OperaWatir::Selector::BASE_TYPES.each do |type|
79
+ define_method("find_by_#{type}") do |name|
80
+ OperaWatir::Collection.new(self).tap do |c|
81
+ c.selector.send(type, name)
82
+ end
83
+ end
84
+ end
85
+
86
+ alias_method :find_by_class, :find_by_class_name
87
+ alias_method :find_by_tag, :find_by_tag_name
88
+
89
+ # TODO
90
+ # - Find tag if method exists in a list of HTML5 elements
91
+ # - If ends in ? then check that all returned values are true
92
+ # - Else, return attributes from elements
93
+ def method_missing(method, *args, &blk)
94
+ map_or_return {|elm| elm.send(method, *args, &blk) }
95
+ end
96
+
97
+
98
+ private
99
+
100
+ def _elms
101
+ @_elms ||= selector.eval
102
+ end
103
+
104
+ attr_writer :_elms
105
+
106
+ # TODO Massive hack: map is overritten in Watir1
107
+ alias_method :_map, :map
108
+
109
+ def map_or_return(&blk)
110
+ single? ? blk.call(raw_elements.first) : _map(&blk)
111
+ end
112
+
113
+ OperaWatir::Selector::BASE_TYPES.each do |type|
114
+ define_method("find_elements_by_#{type}") do |value|
115
+ _elms.inject([]) do |result, element|
116
+ result | element.send("find_elements_by_#{type}", value.to_s)
117
+ end
118
+ end
119
+ end
120
+
121
+ def find_elements_by_attribute(attributes)
122
+ _elms.select do |elm|
123
+ attributes.all? {|attribute, value|
124
+ elm.send(attribute).send((value.is_a?(Regexp) ? :match : :==), value)
125
+ }
126
+ end
127
+ end
128
+
129
+ def find_elements_by_index(n)
130
+ (n >= 0 && n < _elms.length) ? [_elms[n]] : []
131
+ end
132
+
133
+ end
@@ -0,0 +1,25 @@
1
+ module OperaWatir
2
+
3
+ module Compat; end
4
+
5
+ # Switches on compatibility layer (Watir 1 API).
6
+ def self.compatibility!
7
+ # require 'operawatir/compat/deprecation'
8
+ require 'operawatir/compat/browser'
9
+ require 'operawatir/compat/element_finders'
10
+ require 'operawatir/compat/window'
11
+
12
+ Browser.send :include, Compat::Browser
13
+ Window.send :include, Compat::ElementFinders
14
+ Window.send :include, Compat::Window
15
+ Collection.send :include, Compat::ElementFinders
16
+
17
+ # TODO Ruby Modules can't override methods defined in their included klass
18
+ # Requiring the files is OK, but there needs to be some way of detecting
19
+ # that we are in compatibility mode.
20
+
21
+ require 'operawatir/compat/collection'
22
+ require 'operawatir/compat/element'
23
+ end
24
+
25
+ end
@@ -0,0 +1,20 @@
1
+ module OperaWatir
2
+ module Compat
3
+ module Browser
4
+
5
+ def method_missing(method, *args, &blk)
6
+ if active_window.respond_to? method
7
+ active_window.send(method, *args, &blk)
8
+ else
9
+ super
10
+ end
11
+ end
12
+
13
+ # Quits the browser
14
+ def quit
15
+ browser.quit!
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,99 @@
1
+ class OperaWatir::Collection
2
+
3
+ # Aliases that Watir1 defines for certain attributes
4
+ ATTRIBUTE_ALIASES = {
5
+ :url => :href,
6
+ :class => :class_name,
7
+ :tag => :tag_name
8
+ }
9
+
10
+ # Welcome to Hacksville, population: too many
11
+
12
+ # Creates a new selector based on the arguments given to the Watir 1
13
+ # browser methods, e.g. +browser.div(:id, 'content')+.
14
+ #
15
+ # @param [Array] args The array of arguments passed to the Watir
16
+ # method.
17
+ # @param [Method] default_method The attribute to use when only a
18
+ # value is provided, e.g. browser.div('content').
19
+ # @return [OperaWatir::Selector] the generated selector
20
+ def add_selector_from_arguments(args, default_method)
21
+ # () => :index, 0
22
+ if args.empty?
23
+ type, value = :index, 0
24
+
25
+ # (:index, 1) => :index, 0
26
+ elsif args.first == :index
27
+ type, value = :index, args[1].to_i - 1
28
+
29
+ # Handle a hash of selectors
30
+ elsif args.length == 1 and args.first.is_a? Hash
31
+ args.first.each_pair do |k, v|
32
+ s = add_selector_from_arguments([k, v], default_method)
33
+ end
34
+ return s
35
+
36
+ # (:id, 3.14) => TypeError
37
+ elsif args.any? {|arg| ![String, Regexp, Fixnum, Symbol].any?{|k| arg.is_a?(k)}}
38
+ raise TypeError
39
+
40
+ # NOTE: This is purely to make WatirSpec pass
41
+ # (:no_such_how, 'some_value') => Exception
42
+ elsif args.first == :no_such_how
43
+ raise OperaWatir::Exceptions::MissingWayOfFindingObjectException
44
+
45
+ # ('foo') => :attribute, {:id => 'foo'}
46
+ elsif !args.first.is_a?(Symbol) && args[1].nil?
47
+ type, value = :attribute, {
48
+ default_method => args.first
49
+ }
50
+
51
+ # (:xpath, '//area') => :xpath, '//area'
52
+ elsif ![:id, :class, :tag].include?(args.first) && OperaWatir::Selector::BASE_TYPES.include?(args.first)
53
+ type, value = args.first, args[1]
54
+
55
+ # (:url, 'foo.html') => :attribute, {:href => 'foo.html'}
56
+ else
57
+ type, value = :attribute, {
58
+ (ATTRIBUTE_ALIASES[args.first.to_sym] || args.first) => args[1]
59
+ }
60
+ end
61
+
62
+ selector.send(type, value)
63
+ end
64
+
65
+ # Watir1 Collections are 1 indexed *headslap*
66
+
67
+ # Gets the element at index, starting from 1 (i.e. [0] in a normal
68
+ # array is [1] here.
69
+ #
70
+ # @param [Fixnum] index The index of the element to retreive
71
+ # @return [OperaWatir::Collection] A new collection with the
72
+ # selector pointing to the given index.
73
+ def [](index)
74
+ self.class.new(self).tap {|c| c.selector.index(index-1) }
75
+ end
76
+
77
+ # Define methods to satisfy #respond_to? which is used in the tests.
78
+ [:name, :title, :type, :class_name, :text, :style, :value].each do |name|
79
+ define_method(name) {method_missing(name)}
80
+ end
81
+
82
+ # Fetches the string representation of this collection.
83
+ #
84
+ # @return [String] the string representation of this collection
85
+ # @raise [OperaWatir::Exceptions::UnknownObjectException]
86
+ def to_s
87
+ # This should return all of the attributes defined on each
88
+ # element. We don't have support for that, so lets just
89
+ # output the useful ones.
90
+ raw_elements.map do |el|
91
+ "tag: #{el.tag_name.downcase}\n"+
92
+ " id: #{el.id}\n" +
93
+ " class: #{el.class_name}\n" +
94
+ " title: #{el.title}\n" +
95
+ " text: #{el.text}"
96
+ end.join("\n")
97
+ end
98
+
99
+ end
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+
3
+ class OperaWatir::Exceptions::DeprecationException < OperaWatir::Exceptions::OperaWatirException
4
+
5
+ def initialize(desc, fix, trace)
6
+ @desc, @fix = desc, fix
7
+ set_backtrace clean_backtrace(trace)
8
+ end
9
+
10
+ def message
11
+ "DEPRECATION: #{@desc}\n #{@fix}"
12
+ end
13
+
14
+ private
15
+
16
+ LIB_PATHS = [File.expand_path('../../../', __FILE__)] + Gem.all_load_paths
17
+
18
+ def clean_backtrace(trace)
19
+ trace.reject do |line|
20
+ LIB_PATHS.any? do |lib_path|
21
+ line.include?(lib_path)
22
+ end || line.split(':').first == ''
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ module OperaWatir
29
+ module Compat
30
+ module Deprecation
31
+
32
+ def deprecation(desc, fix)
33
+ warn OperaWatir::Exceptions::DeprecationException.new(desc, fix, caller).message
34
+ end
35
+
36
+ def deprecation!(desc, fix)
37
+ raise OperaWatir::Exceptions::DeprecationException.new(desc, fix, caller)
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+
44
+ class Object
45
+ include OperaWatir::Compat::Deprecation
46
+ end
@@ -0,0 +1,165 @@
1
+ class OperaWatir::Element
2
+
3
+ # Gets the attribute called name.
4
+ #
5
+ # @param [String, Symbol] name The name of the attribute to get
6
+ # @return [String] The value of the attribute
7
+ def attr(name)
8
+ node.getAttribute(name.to_s) || ''
9
+ end
10
+
11
+ # Check the existence of the attribute on the element.
12
+ #
13
+ # @return [Boolean] true if the attribute exists on the element,
14
+ # false otherwise
15
+ def attr?(name)
16
+ !node.getAttribute(name.to_s).nil?
17
+ end
18
+
19
+ def method_missing(name, *args, &blk)
20
+ if !block_given? && args.empty?
21
+ attr(name)
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ # Gets the text content of the element.
28
+ #
29
+ # @return [String] the text content
30
+ def text
31
+ node.getText.strip
32
+ end
33
+
34
+ alias_method :to_s, :text
35
+
36
+ # On elements of type `<input>` this gets the value of the value
37
+ # attribute, on every other element type it returns the text
38
+ # content.
39
+ #
40
+ # @return [String] value of the element
41
+ def value
42
+ if tag_name == 'INPUT' or attr?(:value)
43
+ attr(:value)
44
+ else
45
+ text
46
+ end
47
+ end
48
+
49
+ # Checks whether the text content of the element contains the given
50
+ # string In the compatibility layer as the preferred way of doing
51
+ # this is.
52
+ #
53
+ # elm.text.should include('My string')
54
+ #
55
+ # @param [String] String to search for
56
+ # @param [Boolean] true if the element's text contains str, false
57
+ # otherwise
58
+ def verify_contains(str)
59
+ text.include?(str)
60
+ end
61
+
62
+ alias_method :verify_contains?, :verify_contains
63
+
64
+ alias_method :caption, :text
65
+
66
+ # Clicks on the top left of the element, or the given x, y offset.
67
+ #
68
+ # @param [optional, Fixnum] x The offset from the left of the
69
+ # element
70
+ # @param [optional, Fixnum] y The offset from the top of the element
71
+ def click(x=0, y=0)
72
+ assert_enabled!
73
+ node.click(x.to_i, y.to_i)
74
+ end
75
+
76
+ # Focuses the element
77
+ def focus
78
+ trigger! :focus
79
+ end
80
+
81
+ alias_method :fire_event, :trigger!
82
+
83
+ # Submits a form, or the form the elment is contained in.
84
+ def submit
85
+ assert_exists
86
+ node.submit
87
+ end
88
+
89
+ # Clears a text input or textarea of any text.
90
+ def clear
91
+ assert_enabled!
92
+ node.clear
93
+ end
94
+
95
+ # If passed a value it will type text into the element, otherwise it
96
+ # will check a radio button or checkbox.
97
+ #
98
+ # @param [optional, String] value Text to type
99
+ def set(value=nil)
100
+ if value
101
+ self.text = value
102
+ else
103
+ check!
104
+ end
105
+ end
106
+
107
+ # Gets the href of an `<a>` element, or the url attribute of any
108
+ # other element.
109
+ #
110
+ # @return [String] an href or the url attribute
111
+ def url
112
+ attr(tag_name == 'A' ? :href : :url)
113
+ end
114
+
115
+ # Gets the selected `<option>` elements in a `<select>` element.
116
+ #
117
+ # @return [OperaWatir::Collection] a collection of the selected
118
+ # `<option>`s
119
+ def selected_options
120
+ options(:selected?, true)
121
+ end
122
+
123
+ # On checkboxes, radio buttons, and option elements returns whether
124
+ # the element is checked/selected. On a select element, when passed
125
+ # an value it checks whether the selected option contains the given
126
+ # text.
127
+ #
128
+ # @param [optional, String] value Text the selected option should
129
+ # contain
130
+ # @return [Boolean] true if the element is selected/selected option
131
+ # contains value, false otherwise
132
+ def selected?(value=nil)
133
+ if option.nil?
134
+ selected_options.text.include?(value)
135
+ else
136
+ node.isSelected
137
+ end
138
+ end
139
+
140
+ # For `<select>` elements returns either 'select-one' for
141
+ # `<select>`s where only a single `<option>` can be selected, or
142
+ # 'select-multiple' otherwise. For non-`<select>` elements returns
143
+ # the `type` attribute.
144
+ def type
145
+ if tag_name == 'SELECT'
146
+ attr(:multiple) == 'multiple' ? 'select-multiple' : 'select-one'
147
+ else
148
+ attr(:type)
149
+ end
150
+ end
151
+
152
+ # Gets the colspan attribute as an integer.
153
+ #
154
+ # @return [Fixnum] the colspan
155
+ def colspan
156
+ attr(:colspan).to_i
157
+ end
158
+
159
+ private
160
+
161
+ def assert_enabled!
162
+ raise OperaWatir::Exceptions::ObjectDisabledException if disabled?
163
+ end
164
+
165
+ end