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.
- data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
- data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
- data/chrome/src/extension/background.html +9 -0
- data/chrome/src/extension/background.js +933 -0
- data/chrome/src/extension/content_script.js +1286 -0
- data/chrome/src/extension/manifest-nonwin.json +15 -0
- data/chrome/src/extension/manifest-win.json +16 -0
- data/chrome/src/extension/toolstrip.html +28 -0
- data/chrome/src/extension/utils.js +196 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +324 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +70 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +119 -0
- data/common/src/js/abstractcommandprocessor.js +161 -0
- data/common/src/js/asserts.js +296 -0
- data/common/src/js/by.js +147 -0
- data/common/src/js/command.js +274 -0
- data/common/src/js/context.js +58 -0
- data/common/src/js/extension/README +2 -0
- data/common/src/js/extension/dommessenger.js +152 -0
- data/common/src/js/factory.js +55 -0
- data/common/src/js/future.js +118 -0
- data/common/src/js/key.js +117 -0
- data/common/src/js/localcommandprocessor.js +181 -0
- data/common/src/js/logging.js +249 -0
- data/common/src/js/testrunner.js +605 -0
- data/common/src/js/timing.js +89 -0
- data/common/src/js/wait.js +199 -0
- data/common/src/js/webdriver.js +853 -0
- data/common/src/js/webelement.js +683 -0
- data/common/src/rb/lib/selenium-webdriver.rb +1 -0
- data/common/src/rb/lib/selenium/webdriver.rb +52 -0
- data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +88 -0
- data/common/src/rb/lib/selenium/webdriver/child_process.rb +85 -0
- data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
- data/common/src/rb/lib/selenium/webdriver/driver.rb +128 -0
- data/common/src/rb/lib/selenium/webdriver/element.rb +126 -0
- data/common/src/rb/lib/selenium/webdriver/error.rb +68 -0
- data/common/src/rb/lib/selenium/webdriver/find.rb +69 -0
- data/common/src/rb/lib/selenium/webdriver/navigation.rb +23 -0
- data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
- data/common/src/rb/lib/selenium/webdriver/platform.rb +82 -0
- data/common/src/rb/lib/selenium/webdriver/target_locator.rb +23 -0
- data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
- data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
- data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
- data/firefox/src/extension/chrome.manifest +3 -0
- data/firefox/src/extension/components/context.js +37 -0
- data/firefox/src/extension/components/driver-component.js +127 -0
- data/firefox/src/extension/components/firefoxDriver.js +706 -0
- data/firefox/src/extension/components/json2.js +273 -0
- data/firefox/src/extension/components/keytest.html +554 -0
- data/firefox/src/extension/components/nsCommandProcessor.js +586 -0
- data/firefox/src/extension/components/screenshooter.js +70 -0
- data/firefox/src/extension/components/socketListener.js +185 -0
- data/firefox/src/extension/components/utils.js +1200 -0
- data/firefox/src/extension/components/webLoadingListener.js +57 -0
- data/firefox/src/extension/components/webdriverserver.js +101 -0
- data/firefox/src/extension/components/wrappedElement.js +609 -0
- data/firefox/src/extension/content/fxdriver.xul +30 -0
- data/firefox/src/extension/content/server.js +95 -0
- data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
- data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
- data/firefox/src/extension/install.rdf +29 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +21 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +86 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +426 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +82 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +132 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +174 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +60 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
- data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +552 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +94 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +374 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +43 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
- 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
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|