selenium-webdriver 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. data/CHANGES +10 -0
  2. data/lib/selenium/webdriver.rb +23 -1
  3. data/lib/selenium/webdriver/chrome/bridge.rb +5 -1
  4. data/lib/selenium/webdriver/chrome/command_executor.rb +1 -1
  5. data/lib/selenium/webdriver/chrome/extension.zip +0 -0
  6. data/lib/selenium/webdriver/chrome/launcher.rb +10 -4
  7. data/lib/selenium/webdriver/common.rb +1 -0
  8. data/lib/selenium/webdriver/common/alert.rb +27 -0
  9. data/lib/selenium/webdriver/common/bridge_helper.rb +10 -7
  10. data/lib/selenium/webdriver/common/core_ext/dir.rb +1 -1
  11. data/lib/selenium/webdriver/common/driver.rb +8 -16
  12. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +1 -1
  13. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +1 -1
  14. data/lib/selenium/webdriver/common/element.rb +4 -4
  15. data/lib/selenium/webdriver/common/keys.rb +3 -1
  16. data/lib/selenium/webdriver/common/options.rb +2 -2
  17. data/lib/selenium/webdriver/common/platform.rb +11 -3
  18. data/lib/selenium/webdriver/common/socket_poller.rb +5 -1
  19. data/lib/selenium/webdriver/common/target_locator.rb +11 -3
  20. data/lib/selenium/webdriver/common/timeouts.rb +10 -0
  21. data/lib/selenium/webdriver/firefox/binary.rb +4 -2
  22. data/lib/selenium/webdriver/firefox/bridge.rb +1 -1
  23. data/lib/selenium/webdriver/firefox/extension.rb +2 -2
  24. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  25. data/lib/selenium/webdriver/firefox/launcher.rb +1 -1
  26. data/lib/selenium/webdriver/firefox/profiles_ini.rb +2 -2
  27. data/lib/selenium/webdriver/firefox/socket_lock.rb +1 -1
  28. data/lib/selenium/webdriver/firefox/util.rb +2 -2
  29. data/lib/selenium/webdriver/ie.rb +3 -4
  30. data/lib/selenium/webdriver/ie/bridge.rb +20 -565
  31. data/lib/selenium/webdriver/ie/lib.rb +4 -99
  32. data/lib/selenium/webdriver/ie/native/win32/IEDriver.dll +0 -0
  33. data/lib/selenium/webdriver/ie/native/x64/IEDriver.dll +0 -0
  34. data/lib/selenium/webdriver/remote.rb +1 -1
  35. data/lib/selenium/webdriver/remote/bridge.rb +21 -1
  36. data/lib/selenium/webdriver/remote/commands.rb +6 -1
  37. data/lib/selenium/webdriver/remote/http/default.rb +2 -1
  38. data/lib/selenium/webdriver/remote/response.rb +1 -1
  39. metadata +19 -10
  40. data/lib/selenium/webdriver/ie/native/win32/InternetExplorerDriver.dll +0 -0
  41. data/lib/selenium/webdriver/ie/native/x64/InternetExplorerDriver.dll +0 -0
  42. data/lib/selenium/webdriver/ie/util.rb +0 -138
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  class Binary
7
7
 
8
8
  NO_FOCUS_LIBRARY_NAME = "x_ignore_nofocus.so"
@@ -87,7 +87,7 @@ module Selenium
87
87
  class << self
88
88
 
89
89
  #
90
- # @private
90
+ # @api private
91
91
  #
92
92
  # @see Firefox.path=
93
93
  #
@@ -109,6 +109,8 @@ module Selenium
109
109
  raise Error::WebDriverError, "unknown platform: #{Platform.os}"
110
110
  end
111
111
 
112
+ @path = Platform.cygwin_path(@path) if Platform.cygwin?
113
+
112
114
  unless File.file?(@path.to_s)
113
115
  raise Error::WebDriverError, "Could not find Firefox binary (os=#{Platform.os}). Make sure Firefox is installed or set the path manually with #{self}.path="
114
116
  end
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  class Bridge < Remote::Bridge
7
7
 
8
8
  def initialize(opts = {})
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  class Extension
7
7
  EM_NAMESPACE_URI = "http://www.mozilla.org/2004/em-rdf#" # not used?
8
8
 
@@ -51,4 +51,4 @@ module Selenium
51
51
  end # Extension
52
52
  end # Firefox
53
53
  end # WebDriver
54
- end # Selenium
54
+ end # Selenium
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  class Launcher
7
7
 
8
8
  SOCKET_LOCK_TIMEOUT = 45
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  class ProfilesIni
7
7
 
8
8
  def initialize
@@ -59,4 +59,4 @@ module Selenium
59
59
  end # ProfilesIni
60
60
  end # Firefox
61
61
  end # WebDriver
62
- end # Selenium
62
+ end # Selenium
@@ -5,7 +5,7 @@ module Selenium
5
5
  module Firefox
6
6
 
7
7
  #
8
- # @private
8
+ # @api private
9
9
  #
10
10
 
11
11
  class SocketLock
@@ -2,7 +2,7 @@ module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
4
 
5
- # @private
5
+ # @api private
6
6
  module Util
7
7
  module_function
8
8
 
@@ -26,4 +26,4 @@ module Selenium
26
26
  end # Util
27
27
  end # Firefox
28
28
  end # WebDriver
29
- end # Selenium
29
+ end # Selenium
@@ -1,11 +1,11 @@
1
1
  module Selenium
2
2
  module WebDriver
3
3
 
4
- # @private
4
+ # @api private
5
5
  module IE
6
6
  DLLS = {
7
- :win32 => "#{WebDriver.root}/selenium/webdriver/ie/native/win32/InternetExplorerDriver.dll",
8
- :x64 => "#{WebDriver.root}/selenium/webdriver/ie/native/x64/InternetExplorerDriver.dll"
7
+ :win32 => "#{WebDriver.root}/selenium/webdriver/ie/native/win32/IEDriver.dll",
8
+ :x64 => "#{WebDriver.root}/selenium/webdriver/ie/native/x64/IEDriver.dll"
9
9
  }
10
10
  end
11
11
  end
@@ -14,5 +14,4 @@ end
14
14
  require "ffi"
15
15
 
16
16
  require "selenium/webdriver/ie/lib"
17
- require "selenium/webdriver/ie/util"
18
17
  require "selenium/webdriver/ie/bridge"
@@ -3,20 +3,29 @@ module Selenium
3
3
  module IE
4
4
 
5
5
  #
6
- # @private
6
+ # @api private
7
7
  #
8
8
 
9
- class Bridge
10
- include Util
9
+ class Bridge < Remote::Bridge
10
+
11
+ HOST = "localhost"
12
+
13
+ DEFAULT_PORT = 5555
14
+ DEFAULT_TIMEOUT = 30
11
15
 
12
16
  def initialize(opts = {})
13
- ptr_ref = FFI::MemoryPointer.new :pointer
17
+ timeout = opts[:timeout] || DEFAULT_TIMEOUT
18
+ @port = opts[:port] || DEFAULT_PORT
19
+ @speed = opts[:speed] || :fast
14
20
 
15
- check_error_code Lib.wdNewDriverInstance(ptr_ref),
16
- "could not create driver instance"
21
+ @server_pointer = Lib.start_server @port
22
+
23
+ unless SocketPoller.new(HOST, @port, timeout).connected?
24
+ raise "unable to connect to IE server within #{timeout} seconds"
25
+ end
17
26
 
18
- @driver_pointer = ptr_ref.get_pointer(0)
19
- @speed = opts[:speed] || :fast
27
+ super(:url => "http://#{HOST}:#{@port}",
28
+ :desired_capabilities => :internet_explorer)
20
29
  end
21
30
 
22
31
  def browser
@@ -27,565 +36,11 @@ module Selenium
27
36
  []
28
37
  end
29
38
 
30
- def get(url)
31
- check_error_code Lib.wdGet(@driver_pointer, wstring_ptr(url)),
32
- "Cannot get url #{url.inspect}"
33
- end
34
-
35
- def getCurrentUrl
36
- create_string do |wrapper|
37
- check_error_code Lib.wdGetCurrentUrl(@driver_pointer, wrapper),
38
- "unable to get current URL"
39
- end
40
- end
41
-
42
- def goBack
43
- check_error_code Lib.wdGoBack(@driver_pointer),
44
- "Cannot navigate back"
45
- end
46
-
47
- def goForward
48
- check_error_code Lib.wdGoForward(@driver_pointer),
49
- "Cannot navigate back"
50
- end
51
-
52
- def getTitle
53
- create_string do |wrapper|
54
- check_error_code Lib.wdGetTitle(@driver_pointer, wrapper),
55
- "unable to get title"
56
- end
57
- end
58
-
59
- def getPageSource
60
- create_string do |wrapper|
61
- check_error_code Lib.wdGetPageSource(@driver_pointer, wrapper),
62
- "unable to get page source"
63
- end
64
- end
65
-
66
- def getBrowserVisible
67
- int_ptr = FFI::MemoryPointer.new :int
68
- check_error_code Lib.wdGetVisible(@driver_pointer, int_ptr), "unable to determine if browser is visible"
69
-
70
- int_ptr.get_int(0) == 1
71
- end
72
-
73
- def setBrowserVisible(bool)
74
- check_error_code Lib.wdSetVisible(@driver_pointer, bool ? 1 : 0),
75
- "unable to change the visibility of the browser"
76
- end
77
-
78
- def setImplicitWaitTimeout(milliseconds)
79
- check_error_code Lib.wdSetImplicitWaitTimeout(@driver_pointer, milliseconds),
80
- "unable to set implicit wait timeout"
81
- end
82
-
83
- def switchToWindow(id)
84
- check_error_code Lib.wdSwitchToWindow(@driver_pointer, wstring_ptr(id)),
85
- "unable to locate window #{id.inspect}"
86
- end
87
-
88
- def switchToFrame(id)
89
- check_error_code Lib.wdSwitchToFrame(@driver_pointer, wstring_ptr(id)),
90
- "unable to locate frame #{id.inspect}"
91
- end
92
-
93
- def switchToActiveElement
94
- create_element do |ptr|
95
- check_error_code Lib.wdSwitchToActiveElement(@driver_pointer, ptr),
96
- "unable to switch to active element"
97
- end
98
- end
99
-
100
- def switchToDefaultContent
101
- switchToFrame ""
102
- end
103
-
104
39
  def quit
105
- getWindowHandles.each do |handle|
106
- begin
107
- switchToWindow handle
108
- close
109
- rescue Error::NoSuchWindowError
110
- end
111
- end
112
- ensure
113
- ptr = @driver_pointer
114
- @driver_pointer = nil
115
-
116
- check_error_code Lib.wdFreeDriver(ptr), "unable to free driver #{self}"
117
- end
118
-
119
- def close
120
- check_error_code Lib.wdClose(@driver_pointer), "unable to close driver"
121
- end
122
-
123
- def refresh
124
- check_error_code Lib.wdRefresh(@driver_pointer), "unable to refresh current page"
125
- end
126
-
127
- def getWindowHandles
128
- raw_handles = FFI::MemoryPointer.new :pointer
129
- check_error_code Lib.wdGetAllWindowHandles(@driver_pointer, raw_handles),
130
- "unable to obtain all window handles"
131
-
132
- string_array_from(raw_handles).uniq
133
- end
134
-
135
- def getCurrentWindowHandle
136
- create_string do |string_pointer|
137
- check_error_code Lib.wdGetCurrentWindowHandle(@driver_pointer, string_pointer),
138
- "unable to obtain current window handle"
139
- end
140
- end
141
-
142
- def executeScript(script, *args)
143
- script_args_ref = FFI::MemoryPointer.new :pointer
144
- result = Lib.wdNewScriptArgs(script_args_ref, args.size)
145
-
146
- check_error_code result, "unable to create new script arguments array"
147
-
148
- args_pointer = script_args_ref.get_pointer(0)
149
- populate_arguments(result, args_pointer, args)
150
-
151
- script = "(function() { return function(){" + script + "};})();"
152
- script_result_ref = FFI::MemoryPointer.new :pointer
153
-
154
- check_error_code Lib.wdExecuteScript(@driver_pointer, wstring_ptr(script), args_pointer, script_result_ref),
155
- "Cannot execute script"
156
-
157
- extract_return_value script_result_ref
158
- ensure
159
- Lib.wdFreeScriptArgs(args_pointer) if args_pointer
160
- end
161
-
162
- def waitForLoadToComplete
163
- Lib.wdWaitForLoadToComplete(@driver_pointer)
164
- end
165
-
166
- #
167
- # Configuration
168
- #
169
-
170
- def addCookie(opts)
171
- cookie_string = "#{opts[:name]}=#{opts[:value]}; "
172
- cookie_string << "path=#{opts[:path]}; " if opts[:path] && !opts[:path].empty?
173
- cookie_string << "domain=#{opts[:domain][/^(.+?):/, 1]};" if opts[:domain] && !opts[:domain].empty?
174
-
175
- check_error_code Lib.wdAddCookie(@driver_pointer, wstring_ptr(cookie_string)),
176
- "unable to add cookie"
177
- end
178
-
179
- def getAllCookies
180
- str = create_string do |wrapper|
181
- check_error_code Lib.wdGetCookies(@driver_pointer, wrapper), "unable to get cookies"
182
- end
183
-
184
- str.split("; ").map do |cookie_string|
185
- parts = cookie_string.split("=")
186
- next unless parts.size == 2
187
-
188
- {
189
- 'name' => parts[0],
190
- 'value' => parts[1],
191
- 'domain' => getCurrentUrl,
192
- 'path' => "",
193
- 'expires' => nil,
194
- 'secure' => false
195
- }
196
- end.compact
197
- end
198
-
199
- def deleteCookie(name)
200
- raise NotImplementedError, "missing from IE driver"
201
- end
202
-
203
- def deleteAllCookies
204
- raise NotImplementedError, "missing from IE driver"
205
- end
206
-
207
- def setSpeed(speed)
208
- @speed = speed
209
- end
210
-
211
- def getSpeed
212
- @speed
213
- end
214
-
215
- #
216
- # Finders
217
- #
218
-
219
- def findElementByClassName(parent, class_name)
220
- create_element do |raw_element|
221
- check_error_code Lib.wdFindElementByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_element),
222
- "unable to find element by class name using #{class_name.inspect}"
223
- end
224
- end
225
-
226
- def findElementsByClassName(parent, class_name)
227
- create_element_collection do |raw_elements|
228
- check_error_code Lib.wdFindElementsByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_elements),
229
- "unable to find elements by class name using #{class_name.inspect}"
230
- end
231
- end
232
-
233
- def findElementByCssSelector(parent, selector)
234
- create_element do |raw_element|
235
- check_error_code Lib.wdFindElementByCss(@driver_pointer, parent, wstring_ptr(selector), raw_element),
236
- "unable to find element by css selector using #{selector.inspect}"
237
- end
238
- end
239
-
240
- def findElementsByCssSelector(parent, selector)
241
- create_element_collection do |raw_elements|
242
- check_error_code Lib.wdFindElementsByCss(@driver_pointer, parent, wstring_ptr(selector), raw_elements),
243
- "unable to find elements by css selector using #{selector.inspect}"
244
- end
245
- end
246
-
247
- def findElementById(parent, id)
248
- create_element do |raw_element|
249
- check_error_code Lib.wdFindElementById(@driver_pointer, parent, wstring_ptr(id), raw_element),
250
- "unable to find element by id using #{id.inspect}"
251
- end
252
- end
253
-
254
- def findElementsById(parent, id)
255
- create_element_collection do |raw_elements|
256
- check_error_code Lib.wdFindElementsById(@driver_pointer, parent, wstring_ptr(id), raw_elements),
257
- "unable to find elements by id using #{id.inspect}"
258
- end
259
- end
260
-
261
- def findElementByLinkText(parent, link_text)
262
- create_element do |raw_element|
263
- check_error_code Lib.wdFindElementByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
264
- "unable to find element by link text using #{link_text.inspect}"
265
- end
266
- end
267
-
268
- def findElementsByLinkText(parent, link_text)
269
- create_element_collection do |raw_elements|
270
- check_error_code Lib.wdFindElementsByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
271
- "unable to find elements by link text using #{link_text.inspect}"
272
- end
273
- end
274
-
275
- def findElementByPartialLinkText(parent, link_text)
276
- create_element do |raw_element|
277
- check_error_code Lib.wdFindElementByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
278
- "unable to find element by partial link text using #{link_text.inspect}"
279
- end
280
- end
281
-
282
- def findElementsByPartialLinkText(parent, link_text)
283
- create_element_collection do |raw_elements|
284
- check_error_code Lib.wdFindElementsByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
285
- "unable to find elements by partial link text using #{link_text.inspect}"
286
- end
287
- end
40
+ super
41
+ Lib.stop_server(@server_pointer)
288
42
 
289
- def findElementByName(parent, name)
290
- create_element do |raw_element|
291
- check_error_code Lib.wdFindElementByName(@driver_pointer, parent, wstring_ptr(name), raw_element),
292
- "unable to find element by name using #{name.inspect}"
293
- end
294
- end
295
-
296
- def findElementsByName(parent, name)
297
- create_element_collection do |raw_elements|
298
- check_error_code Lib.wdFindElementsByName(@driver_pointer, parent, wstring_ptr(name), raw_elements),
299
- "unable to find elements by name using #{name.inspect}"
300
- end
301
- end
302
-
303
- def findElementByTagName(parent, tag_name)
304
- create_element do |raw_element|
305
- check_error_code Lib.wdFindElementByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_element),
306
- "unable to find element by tag name using #{tag_name.inspect}"
307
- end
308
- end
309
-
310
- def findElementsByTagName(parent, tag_name)
311
- create_element_collection do |raw_elements|
312
- check_error_code Lib.wdFindElementsByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_elements),
313
- "unable to find elements by tag name using #{tag_name.inspect}"
314
- end
315
- end
316
-
317
- def findElementByXpath(parent, xpath)
318
- create_element do |raw_element|
319
- check_error_code Lib.wdFindElementByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_element),
320
- "unable to find element by xpath using #{xpath.inspect}"
321
- # TODO: Additional error handling
322
- end
323
- end
324
-
325
- def findElementsByXpath(parent, xpath)
326
- create_element_collection do |raw_elements|
327
- check_error_code Lib.wdFindElementsByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_elements),
328
- "unable to find elements by xpath using #{xpath.inspect}"
329
- # TODO: Additional error handling
330
- end
331
- end
332
-
333
-
334
- #
335
- # Element functions
336
- #
337
-
338
- def clickElement(element_pointer)
339
- check_error_code Lib.wdeClick(element_pointer), "unable to click element"
340
- end
341
-
342
- def getElementTagName(element_pointer)
343
- create_string do |string_pointer|
344
- check_error_code Lib.wdeGetTagName(element_pointer, string_pointer),
345
- "unable to get tag name"
346
- end
347
- end
348
-
349
- def getElementAttribute(element_pointer, name)
350
- create_string do |string_pointer|
351
- check_error_code Lib.wdeGetAttribute(@driver_pointer, element_pointer, wstring_ptr(name), string_pointer),
352
- "unable to get attribute #{name.inspect}"
353
- end
354
- end
355
-
356
- def getElementValue(element_pointer)
357
- val = getElementAttribute(element_pointer, 'value')
358
- val.gsub("\r\n", "\n") if val
359
- end
360
-
361
- def getElementText(element_pointer)
362
- val = create_string do |string_pointer|
363
- check_error_code Lib.wdeGetText(element_pointer, string_pointer),
364
- "unable to get text"
365
- end
366
-
367
- val.gsub("\r\n", "\n") if val
368
- end
369
-
370
- def sendKeysToElement(element_pointer, string)
371
- check_error_code Lib.wdeSendKeys(element_pointer, wstring_ptr(string)),
372
- "unable to send keys to #{self}"
373
- waitForLoadToComplete
374
- end
375
-
376
- def clearElement(element_pointer)
377
- check_error_code Lib.wdeClear(element_pointer), "unable to clear element"
378
- end
379
-
380
- def isElementEnabled(element_pointer)
381
- int_ptr = FFI::MemoryPointer.new(:int)
382
- check_error_code Lib.wdeIsEnabled(element_pointer, int_ptr),
383
- "unable to get enabled state"
384
-
385
- int_ptr.get_int(0) == 1
386
- end
387
-
388
- def isElementSelected(element_pointer)
389
- int_ptr = FFI::MemoryPointer.new(:int)
390
- check_error_code Lib.wdeIsSelected(element_pointer, int_ptr),
391
- "unable to get selected state"
392
-
393
- int_ptr.get_int(0) == 1
394
- end
395
-
396
- def isElementDisplayed(element_pointer)
397
- int_ptr = FFI::MemoryPointer.new :int
398
- check_error_code Lib.wdeIsDisplayed(element_pointer, int_ptr), "unable to check visibilty"
399
-
400
- int_ptr.get_int(0) == 1;
401
- end
402
-
403
- def submitElement(element_pointer)
404
- check_error_code Lib.wdeSubmit(element_pointer), "unable to submit element"
405
- end
406
-
407
- def toggleElement(element_pointer)
408
- int_ptr = FFI::MemoryPointer.new :int
409
- result = Lib.wdeToggle(element_pointer, int_ptr)
410
-
411
- if result == 9
412
- raise WebDriver::UnsupportedOperationError,
413
- "You may not toggle this element: #{get_element_tag_name(element_pointer)}"
414
- end
415
-
416
- check_error_code result, "unable to toggle element"
417
-
418
- int_ptr.get_int(0) == 1
419
- end
420
-
421
- def setElementSelected(element_pointer)
422
- check_error_code Lib.wdeSetSelected(element_pointer), "unable to select element"
423
- end
424
-
425
- def getElementValueOfCssProperty(element_pointer, prop)
426
- create_string do |string_pointer|
427
- check_error_code Lib.wdeGetValueOfCssProperty(element_pointer, wstring_ptr(prop), string_pointer),
428
- "unable to get value of css property: #{prop.inspect}"
429
- end
430
- end
431
-
432
- def hoverOverElement(element_pointer)
433
- raise NotImplementedError
434
- end
435
-
436
- def elementEquals(element, other)
437
- executeScript "return arguments[0] === arguments[1]", element, other
438
- end
439
-
440
- def dragElement(element_pointer, right_by, down_by)
441
- # TODO: check return values?
442
- hwnd = FFI::MemoryPointer.new :pointer
443
- x, y, width, height = Array.new(4) { FFI::MemoryPointer.new :long }
444
-
445
- check_error_code Lib.wdeGetDetailsOnceScrolledOnToScreen(element_pointer, hwnd, x, y, width, height),
446
- "unable to determine location once scrolled on to screen"
447
-
448
- Lib.wdeMouseDownAt(hwnd.get_pointer(0), x.get_long(0), y.get_long(0))
449
-
450
- destination_x = x.get_long(0) + right_by
451
- destination_y = y.get_long(0) + down_by
452
- duration = 500 # TODO: parent.manage().getSpeed().getTimeOut();
453
-
454
- Lib.wdeMouseMoveTo(hwnd.get_pointer(0), duration, x.get_long(0), y.get_long(0), destination_x, destination_y)
455
- Lib.wdeMouseUpAt(hwnd.get_pointer(0), destination_x, destination_y)
456
- end
457
-
458
- def getElementLocation(element_pointer)
459
- x = FFI::MemoryPointer.new :long
460
- y = FFI::MemoryPointer.new :long
461
-
462
- check_error_code Lib.wdeGetLocation(element_pointer, x, y), "unable to get location of element"
463
-
464
- Point.new x.get_int(0), y.get_int(0)
465
- end
466
-
467
- def getElementSize(element_pointer)
468
- width = FFI::MemoryPointer.new :long
469
- height = FFI::MemoryPointer.new :long
470
-
471
- check_error_code Lib.wdeGetSize(element_pointer, width, height), "unable to get size of element"
472
-
473
- Dimension.new width.get_int(0), height.get_int(0)
474
- end
475
-
476
- def finalize(element_pointer)
477
- check_error_code Lib.wdeFreeElement(element_pointer),
478
- "unable to finalize #{element_pointer} for #{self}"
479
- end
480
-
481
- private
482
-
483
- def populate_arguments(result, args_pointer, args)
484
- args.each do |arg|
485
- case arg
486
- when String
487
- result = Lib.wdAddStringScriptArg(args_pointer, wstring_ptr(arg))
488
- when TrueClass, FalseClass, NilClass
489
- result = Lib.wdAddBooleanScriptArg(args_pointer, arg == true ? 1 : 0)
490
- when Float
491
- result = Lib.wdAddDoubleScriptArg(args_pointer, arg)
492
- when Integer
493
- result = Lib.wdAddNumberScriptArg(args_pointer, arg)
494
- when WebDriver::Element
495
- result = Lib.wdAddElementScriptArg(args_pointer, arg.ref)
496
- else
497
- raise TypeError, "Parameter is not of recognized type: #{arg.inspect}:#{arg.class}"
498
- end
499
-
500
- check_error_code result, "unable to add argument: #{arg.inspect}"
501
- end
502
-
503
-
504
- result
505
- end
506
-
507
- def extract_return_value(pointer_ref)
508
- result, returned = nil
509
- script_result = pointer_ref.get_pointer(0)
510
-
511
- type_pointer = FFI::MemoryPointer.new(:int)
512
- result = Lib.wdGetScriptResultType(@driver_pointer, script_result, type_pointer)
513
-
514
- check_error_code result, "Cannot determine result type"
515
- result_type = type_pointer.get_int(0)
516
-
517
- case result_type
518
- when 1 # String
519
- create_string do |wrapper|
520
- check_error_code Lib.wdGetStringScriptResult(script_result, wrapper), "Cannot extract string result"
521
- end
522
- when 2 # Long
523
- long_pointer = FFI::MemoryPointer.new(:long)
524
- check_error_code Lib.wdGetNumberScriptResult(script_result, long_pointer),
525
- "Cannot extract number result"
526
-
527
- long_pointer.get_long(0)
528
- when 3 # Boolean
529
- int_pointer = FFI::MemoryPointer.new(:int)
530
- check_error_code Lib.wdGetBooleanScriptResult(script_result, int_pointer),
531
- "Cannot extract boolean result"
532
-
533
- int_pointer.get_int(0) == 1
534
- when 4 # WebElement
535
- element_pointer = FFI::MemoryPointer.new(:pointer)
536
- check_error_code Lib.wdGetElementScriptResult(script_result, @driver_pointer, element_pointer),
537
- "Cannot extract element result"
538
-
539
- auto_ptr = FFI::AutoPointer.new(element_pointer.get_pointer(0), Lib.method(:finalize_element))
540
- Element.new(self, auto_ptr)
541
- when 5 # Nothing
542
- nil
543
- when 6 # Exception
544
- message = create_string do |string_pointer|
545
- check_error_code Lib.wdGetStringScriptResult(script_result, string_pointer), "Cannot extract string result"
546
- end
547
-
548
- raise Error::WebDriverError, message
549
- when 7 # Double
550
- double_pointer = FFI::MemoryPointer.new(:double)
551
- check_error_code Lib.wdGetDoubleScriptResult(script_result, double_pointer), "Cannot extract double result"
552
-
553
- double_pointer.get_double(0)
554
- when 8 # Array
555
- array_length_pointer = FFI::MemoryPointer.new(:int)
556
- check_error_code Lib.wdGetArrayLengthScriptResult(@driver_pointer, script_result, array_length_pointer),
557
- "Cannot extract array length"
558
-
559
- arr = []
560
- array_length_pointer.get_int(0).times do |idx|
561
- current_item_pointer = FFI::MemoryPointer.new(:pointer)
562
- result_code = Lib.wdGetArrayItemFromScriptResult(@driver_pointer, script_result, idx, current_item_pointer)
563
-
564
- # free the pointer if the call failed
565
- if Error.for_code(result_code)
566
- Lib.wdFreeScriptResult(current_item_pointer.get_pointer(0))
567
- check_error_code result_code
568
- end
569
-
570
- arr << extract_return_value(current_item_pointer)
571
- end
572
-
573
- arr
574
- else
575
- raise Error::WebDriverError, "Cannot determine result type (#{result_type.inspect})"
576
- end
577
- ensure
578
- Lib.wdFreeScriptResult(script_result) if script_result
579
- end
580
-
581
- def check_error_code(code, message)
582
- return unless ex = WebDriver::Error.for_code(code)
583
-
584
- if ex == Error::TimeOutError
585
- raise ex, "#{message} (#{code}): The driver reported that the command timed out. There may be several reasons for this. Check that the destination site is in IE's 'Trusted Sites' (accessed from Tools->Internet Options in the 'Security' tab). If it is a trusted site, then the request may have taken more than a minute to finish."
586
- else
587
- raise ex, "#{message} (#{code})"
588
- end
43
+ nil
589
44
  end
590
45
 
591
46
  end # Bridge