watir 1.5.3 → 1.5.4

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.
data/changes.rb CHANGED
@@ -1,5 +1,16 @@
1
1
  =begin rdoc
2
- Major Changes in 1.5
2
+ == Version 1.5.3
3
+ Bug fixes and minor cleanup.
4
+
5
+ * Fix text areas bugs.
6
+ * Fix warning messages caused by redefined constants.
7
+ * Break out watir.rb into multiple files.
8
+ * Fix [WTR-90] error when running tests when installing gem.
9
+ http://jira.openqa.org/browse/WTR-90
10
+ * Fix tests.
11
+ * Update documentation.
12
+
13
+ Major Changes in 1.5.1
3
14
  Support for IE's Modal Dialogs.
4
15
  showModalDialog()
5
16
  Any method can be used to specify an element (:text, :class, etc.).
@@ -9,7 +20,7 @@ Major Changes in 1.5
9
20
  One can now use multiple attributes to specify an element.
10
21
  ie.span(:class =>'Label', :text => 'Add new').click
11
22
 
12
- Other Changes in 1.5
23
+ Other Changes in 1.5.1
13
24
  * Migrated IE.new_process from watir/contrib and improved its reliability. We now recommend IE.new_process over IE.new as a way to avoid numerous errors detailed in http://jira.openqa.org/browse/WTR-150.
14
25
  * Added IE.start_process. This works like IE.start, but uses the new_process mechanism to start IE.
15
26
  * Added IE.new_window and IE.start_window. This are synonyms for IE.new and IE.start.
data/readme.rb CHANGED
@@ -139,6 +139,8 @@ Contributors:
139
139
  Xavier Noria
140
140
  Jeff Fry
141
141
  Zeljko Filipin
142
+ Paul Taylor - Bug fix 194
143
+ Vincent Xu - Chinese input support
142
144
 
143
145
  Acknowledgements:
144
146
  Chris Morris
@@ -1,5 +1,5 @@
1
1
  # feature tests for Forms
2
- # revision: $Revision: 1079 $
2
+ # revision: $Revision: 1294 $
3
3
 
4
4
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__
5
5
  require 'unittests/setup'
@@ -5,7 +5,7 @@ Test page for Forms
5
5
  </title>
6
6
  </head>
7
7
  <body>
8
- CVS Revision: "$Revision: 1009 $"
8
+ CVS Revision: "$Revision: 1294 $"
9
9
  <br>
10
10
  <br>
11
11
  <table>
@@ -41,7 +41,7 @@ $non_core_tests =
41
41
  $core_tests = $all_tests - $non_core_tests - $window_tests - $xpath_tests
42
42
 
43
43
  $ie = Watir::IE.new
44
- $ie.set_fast_speed
44
+ $ie.speed = :fast
45
45
 
46
46
  $myDir = File.expand_path(File.dirname(__FILE__))
47
47
  $myDir.sub!( %r{/cygdrive/(\w)/}, '\1:/' ) # convert from cygwin to dos
@@ -1,22 +1,56 @@
1
1
  # tests for ability to set defaults for Watir
2
- # revision: $Revision: 958 $
2
+ # revision: $Revision: 1293 $
3
3
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__
4
4
  require 'test/unit'
5
5
  require 'watir'
6
6
 
7
- class TC_Defaults < Test::Unit::TestCase
7
+ class TC_instance_options < Test::Unit::TestCase
8
8
  include Watir
9
9
 
10
10
  def test_using_default
11
- @ie1 = IE.new
11
+ @ie1 = Watir::IE.new
12
12
  @ie1.speed = :fast
13
13
  assert_equal(:fast, @ie1.speed)
14
14
  @ie1.speed = :slow
15
15
  assert_equal(:slow, @ie1.speed)
16
16
  assert_raise(ArgumentError){@ie1.speed = :fubar}
17
- end
18
-
17
+ end
18
+
19
19
  def teardown
20
20
  @ie1.close if @ie1
21
21
  end
22
+ end
23
+
24
+ class TC_class_options < Test::Unit::TestCase
25
+ include Watir
26
+ @@hide_ie = $HIDE_IE
27
+ def setup
28
+ @previous = Watir::IE.defaults
29
+ end
30
+ def test_class_defaults
31
+ assert_equal({:speed => :slow, :visible => ! @@hide_ie}, IE.defaults)
32
+ end
33
+ def test_change_defaults
34
+ IE.defaults = {:speed => :fast}
35
+ assert_equal(:fast, IE.speed)
36
+ IE.defaults = {:visible => false}
37
+ assert_equal(false, IE.visible)
38
+ IE.defaults = {:speed => :slow}
39
+ assert_equal(:slow, IE.speed)
40
+ IE.defaults = {:visible => true}
41
+ assert_equal(true, IE.visible)
42
+ end
43
+ def test_defaults_affect_on_instance
44
+ IE.defaults = {:speed => :fast}
45
+ @ie1 = IE.new
46
+ assert_equal(:fast, @ie1.speed)
47
+ IE.defaults = {:speed => :slow}
48
+ @ie2 = IE.new
49
+ assert_equal(:slow, @ie2.speed)
50
+ end
51
+ def teardown
52
+ IE.defaults = @previous
53
+ @ie1.close if @ie1
54
+ @ie2.close if @ie2
55
+ end
22
56
  end
@@ -0,0 +1,30 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__
2
+ require 'unittests/setup'
3
+
4
+ class TC_Fields_For_Chinese_Char < Test::Unit::TestCase
5
+
6
+ def setup()
7
+ $ie.goto($htmlRoot + "textfields1.html")
8
+ end
9
+
10
+ def test_chinese_char_should_be_appended_to_text_field
11
+ $ie.text_field(:name, "text1").append(" ijij")
12
+ assert_equal( "Hello World ijij" , $ie.text_field(:name, "text1").getContents )
13
+ end
14
+
15
+ def test_mixed_char_should_be_appended_to_text_field
16
+ $ie.text_field(:name, "text1").append(" ijaija")
17
+ assert_equal( "Hello World ijaija" , $ie.text_field(:name, "text1").getContents )
18
+ end
19
+
20
+ def test_chinese_char_should_be_set_to_text_field
21
+ $ie.text_field(:name, "text1").set("ijij")
22
+ assert_equal( "ijij" , $ie.text_field(:name, "text1").getContents )
23
+ end
24
+
25
+ def test_mixed_char_should_be_set_to_text_field
26
+ $ie.text_field(:name, "text1").set("ijaija")
27
+ assert_equal( "ijaija" , $ie.text_field(:name, "text1").getContents )
28
+ end
29
+
30
+ end
@@ -1,5 +1,5 @@
1
1
  # feature tests for Text Fields & Labels
2
- # revision: $Revision: 1196 $
2
+ # revision: $Revision: 1295 $
3
3
 
4
4
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__
5
5
  require 'unittests/setup'
@@ -151,12 +151,12 @@ class TC_Fields < Test::Unit::TestCase
151
151
  end
152
152
 
153
153
  def test_JS_Events
154
- $ie.text_field(:name, 'events_tester').set('p')
154
+ $ie.text_field(:name, 'events_tester').requires_typing.set('p')
155
155
 
156
156
  # the following line has an extra keypress at the begining, as we mimic the delete key being pressed
157
157
  assert_equal( "keypresskeydownkeypresskeyup" , $ie.text_field(:name , 'events_text').value.gsub("\r\n" , "") )
158
158
  $ie.button(:value , "Clear Events Box").click
159
- $ie.text_field(:name , 'events_tester').set('ab')
159
+ $ie.text_field(:name , 'events_tester').requires_typing.set('ab')
160
160
 
161
161
  # the following line has an extra keypress at the begining, as we mimic the delete key being pressed
162
162
  assert_equal( "keypresskeydownkeypresskeyupkeydownkeypresskeyup" , $ie.text_field(:name , 'events_text').value.gsub("\r\n" , "") )
@@ -10,7 +10,7 @@ module Watir
10
10
  # Whether true or false, the assertion count is incremented.
11
11
  def verify boolean, message = 'verify failed.'
12
12
  add_assertion
13
- add_failure message, caller unless boolean
13
+ add_failure message.to_s, caller unless boolean
14
14
  end
15
15
 
16
16
  def verify_equal expected, actual, message=nil
@@ -14,7 +14,7 @@ module Watir
14
14
  def self.close_all_but(except=nil)
15
15
  Watir::IE.each do |ie|
16
16
  ie.close_modal
17
- ie.close unless except and except.hwnd == window.hwnd
17
+ ie.close unless except and except.hwnd == ie.hwnd
18
18
  end
19
19
  sleep 1.0 # replace with polling for window count to be zero?
20
20
  end
@@ -25,6 +25,7 @@ module Watir
25
25
 
26
26
  # This is used to change the typing speed when entering text on a page.
27
27
  attr_accessor :typingspeed
28
+ attr_accessor :type_keys
28
29
  # The color we want to use for the active object. This can be any valid web-friendly color.
29
30
  attr_accessor :activeObjectHighLightColor
30
31
  # The PageContainer object containing this element
@@ -32,6 +33,7 @@ module Watir
32
33
 
33
34
  def copy_test_config(container) # only used by form and frame
34
35
  @typingspeed = container.typingspeed
36
+ @type_keys = container.type_keys
35
37
  @activeObjectHighLightColor = container.activeObjectHighLightColor
36
38
  end
37
39
  private :copy_test_config
@@ -813,63 +815,12 @@ module Watir
813
815
  # * types - what object types we will look at.
814
816
  # * value - used for objects that have one name, but many values. ex. radio lists and checkboxes
815
817
  def locate_input_element(how, what, types, value=nil)
816
- elements = nil
817
- # Searching through all elements returned by ole_inner_elements
818
- # is *significantly* slower than IE's getElementById() and
819
- # getElementsByName() calls when how is :id or :name. However
820
- # IE doesn't match Regexps, so first we make sure what is a String.
821
- # In addition, IE's getElementById() will also return an element
822
- # where the :name matches, so we will only return the results of
823
- # getElementById() if the matching element actually HAS a matching
824
- # :id.
825
- begin
826
- if what.class == String # Only use fast calls with String what.
827
- if how == :id
828
- element = document.getElementById(what)
829
- # Return if our fast match really HAS a matching :id
830
- return element if element.nil? or element.invoke('id') == what
831
- elsif how == :name
832
- elements = document.getElementsByName(what)
833
- end
834
- end
835
- rescue
836
- end
837
- # Use slow methods if the faster methods didn't match
838
- elements = ole_inner_elements if elements.nil?
839
-
840
- how = :value if how == :caption
841
- how = :class_name if how == :class
842
- what = what.to_i if how == :index
843
- value = value.to_s if value
844
- log "getting object - how is #{how} what is #{what} types = #{types} value = #{value}"
845
-
846
- object_index = 1
847
- elements.each do |object|
848
- element = Element.new(object)
849
- if types.include?(element.type)
850
- if how == :index
851
- attribute = object_index
852
- else
853
- begin
854
- attribute = element.send(how)
855
- rescue NoMethodError
856
- raise MissingWayOfFindingObjectException,
857
- "#{how} is an unknown way of finding an <INPUT> element (#{what})"
858
- end
859
- end
860
- if what.matches(attribute)
861
- if value
862
- if element.value == value
863
- return object
864
- end
865
- else
866
- return object
867
- end
868
- end
869
- object_index += 1
870
- end
871
- end
872
- return nil
818
+ locator = InputElementLocator.new self, types
819
+ locator.document = document rescue true
820
+ return locator.element if locator.fast_locate
821
+ locator.elements = ole_inner_elements if locator.elements.nil?
822
+ locator.specifier = [how, what, value]
823
+ locator.locate
873
824
  end
874
825
 
875
826
  # returns the ole object for the specified element
@@ -147,7 +147,10 @@ module Watir
147
147
  def typingspeed
148
148
  @container.typingspeed
149
149
  end
150
-
150
+ def type_keys
151
+ return @container.type_keys if @type_keys.nil?
152
+ @type_keys
153
+ end
151
154
  def activeObjectHighLightColor
152
155
  @container.activeObjectHighLightColor
153
156
  end
@@ -18,27 +18,51 @@ module Watir
18
18
  def self.attach_timeout=(timeout)
19
19
  @@attach_timeout = timeout
20
20
  end
21
-
21
+
22
+ def self.defaults
23
+ {:speed => self.speed, :visible => self.visible}
24
+ end
25
+ def self.defaults= options
26
+ options.each do |name, value|
27
+ send "#{name}=", value
28
+ end
29
+ end
30
+ # The globals $FAST_SPEED and $HIDE_IE are checked both at initialization
31
+ # and later, because they
32
+ # might be set after initialization. Setting them beforehand (e.g. from
33
+ # the command line) will affect the class, otherwise it is only a temporary
34
+ # effect
35
+ @@speed = $FAST_SPEED ? :fast : :slow
36
+ def self.speed
37
+ return :fast if $FAST_SPEED
38
+ @@speed
39
+ end
40
+ def self.speed= x
41
+ $FAST_SPEED = nil
42
+ @@speed = x
43
+ end
44
+ @@visible = $HIDE_IE ? false : true
45
+ def self.visible
46
+ return false if $HIDE_IE
47
+ @@visible
48
+ end
49
+ def self.visible= x
50
+ $HIDE_IE = nil
51
+ @@visible = x
52
+ end
53
+
22
54
  # The revision number (according to Subversion)
23
55
  REVISION_STRING = '$Revision: 1263 $'
24
56
  REVISION_STRING.scan(/Revision: (\d*)/)
25
57
  REVISION = $1 or 'unknown'
26
58
 
27
59
  # The Release number
28
- VERSION_SHORT = '1.5.3'
60
+ VERSION_SHORT = '1.5.4'
29
61
  VERSION = VERSION_SHORT + '.' + REVISION
30
62
 
31
63
  # Used internally to determine when IE has finished loading a page
32
64
  READYSTATE_COMPLETE = 4
33
-
34
- # TODO: the following constants should be able to be specified by object (not class)
35
-
36
- # The delay when entering text on a web page when speed = :slow.
37
- DEFAULT_TYPING_SPEED = 0.08
38
-
39
- # The default time we wait after a page has loaded when speed = :slow.
40
- DEFAULT_SLEEP_TIME = 0.1
41
-
65
+
42
66
  # The default color for highlighting objects as they are accessed.
43
67
  HIGHLIGHT_COLOR = 'yellow'
44
68
 
@@ -77,7 +101,7 @@ module Watir
77
101
 
78
102
  def _new_window_init
79
103
  create_browser_window
80
- set_defaults
104
+ initialize_options
81
105
  goto 'about:blank' # this avoids numerous problems caused by lack of a document
82
106
  end
83
107
 
@@ -108,7 +132,7 @@ module Watir
108
132
  iep = Process.start
109
133
  @ie = iep.window
110
134
  @process_id = iep.process_id
111
- set_defaults
135
+ initialize_options
112
136
  goto 'about:blank'
113
137
  end
114
138
 
@@ -138,7 +162,7 @@ module Watir
138
162
  # this method is used internally to attach to an existing window
139
163
  def _attach_init how, what
140
164
  attach_browser_window how, what
141
- set_defaults
165
+ initialize_options
142
166
  wait
143
167
  end
144
168
 
@@ -147,7 +171,7 @@ module Watir
147
171
  def self.bind window
148
172
  ie = new true
149
173
  ie.ie = window
150
- ie.set_defaults
174
+ ie.initialize_options
151
175
  ie
152
176
  end
153
177
 
@@ -156,18 +180,15 @@ module Watir
156
180
  end
157
181
  private :create_browser_window
158
182
 
159
- def set_defaults
160
- self.visible = ! $HIDE_IE
183
+ def initialize_options
184
+ self.visible = IE.visible
185
+ self.speed = IE.speed
186
+
161
187
  @ole_object = nil
162
188
  @page_container = self
163
189
  @error_checkers = []
164
190
  @activeObjectHighLightColor = HIGHLIGHT_COLOR
165
191
 
166
- if $FAST_SPEED
167
- set_fast_speed
168
- else
169
- set_slow_speed
170
- end
171
192
 
172
193
  @logger = DefaultLogger.new
173
194
  @url_list = []
@@ -175,8 +196,21 @@ module Watir
175
196
 
176
197
  def speed= how_fast
177
198
  case how_fast
178
- when :fast : set_fast_speed
179
- when :slow : set_slow_speed
199
+ when :zippy :
200
+ @typingspeed = 0
201
+ @pause_after_wait = 0.01
202
+ @type_keys = false
203
+ @speed = :fast
204
+ when :fast :
205
+ @typingspeed = 0
206
+ @pause_after_wait = 0.01
207
+ @type_keys = true
208
+ @speed = :fast
209
+ when :slow :
210
+ @typingspeed = 0.08
211
+ @pause_after_wait = 0.1
212
+ @type_keys = true
213
+ @speed = :slow
180
214
  else
181
215
  raise ArgumentError, "Invalid speed: #{how_fast}"
182
216
  end
@@ -184,16 +218,12 @@ module Watir
184
218
 
185
219
  # deprecated: use speed = :fast instead
186
220
  def set_fast_speed
187
- @typingspeed = 0
188
- @defaultSleepTime = 0.01
189
- @speed = :fast
221
+ self.speed = :fast
190
222
  end
191
223
 
192
224
  # deprecated: use speed = :slow instead
193
225
  def set_slow_speed
194
- @typingspeed = DEFAULT_TYPING_SPEED
195
- @defaultSleepTime = DEFAULT_SLEEP_TIME
196
- @speed = :slow
226
+ self.speed = :slow
197
227
  end
198
228
 
199
229
  def visible
@@ -453,7 +483,7 @@ module Watir
453
483
 
454
484
  rescue WIN32OLERuntimeError # IE window must have been closed
455
485
  @down_load_time = Time.now - start_load_time
456
- sleep @defaultSleepTime unless no_sleep
486
+ sleep @pause_after_wait unless no_sleep
457
487
  return @down_load_time
458
488
  end
459
489
 
@@ -475,7 +505,7 @@ module Watir
475
505
 
476
506
  @down_load_time = Time.now - start_load_time
477
507
  run_error_checks
478
- sleep @defaultSleepTime unless no_sleep
508
+ sleep @pause_after_wait unless no_sleep
479
509
  @down_load_time
480
510
  end
481
511
 
@@ -17,6 +17,10 @@ module Watir
17
17
  super(nil)
18
18
  end
19
19
  end
20
+
21
+ #
22
+ # Input: Select
23
+ #
20
24
 
21
25
  # This class is the way in which select boxes are manipulated.
22
26
  # Normally a user would not need to create this object as it is returned by the Watir::Container#select_list method
@@ -26,6 +30,7 @@ module Watir
26
30
  attr_accessor :o
27
31
 
28
32
  # This method clears the selected items in the select box
33
+ # TODO: fix Camel case
29
34
  def clearSelection
30
35
  assert_exists
31
36
  highlight(:set)
@@ -99,7 +104,7 @@ module Watir
99
104
 
100
105
  # Returns the selected items as an array.
101
106
  # Raises UnknownObjectException if the select box is not found.
102
- def getSelectedItems
107
+ def getSelectedItems # TODO: fix camel case
103
108
  assert_exists
104
109
  returnArray = []
105
110
  @container.log "There are #{@o.length} items"
@@ -185,12 +190,18 @@ module Watir
185
190
  end
186
191
  end
187
192
 
188
- # This is the main class for accessing buttons.
189
- # Normally a user would not need to create this object as it is
190
- # returned by the Watir::Container#button method
193
+ #
194
+ # Input: Button
195
+ #
196
+
197
+ # Returned by the Watir::Container#button method
191
198
  class Button < InputElement
192
199
  INPUT_TYPES = ["button", "submit", "image", "reset"]
193
200
  end
201
+
202
+ #
203
+ # Input: Text
204
+ #
194
205
 
195
206
  # This class is the main class for Text Fields
196
207
  # Normally a user would not need to create this object as it is returned by the Watir::Container#text_field method
@@ -203,23 +214,21 @@ module Watir
203
214
  assert_exists
204
215
  begin
205
216
  ole_object.invoke('maxlength').to_i
206
- rescue
217
+ rescue WIN32OLERuntimeError
207
218
  0
208
219
  end
209
220
  end
210
-
211
-
221
+
212
222
  # Returns true or false if the text field is read only.
213
223
  # Raises UnknownObjectException if the object can't be found.
214
224
  def_wrap :readonly?, :readOnly
215
225
 
216
226
  def text_string_creator
217
227
  n = []
218
- n << "length:".ljust(TO_S_SIZE) + self.size.to_s
219
- n << "max length:".ljust(TO_S_SIZE) + self.maxlength.to_s
220
- n << "read only:".ljust(TO_S_SIZE) + self.readonly?.to_s
221
-
222
- return n
228
+ n << "length:".ljust(TO_S_SIZE) + self.size.to_s
229
+ n << "max length:".ljust(TO_S_SIZE) + self.maxlength.to_s
230
+ n << "read only:".ljust(TO_S_SIZE) + self.readonly?.to_s
231
+ n
223
232
  end
224
233
  private :text_string_creator
225
234
 
@@ -227,28 +236,30 @@ module Watir
227
236
  assert_exists
228
237
  r = string_creator
229
238
  r += text_string_creator
230
- return r.join("\n")
239
+ r.join("\n")
231
240
  end
232
241
 
233
242
  def assert_not_readonly
234
- raise ObjectReadOnlyException, "Textfield #{@how} and #{@what} is read only." if self.readonly?
243
+ if self.readonly?
244
+ raise ObjectReadOnlyException,
245
+ "Textfield #{@how} and #{@what} is read only."
246
+ end
235
247
  end
236
248
 
237
- # This method returns true or false if the text field contents is either a string match
238
- # or a regular expression match to the supplied value.
249
+ # Returns true if the text field contents is matches the specified target,
250
+ # which can be either a string or a regular expression.
239
251
  # Raises UnknownObjectException if the object can't be found
240
- # * containsThis - string or reg exp - the text to verify
241
- def verify_contains(containsThis) # FIXME: verify_contains should have same name and semantics as IE#contains_text (prolly make this work for all elements)
252
+ def verify_contains(target) # FIXME: verify_contains should have same name and semantics as IE#contains_text (prolly make this work for all elements)
242
253
  assert_exists
243
- if containsThis.kind_of? String
244
- return true if self.value == containsThis
245
- elsif containsThis.kind_of? Regexp
246
- return true if self.value.match(containsThis) != nil
254
+ if target.kind_of? String
255
+ return true if self.value == target
256
+ elsif target.kind_of? Regexp
257
+ return true if self.value.match(target) != nil
247
258
  end
248
259
  return false
249
260
  end
250
261
 
251
- # this method is used to drag the entire contents of the text field to another text field
262
+ # Drag the entire contents of the text field to another text field
252
263
  # 19 Jan 2005 - It is added as prototype functionality, and may change
253
264
  # * destination_how - symbol, :id, :name how we identify the drop target
254
265
  # * destination_what - string or regular expression, the name, id, etc of the text field that will be the drop target
@@ -273,7 +284,7 @@ module Watir
273
284
  self.value = ""
274
285
  end
275
286
 
276
- # This method clears the contents of the text box.
287
+ # Clears the contents of the text box.
277
288
  # Raises UnknownObjectException if the object can't be found
278
289
  # Raises ObjectDisabledException if the object is disabled
279
290
  # Raises ObjectReadOnlyException if the object is read only
@@ -294,61 +305,73 @@ module Watir
294
305
  highlight(:clear)
295
306
  end
296
307
 
297
- # This method appens the supplied text to the contents of the text box.
308
+ # Appends the specified string value to the contents of the text box.
298
309
  # Raises UnknownObjectException if the object cant be found
299
310
  # Raises ObjectDisabledException if the object is disabled
300
311
  # Raises ObjectReadOnlyException if the object is read only
301
- # * setThis - string - the text to append
302
- def append(setThis)
312
+ def append(value)
303
313
  assert_enabled
304
314
  assert_not_readonly
305
315
 
306
316
  highlight(:set)
307
317
  @o.scrollIntoView
308
318
  @o.focus
309
- doKeyPress(setThis)
319
+ type_by_character(value)
310
320
  highlight(:clear)
311
321
  end
312
322
 
313
- # This method sets the contents of the text box to the supplied text
323
+ # Sets the contents of the text box to the specified text value
314
324
  # Raises UnknownObjectException if the object cant be found
315
325
  # Raises ObjectDisabledException if the object is disabled
316
326
  # Raises ObjectReadOnlyException if the object is read only
317
- # * setThis - string - the text to set
318
- def set(setThis)
327
+ def set(value)
319
328
  assert_enabled
320
329
  assert_not_readonly
321
330
 
322
331
  highlight(:set)
323
332
  @o.scrollIntoView
324
- @o.focus
325
- @o.select
326
- @o.fireEvent("onSelect")
327
- @o.value = ""
328
- @o.fireEvent("onKeyPress")
329
- doKeyPress(setThis)
333
+ if type_keys
334
+ @o.focus
335
+ @o.select
336
+ @o.fireEvent("onSelect")
337
+ @o.fireEvent("onKeyPress")
338
+ @o.value = ""
339
+ type_by_character(value)
340
+ @o.fireEvent("onChange")
341
+ @o.fireEvent("onBlur")
342
+ else
343
+ @o.value = limit_to_maxlength(value)
344
+ end
330
345
  highlight(:clear)
331
- @o.fireEvent("onChange")
332
- @o.fireEvent("onBlur")
333
346
  end
334
347
 
335
- # this method sets the value of the text field directly. It causes no events to be fired or exceptions to be raised, so generally shouldnt be used
336
- # it is preffered to use the set method.
348
+ # Sets the value of the text field directly.
349
+ # It causes no events to be fired or exceptions to be raised,
350
+ # so generally shouldn't be used.
351
+ # It is preffered to use the set method.
337
352
  def value=(v)
338
353
  assert_exists
339
354
  @o.value = v.to_s
340
355
  end
341
356
 
357
+ def requires_typing
358
+ @type_keys = true
359
+ self
360
+ end
361
+ def abhors_typing
362
+ @type_keys = false
363
+ self
364
+ end
365
+
342
366
  private
343
367
 
344
- # This method is used internally by setText and appendText
368
+ # Type the characters in the specified string (value) one by one.
345
369
  # It should not be used externally.
346
370
  # * value - string - The string to enter into the text field
347
- def doKeyPress(value)
371
+ def type_by_character(value)
348
372
  value = limit_to_maxlength(value)
349
- for i in 0 .. value.length - 1
373
+ characters_in(value) do |c|
350
374
  sleep @container.typingspeed
351
- c = value[i,1]
352
375
  @o.value = @o.value.to_s + c
353
376
  @o.fireEvent("onKeyDown")
354
377
  @o.fireEvent("onKeyPress")
@@ -356,6 +379,16 @@ module Watir
356
379
  end
357
380
  end
358
381
 
382
+ # Supports double-byte characters
383
+ def characters_in(value)
384
+ index = 0
385
+ while index < value.length
386
+ len = value[index] > 128 ? 2 : 1
387
+ yield value[index, len]
388
+ index += len
389
+ end
390
+ end
391
+
359
392
  # Return the value (a string), limited to the maxlength of the element.
360
393
  def limit_to_maxlength(value)
361
394
  return value if @o.invoke('type') =~ /textarea/i # text areas don't have maxlength
@@ -393,7 +426,7 @@ module Watir
393
426
 
394
427
  end
395
428
 
396
- # This class is the class for fields that accept file uploads
429
+ # For fields that accept file uploads
397
430
  # Windows dialog is opened and handled in this case by autoit
398
431
  # launching into a new process.
399
432
  class FileField < InputElement
@@ -76,4 +76,73 @@ module Watir
76
76
  end
77
77
 
78
78
  end
79
+ class InputElementLocator
80
+ attr_accessor :document, :element, :elements
81
+ def initialize container, types
82
+ @container = container
83
+ @types = types
84
+ @elements = nil
85
+ end
86
+ def specifier= arg
87
+ how, what, value = arg
88
+ how = :value if how == :caption
89
+ how = :class_name if how == :class
90
+ what = what.to_i if how == :index
91
+ value = value.to_s if value
92
+ @how = how
93
+ @what = what
94
+ @value = value
95
+ end
96
+ def locate
97
+ object_index = 1
98
+ @elements.each do |object|
99
+ element = Element.new(object)
100
+ if @types.include?(element.type)
101
+ if @how == :index
102
+ attribute = object_index
103
+ else
104
+ begin
105
+ attribute = element.send(@how)
106
+ rescue NoMethodError
107
+ raise MissingWayOfFindingObjectException,
108
+ "#{@how} is an unknown way of finding an <INPUT> element (#{@what})"
109
+ end
110
+ end
111
+ if @what.matches(attribute)
112
+ if @value
113
+ if element.value == @value
114
+ return object
115
+ end
116
+ else
117
+ return object
118
+ end
119
+ end
120
+ object_index += 1
121
+ end
122
+ end
123
+ return nil
124
+ end
125
+ def fast_locate
126
+ # Searching through all elements returned by ole_inner_elements
127
+ # is *significantly* slower than IE's getElementById() and
128
+ # getElementsByName() calls when how is :id or :name. However
129
+ # IE doesn't match Regexps, so first we make sure what is a String.
130
+ # In addition, IE's getElementById() will also return an element
131
+ # where the :name matches, so we will only return the results of
132
+ # getElementById() if the matching element actually HAS a matching
133
+ # :id.
134
+ begin
135
+ if @what.class == String # Only use fast calls with String what.
136
+ if @how == :id
137
+ @element = @document.getElementById(what)
138
+ # Return if our fast match really HAS a matching :id
139
+ return @element if @element.nil? or @element.invoke('id') == what
140
+ elsif how == :name
141
+ @elements = @document.getElementsByName(what)
142
+ end
143
+ end
144
+ rescue
145
+ end
146
+ end
147
+ end
79
148
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: watir
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.5.3
7
- date: 2007-10-22 00:00:00 -05:00
6
+ version: 1.5.4
7
+ date: 2008-04-23 00:00:00 -05:00
8
8
  summary: Automated testing tool for web applications.
9
9
  require_paths:
10
10
  - .
@@ -124,6 +124,7 @@ files:
124
124
  - unittests/textarea_xpath_test.rb
125
125
  - unittests/textfields_test.rb
126
126
  - unittests/textfields_xpath_test.rb
127
+ - unittests/textfield_for_ch_char_test.rb
127
128
  - unittests/window_tests.rb
128
129
  - unittests/xpath_tests.rb
129
130
  - unittests/html/blankpage.html
@@ -249,3 +250,12 @@ dependencies:
249
250
  - !ruby/object:Gem::Version
250
251
  version: 0.5.1
251
252
  version:
253
+ - !ruby/object:Gem::Dependency
254
+ name: windows-pr
255
+ version_requirement:
256
+ version_requirements: !ruby/object:Gem::Version::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: 0.6.6
261
+ version: