rainux-selenium-webdriver 0.0.17

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