rainux-selenium-webdriver 0.0.17

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