selenium-webdriver 0.0.1

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