selenium-webdriver 0.0.1

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 (86) hide show
  1. data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
  2. data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
  3. data/chrome/src/extension/background.html +9 -0
  4. data/chrome/src/extension/background.js +933 -0
  5. data/chrome/src/extension/content_script.js +1286 -0
  6. data/chrome/src/extension/manifest-nonwin.json +15 -0
  7. data/chrome/src/extension/manifest-win.json +16 -0
  8. data/chrome/src/extension/toolstrip.html +28 -0
  9. data/chrome/src/extension/utils.js +196 -0
  10. data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
  11. data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +324 -0
  12. data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +70 -0
  13. data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +119 -0
  14. data/common/src/js/abstractcommandprocessor.js +161 -0
  15. data/common/src/js/asserts.js +296 -0
  16. data/common/src/js/by.js +147 -0
  17. data/common/src/js/command.js +274 -0
  18. data/common/src/js/context.js +58 -0
  19. data/common/src/js/extension/README +2 -0
  20. data/common/src/js/extension/dommessenger.js +152 -0
  21. data/common/src/js/factory.js +55 -0
  22. data/common/src/js/future.js +118 -0
  23. data/common/src/js/key.js +117 -0
  24. data/common/src/js/localcommandprocessor.js +181 -0
  25. data/common/src/js/logging.js +249 -0
  26. data/common/src/js/testrunner.js +605 -0
  27. data/common/src/js/timing.js +89 -0
  28. data/common/src/js/wait.js +199 -0
  29. data/common/src/js/webdriver.js +853 -0
  30. data/common/src/js/webelement.js +683 -0
  31. data/common/src/rb/lib/selenium-webdriver.rb +1 -0
  32. data/common/src/rb/lib/selenium/webdriver.rb +52 -0
  33. data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +88 -0
  34. data/common/src/rb/lib/selenium/webdriver/child_process.rb +85 -0
  35. data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
  36. data/common/src/rb/lib/selenium/webdriver/driver.rb +128 -0
  37. data/common/src/rb/lib/selenium/webdriver/element.rb +126 -0
  38. data/common/src/rb/lib/selenium/webdriver/error.rb +68 -0
  39. data/common/src/rb/lib/selenium/webdriver/find.rb +69 -0
  40. data/common/src/rb/lib/selenium/webdriver/navigation.rb +23 -0
  41. data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
  42. data/common/src/rb/lib/selenium/webdriver/platform.rb +82 -0
  43. data/common/src/rb/lib/selenium/webdriver/target_locator.rb +23 -0
  44. data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
  45. data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
  46. data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
  47. data/firefox/src/extension/chrome.manifest +3 -0
  48. data/firefox/src/extension/components/context.js +37 -0
  49. data/firefox/src/extension/components/driver-component.js +127 -0
  50. data/firefox/src/extension/components/firefoxDriver.js +706 -0
  51. data/firefox/src/extension/components/json2.js +273 -0
  52. data/firefox/src/extension/components/keytest.html +554 -0
  53. data/firefox/src/extension/components/nsCommandProcessor.js +586 -0
  54. data/firefox/src/extension/components/screenshooter.js +70 -0
  55. data/firefox/src/extension/components/socketListener.js +185 -0
  56. data/firefox/src/extension/components/utils.js +1200 -0
  57. data/firefox/src/extension/components/webLoadingListener.js +57 -0
  58. data/firefox/src/extension/components/webdriverserver.js +101 -0
  59. data/firefox/src/extension/components/wrappedElement.js +609 -0
  60. data/firefox/src/extension/content/fxdriver.xul +30 -0
  61. data/firefox/src/extension/content/server.js +95 -0
  62. data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
  63. data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
  64. data/firefox/src/extension/install.rdf +29 -0
  65. data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +21 -0
  66. data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +86 -0
  67. data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +426 -0
  68. data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +82 -0
  69. data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +132 -0
  70. data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +174 -0
  71. data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +60 -0
  72. data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
  73. data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
  74. data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
  75. data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
  76. data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +552 -0
  77. data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +94 -0
  78. data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
  79. data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
  80. data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +374 -0
  81. data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
  82. data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
  83. data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
  84. data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +43 -0
  85. data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
  86. metadata +182 -0
@@ -0,0 +1,23 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Firefox
4
+ module Util
5
+ module_function
6
+
7
+ def app_data_path
8
+ case Platform.os
9
+ when :windows
10
+ "#{ENV['APPDATA']}\\Mozilla\\Firefox"
11
+ when :macosx
12
+ "#{Platform.home}/Library/Application Support/Firefox"
13
+ when :unix
14
+ "#{Platform.home}/.mozilla/firefox"
15
+ else
16
+ raise "Unknown os: #{Platform.os}"
17
+ end
18
+ end
19
+
20
+ end # Util
21
+ end # Firefox
22
+ end # WebDriver
23
+ end # Selenium
@@ -0,0 +1,14 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module IE
4
+ # TODO: x64
5
+ DLL = "#{WebDriver.root}/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll"
6
+ end
7
+ end
8
+ end
9
+
10
+ require "ffi"
11
+
12
+ require "selenium/webdriver/ie/lib"
13
+ require "selenium/webdriver/ie/util"
14
+ require "selenium/webdriver/ie/bridge"
@@ -0,0 +1,552 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module IE
4
+
5
+ class Bridge
6
+ include Util
7
+
8
+ def initialize
9
+ ptr_ref = FFI::MemoryPointer.new :pointer
10
+
11
+ check_error_code Lib.wdNewDriverInstance(ptr_ref),
12
+ "could not create driver instance"
13
+
14
+ @driver_pointer = ptr_ref.get_pointer(0)
15
+ @speed = :fast
16
+ end
17
+
18
+ def browser
19
+ :internet_explorer
20
+ end
21
+
22
+ def get(url)
23
+ check_error_code Lib.wdGet(@driver_pointer, wstring_ptr(url)),
24
+ "Cannot get url #{url.inspect}"
25
+ end
26
+
27
+ def getCurrentUrl
28
+ create_string do |wrapper|
29
+ check_error_code Lib.wdGetCurrentUrl(@driver_pointer, wrapper),
30
+ "Unable to get current URL"
31
+ end
32
+ end
33
+
34
+ def goBack
35
+ check_error_code Lib.wdGoBack(@driver_pointer),
36
+ "Cannot navigate back"
37
+ end
38
+
39
+ def goForward
40
+ check_error_code Lib.wdGoForward(@driver_pointer),
41
+ "Cannot navigate back"
42
+ end
43
+
44
+ def getTitle
45
+ create_string do |wrapper|
46
+ check_error_code Lib.wdGetTitle(@driver_pointer, wrapper),
47
+ "Unable to get title"
48
+ end
49
+ end
50
+
51
+ def getPageSource
52
+ create_string do |wrapper|
53
+ check_error_code Lib.wdGetPageSource(@driver_pointer, wrapper),
54
+ "Unable to get page source"
55
+ end
56
+ end
57
+
58
+ def getBrowserVisible
59
+ int_ptr = FFI::MemoryPointer.new :int
60
+ check_error_code Lib.wdGetVisible(@driver_pointer, int_ptr), "Unable to determine if browser is visible"
61
+
62
+ int_ptr.get_int(0) == 1
63
+ ensure
64
+ int_ptr.free
65
+ end
66
+
67
+ def setBrowserVisible(bool)
68
+ check_error_code Lib.wdSetVisible(@driver_pointer, bool ? 1 : 0),
69
+ "Unable to change the visibility of the browser"
70
+ end
71
+
72
+ def switchToWindow(id)
73
+ check_error_code Lib.wdSwitchToWindow(@driver_pointer, wstring_ptr(id)),
74
+ "Unable to locate window #{id.inspect}"
75
+ end
76
+
77
+ def switchToFrame(id)
78
+ check_error_code Lib.wdSwitchToFrame(@driver_pointer, wstring_ptr(id)),
79
+ "Unable to locate frame #{id.inspect}"
80
+ end
81
+
82
+ def switchToActiveElement
83
+ create_element do |ptr|
84
+ check_error_code Lib.wdSwitchToActiveElement(@driver_pointer, ptr),
85
+ "Unable to switch to active element"
86
+ end
87
+ end
88
+
89
+ def quit
90
+ getWindowHandles.each do |handle|
91
+ switch_to_window handle rescue nil # TODO: rescue specific exceptions
92
+ close
93
+ end
94
+
95
+ # hack
96
+ ObjectSpace.each_object(WebDriver::Element) { |e| finalize e.ref if e.bridge == self }
97
+ ensure
98
+ Lib.wdFreeDriver(@driver_pointer)
99
+ @driver_pointer = nil
100
+ end
101
+
102
+ def close
103
+ check_error_code Lib.wdClose(@driver_pointer), "Unable to close driver"
104
+ end
105
+
106
+ def getWindowHandles
107
+ raw_handles = FFI::MemoryPointer.new :pointer
108
+ check_error_code Lib.wdGetAllWindowHandles(@driver_pointer, raw_handles),
109
+ "Unable to obtain all window handles"
110
+
111
+ string_array_from(raw_handles).uniq
112
+ # TODO: who calls raw_handles.free if exception is raised?
113
+ end
114
+
115
+ def getCurrentWindowHandle
116
+ create_string do |string_pointer|
117
+ check_error_code Lib.wdGetCurrentWindowHandle(@driver_pointer, string_pointer),
118
+ "Unable to obtain current window handle"
119
+ end
120
+ end
121
+
122
+ def executeScript(script, *args)
123
+ script_args_ref = FFI::MemoryPointer.new :pointer
124
+ result = Lib.wdNewScriptArgs(script_args_ref, args.size)
125
+
126
+ check_error_code result, "Unable to create new script arguments array"
127
+
128
+ args_pointer = script_args_ref.get_pointer(0)
129
+ populate_arguments(result, args_pointer, args)
130
+
131
+ script = "(function() { return function(){" + script + "};})();"
132
+ script_result_ref = FFI::MemoryPointer.new :pointer
133
+
134
+ check_error_code Lib.wdExecuteScript(@driver_pointer, wstring_ptr(script), args_pointer, script_result_ref),
135
+ "Cannot execute script"
136
+
137
+ extract_return_value script_result_ref
138
+ ensure
139
+ script_args_ref.free
140
+ script_result_ref.free if script_result_ref
141
+ Lib.wdFreeScriptArgs(args_pointer) if args_pointer
142
+ end
143
+
144
+ def waitForLoadToComplete
145
+ Lib.wdWaitForLoadToComplete(@driver_pointer)
146
+ end
147
+
148
+ #
149
+ # Configuration
150
+ #
151
+
152
+ def addCookie(opts)
153
+ cookie_string = "#{opts[:name]}=#{opts[:value]}; "
154
+ cookie_string << "path=#{opts[:path]}; " if opts[:path] && !opts[:path].empty?
155
+ cookie_string << "domain=#{opts[:domain][/^(.+?):/, 1]};" if opts[:domain] && !opts[:domain].empty?
156
+
157
+ check_error_code Lib.wdAddCookie(@driver_pointer, wstring_ptr(cookie_string)),
158
+ "Unable to add cookie"
159
+ end
160
+
161
+ def getAllCookies
162
+ str = create_string do |wrapper|
163
+ check_error_code Lib.wdGetCookies(@driver_pointer, wrapper), "Unable to get cookies"
164
+ end
165
+
166
+ p :cookie_string => str
167
+
168
+ str.split("; ").map do |cookie_string|
169
+ parts = cookie_string.split("=")
170
+ next unless parts.size == 2
171
+
172
+ {
173
+ 'name' => parts[0],
174
+ 'value' => parts[1],
175
+ 'domain' => getCurrentUrl,
176
+ 'path' => "",
177
+ 'expires' => nil,
178
+ 'secure' => false
179
+ }
180
+ end.compact
181
+ end
182
+
183
+ def deleteCookie(name)
184
+ raise NotImplementedError, "missing from IE driver"
185
+ end
186
+
187
+ def deleteAllCookies
188
+ raise NotImplementedError, "missing from IE driver"
189
+ end
190
+
191
+ def setSpeed(speed)
192
+ @speed = speed
193
+ end
194
+
195
+ def getSpeed
196
+ @speed
197
+ end
198
+
199
+ #
200
+ # Finders
201
+ #
202
+
203
+ def findElementByClassName(parent, class_name)
204
+ # TODO: argument checks
205
+
206
+ create_element do |raw_element|
207
+ check_error_code Lib.wdFindElementByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_element),
208
+ "Unable to find element by class name using #{class_name.inspect}"
209
+ end
210
+ end
211
+
212
+ def findElementsByClassName(parent, class_name)
213
+ # TODO: argument checks
214
+
215
+ create_element_collection do |raw_elements|
216
+ check_error_code Lib.wdFindElementsByClassName(@driver_pointer, parent, wstring_ptr(class_name), raw_elements),
217
+ "Unable to find elements by class name using #{class_name.inspect}"
218
+ end
219
+ end
220
+
221
+ def findElementById(parent, id)
222
+ create_element do |raw_element|
223
+ check_error_code Lib.wdFindElementById(@driver_pointer, parent, wstring_ptr(id), raw_element),
224
+ "Unable to find element by id using #{id.inspect}"
225
+ end
226
+ end
227
+
228
+ def findElementsById(parent, id)
229
+ create_element_collection do |raw_elements|
230
+ check_error_code Lib.wdFindElementsById(@driver_pointer, parent, wstring_ptr(id), raw_elements),
231
+ "Unable to find elements by id using #{id.inspect}"
232
+ end
233
+ end
234
+
235
+ def findElementByLinkText(parent, link_text)
236
+ create_element do |raw_element|
237
+ check_error_code Lib.wdFindElementByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
238
+ "Unable to find element by link text using #{link_text.inspect}"
239
+ end
240
+ end
241
+
242
+ def findElementsByLinkText(parent, link_text)
243
+ create_element_collection do |raw_elements|
244
+ check_error_code Lib.wdFindElementsByLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
245
+ "Unable to find elements by link text using #{link_text.inspect}"
246
+ end
247
+ end
248
+
249
+ def findElementByPartialLinkText(parent, link_text)
250
+ create_element do |raw_element|
251
+ check_error_code Lib.wdFindElementByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_element),
252
+ "Unable to find element by partial link text using #{link_text.inspect}"
253
+ end
254
+ end
255
+
256
+ def findElementsByPartialLinkText(parent, link_text)
257
+ create_element_collection do |raw_elements|
258
+ check_error_code Lib.wdFindElementsByPartialLinkText(@driver_pointer, parent, wstring_ptr(link_text), raw_elements),
259
+ "Unable to find elements by partial link text using #{link_text.inspect}"
260
+ end
261
+ end
262
+
263
+ def findElementByName(parent, name)
264
+ create_element do |raw_element|
265
+ check_error_code Lib.wdFindElementByName(@driver_pointer, parent, wstring_ptr(name), raw_element),
266
+ "Unable to find element by name using #{name.inspect}"
267
+ end
268
+ end
269
+
270
+ def findElementsByName(parent, name)
271
+ create_element_collection do |raw_elements|
272
+ check_error_code Lib.wdFindElementsByName(@driver_pointer, parent, wstring_ptr(name), raw_elements),
273
+ "Unable to find elements by name using #{name.inspect}"
274
+ end
275
+ end
276
+
277
+ def findElementByTagName(parent, tag_name)
278
+ create_element do |raw_element|
279
+ check_error_code Lib.wdFindElementByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_element),
280
+ "Unable to find element by tag name using #{tag_name.inspect}"
281
+ end
282
+ end
283
+
284
+ def findElementsByTagName(parent, tag_name)
285
+ create_element_collection do |raw_elements|
286
+ check_error_code Lib.wdFindElementsByTagName(@driver_pointer, parent, wstring_ptr(tag_name), raw_elements),
287
+ "Unable to find elements by tag name using #{tag_name.inspect}"
288
+ end
289
+ end
290
+
291
+ def findElementByXpath(parent, xpath)
292
+ create_element do |raw_element|
293
+ check_error_code Lib.wdFindElementByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_element),
294
+ "Unable to find element by xpath using #{xpath.inspect}"
295
+ # TODO: Additional error handling
296
+ end
297
+ end
298
+
299
+ def findElementsByXpath(parent, xpath)
300
+ create_element_collection do |raw_elements|
301
+ check_error_code Lib.wdFindElementsByXPath(@driver_pointer, parent, wstring_ptr(xpath), raw_elements),
302
+ "Unable to find elements by xpath using #{xpath.inspect}"
303
+ # TODO: Additional error handling
304
+ end
305
+ end
306
+
307
+
308
+ #
309
+ # Element functions
310
+ #
311
+
312
+ def clickElement(element_pointer)
313
+ check_error_code Lib.wdeClick(element_pointer), "Unable to click element"
314
+ end
315
+
316
+ def getElementTagName(element_pointer)
317
+ create_string do |string_pointer|
318
+ check_error_code Lib.wdeGetTagName(element_pointer, string_pointer),
319
+ "Unable to get tag name"
320
+ end
321
+ end
322
+
323
+ def getElementAttribute(element_pointer, name)
324
+ create_string do |string_pointer|
325
+ check_error_code Lib.wdeGetAttribute(element_pointer, wstring_ptr(name), string_pointer),
326
+ "Unable to get attribute #{name.inspect}"
327
+ end
328
+ end
329
+
330
+ def getElementValue(element_pointer)
331
+ getElementAttribute(element_pointer, 'value').gsub("\r\n", "\n")
332
+ end
333
+
334
+ def getElementText(element_pointer)
335
+ create_string do |string_pointer|
336
+ check_error_code Lib.wdeGetText(element_pointer, string_pointer),
337
+ "Unable to get text"
338
+ end.gsub("\r\n", "\n")
339
+ end
340
+
341
+ def sendKeysToElement(element_pointer, string)
342
+ check_error_code Lib.wdeSendKeys(element_pointer, wstring_ptr(string)),
343
+ "Unable to send keys to #{self}"
344
+ waitForLoadToComplete
345
+ end
346
+
347
+ def clearElement(element_pointer)
348
+ check_error_code Lib.wdeClear(element_pointer), "Unable to clear element"
349
+ end
350
+
351
+ def isElementEnabled(element_pointer)
352
+ int_ptr = FFI::MemoryPointer.new(:int)
353
+ check_error_code Lib.wdeIsEnabled(element_pointer, int_ptr),
354
+ "Unable to get enabled state"
355
+
356
+ int_ptr.get_int(0) == 1
357
+ ensure
358
+ int_ptr.free
359
+ end
360
+
361
+ def isElementSelected(element_pointer)
362
+ int_ptr = FFI::MemoryPointer.new(:int)
363
+ check_error_code Lib.wdeIsSelected(element_pointer, int_ptr),
364
+ "Unable to get selected state"
365
+
366
+ int_ptr.get_int(0) == 1
367
+ ensure
368
+ int_ptr.free
369
+ end
370
+
371
+ def isElementDisplayed(element_pointer)
372
+ int_ptr = FFI::MemoryPointer.new :int
373
+ check_error_code Lib.wdeIsDisplayed(element_pointer, int_ptr), "Unable to check visibilty"
374
+
375
+ int_ptr.get_int(0) == 1;
376
+ ensure
377
+ int_ptr.free
378
+ end
379
+
380
+ def submitElement(element_pointer)
381
+ check_error_code Lib.wdeSubmit(element_pointer), "Unable to submit element"
382
+ end
383
+
384
+ def toggleElement(element_pointer)
385
+ int_ptr = FFI::MemoryPointer.new :int
386
+ result = Lib.wdeToggle(element_pointer, int_ptr)
387
+
388
+ if result == 9
389
+ raise WebDriver::UnsupportedOperationError,
390
+ "You may not toggle this element: #{get_element_tag_name(element_pointer)}"
391
+ end
392
+
393
+ check_error_code result, "Unable to toggle element"
394
+
395
+ int_ptr.get_int(0) == 1
396
+ ensure
397
+ int_ptr.free
398
+ end
399
+
400
+ def setElementSelected(element_pointer)
401
+ check_error_code Lib.wdeSetSelected(element_pointer), "Unable to select element"
402
+ end
403
+
404
+ def getElementValueOfCssProperty(element_pointer, prop)
405
+ create_string do |string_pointer|
406
+ check_error_code Lib.wdeGetValueOfCssProperty(element_pointer, wstring_ptr(prop), string_pointer),
407
+ "Unable to get value of css property: #{prop.inspect}"
408
+ end
409
+ end
410
+
411
+ def hoverOverElement
412
+ raise NotImplementedError
413
+ end
414
+
415
+ def dragElement(element_pointer, right_by, down_by)
416
+ # TODO: check return values?
417
+ hwnd = FFI::MemoryPointer.new :pointer
418
+ x, y, width, height = Array.new(4) { FFI::MemoryPointer.new :long }
419
+
420
+ check_error_code Lib.wdeGetDetailsOnceScrolledOnToScreen(element_pointer, hwnd, x, y, width, height),
421
+ "Unable to determine location once scrolled on to screen"
422
+
423
+ Lib.wdeMouseDownAt(hwnd.get_pointer(0), x.get_long(0), y.get_long(0))
424
+
425
+ destination_x = x.get_long(0) + right_by
426
+ destination_y = y.get_long(0) + down_by
427
+ duration = 500 # TODO: parent.manage().getSpeed().getTimeOut();
428
+
429
+ Lib.wdeMouseMoveTo(hwnd.get_pointer(0), duration, x.get_long(0), y.get_long(0), destination_x, destination_y)
430
+ Lib.wdeMouseUpAt(hwnd.get_pointer(0), destination_x, destination_y)
431
+ ensure
432
+ [hwnd, x, y, width, height].each { |pointer| pointer.free }
433
+ end
434
+
435
+ def getElementLocation(element_pointer)
436
+ x = FFI::MemoryPointer.new :long
437
+ y = FFI::MemoryPointer.new :long
438
+
439
+ check_error_code Lib.wdeGetLocation(element_pointer, x, y), "Unable to get location of element"
440
+
441
+ Point.new x.get_int(0), y.get_int(0)
442
+ ensure
443
+ x.free
444
+ y.free
445
+ end
446
+
447
+ def getElementSize(element_pointer)
448
+ width = FFI::MemoryPointer.new :long
449
+ height = FFI::MemoryPointer.new :long
450
+
451
+ check_error_code Lib.wdeGetSize(element_pointer, width, height), "Unable to get size of element"
452
+
453
+ Dimension.new width.get_int(0), height.get_int(0)
454
+ ensure
455
+ width.free
456
+ height.free
457
+ end
458
+
459
+ def finalize(element_pointer)
460
+ check_error_code Lib.wdeFreeElement(element_pointer),
461
+ "Unable to finalize #{element_pointer} for #{self}"
462
+ end
463
+
464
+ private
465
+
466
+ def populate_arguments(result, args_pointer, args)
467
+ args.each do |arg|
468
+ case arg
469
+ when String
470
+ result = Lib.wdAddStringScriptArg(args_pointer, wstring_ptr(arg))
471
+ when TrueClass, FalseClass, NilClass
472
+ result = Lib.wdAddBooleanScriptArg(args_pointer, arg == true ? 1 : 0)
473
+ when Float
474
+ result = Lib.wdAddDoubleScriptArg(args_pointer, arg)
475
+ when Integer
476
+ result = Lib.wdAddNumberScriptArg(args_pointer, arg)
477
+ when WebDriver::Element
478
+ result = Lib.wdAddElementScriptArg(args_pointer, arg.ref)
479
+ else
480
+ raise TypeError, "Parameter is not of recognized type: #{arg.inspect}:#{arg.class}"
481
+ end
482
+
483
+ check_error_code result, "Unable to add argument: #{arg.inspect}"
484
+ end
485
+
486
+
487
+ result
488
+ end
489
+
490
+ def extract_return_value(pointer_ref)
491
+ result, returned = nil
492
+ pointers_to_free = []
493
+ script_result = pointer_ref.get_pointer(0)
494
+
495
+ pointers_to_free << type_pointer = FFI::MemoryPointer.new(:int)
496
+ result = Lib.wdGetScriptResultType(script_result, type_pointer)
497
+
498
+ check_error_code result, "Cannot determine result type"
499
+
500
+ case type_pointer.get_int(0)
501
+ when 1
502
+ create_string do |wrapper|
503
+ check_error_code Lib.wdGetStringScriptResult(script_result, wrapper), "Cannot extract string result"
504
+ end
505
+ when 2
506
+ pointers_to_free << long_pointer = FFI::MemoryPointer.new(:long)
507
+ check_error_code Lib.wdGetNumberScriptResult(script_result, long_pointer),
508
+ "Cannot extract number result"
509
+
510
+ long_pointer.get_long(0)
511
+ when 3
512
+ pointers_to_free << int_pointer = FFI::MemoryPointer.new(:int)
513
+ check_error_code Lib.wdGetBooleanScriptResult(script_result, int_pointer),
514
+ "Cannot extract boolean result"
515
+
516
+ int_pointer.get_int(0) == 1
517
+ when 4
518
+ element_pointer = FFI::MemoryPointer.new(:pointer)
519
+ check_error_code Lib.wdGetElementScriptResult(script_result, @driver_pointer, element_pointer),
520
+ "Cannot extract element result"
521
+
522
+ Element.new(self, element_pointer.get_pointer(0))
523
+ when 5
524
+ nil
525
+ when 6
526
+ message = create_string do |string_pointer|
527
+ check_error_code Lib.wdGetStringScriptResult(script_result, string_pointer), "Cannot extract string result"
528
+ end
529
+
530
+ raise WebDriverError, message
531
+ when 7
532
+ pointers_to_free << double_pointer = FFI::MemoryPointer.new(:double)
533
+ check_error_code Lib.wdGetDoubleScriptResult(script_result, double_pointer), "Cannot extract double result"
534
+
535
+ double_pointer.get_double(0)
536
+ else
537
+ raise WebDriverError, "Cannot determine result type"
538
+ end
539
+ ensure
540
+ Lib.wdFreeScriptResult(script_result) if script_result
541
+ pointers_to_free.each { |p| p.free }
542
+ end
543
+
544
+ def check_error_code(code, message)
545
+ e = WebDriver::Error.for_code(code)
546
+ raise e, "#{message} (#{code})" if e
547
+ end
548
+
549
+ end # Bridge
550
+ end # IE
551
+ end # WebDriver
552
+ end # Selenium