selenium-webdriver 0.0.17 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
  2. data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
  3. data/chrome/src/extension/background.js +64 -48
  4. data/chrome/src/extension/content_script.js +253 -132
  5. data/chrome/src/extension/manifest-nonwin.json +1 -1
  6. data/chrome/src/extension/manifest-win.json +1 -1
  7. data/chrome/src/extension/utils.js +8 -8
  8. data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +9 -0
  9. data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +38 -280
  10. data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +119 -117
  11. data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +36 -26
  12. data/common/src/js/abstractcommandprocessor.js +9 -11
  13. data/common/src/js/command.js +159 -83
  14. data/common/src/js/core/RemoteRunner.html +2 -2
  15. data/common/src/js/core/TestRunner-splash.html +3 -3
  16. data/common/src/js/core/TestRunner.html +5 -17
  17. data/common/src/js/core/scripts/htmlutils.js +4208 -2506
  18. data/common/src/js/core/scripts/selenium-api.js +2 -2
  19. data/common/src/js/core/scripts/selenium-browserbot.js +66 -58
  20. data/common/src/js/core/scripts/selenium-version.js +1 -1
  21. data/common/src/js/localcommandprocessor.js +5 -19
  22. data/common/src/js/testcase.js +2 -0
  23. data/common/src/js/webdriver.js +63 -93
  24. data/common/src/js/webelement.js +40 -42
  25. data/common/src/rb/lib/selenium/webdriver.rb +23 -14
  26. data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +8 -35
  27. data/common/src/rb/lib/selenium/webdriver/child_process.rb +2 -0
  28. data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +1 -0
  29. data/common/src/rb/lib/selenium/webdriver/core_ext/string.rb +5 -0
  30. data/common/src/rb/lib/selenium/webdriver/driver.rb +20 -15
  31. data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +7 -2
  32. data/common/src/rb/lib/selenium/webdriver/element.rb +11 -2
  33. data/common/src/rb/lib/selenium/webdriver/error.rb +9 -5
  34. data/common/src/rb/lib/selenium/webdriver/keys.rb +1 -2
  35. data/common/src/rb/lib/selenium/webdriver/navigation.rb +16 -0
  36. data/common/src/rb/lib/selenium/webdriver/options.rb +32 -0
  37. data/common/src/rb/lib/selenium/webdriver/platform.rb +17 -1
  38. data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
  39. data/firefox/src/extension/components/dispatcher.js +492 -0
  40. data/firefox/src/extension/components/driver-component.js +4 -1
  41. data/firefox/src/extension/components/errorcode.js +70 -0
  42. data/firefox/src/extension/components/firefoxDriver.js +173 -154
  43. data/firefox/src/extension/components/nsCommandProcessor.js +171 -132
  44. data/firefox/src/extension/components/promptService.js +5 -5
  45. data/firefox/src/extension/components/request.js +219 -0
  46. data/firefox/src/extension/components/response.js +276 -0
  47. data/firefox/src/extension/components/session.js +281 -0
  48. data/firefox/src/extension/components/sessionstore.js +226 -0
  49. data/firefox/src/extension/components/socketListener.js +350 -100
  50. data/firefox/src/extension/components/utils.js +166 -98
  51. data/firefox/src/extension/components/webdriverserver.js +9 -5
  52. data/firefox/src/extension/components/wrappedElement.js +189 -166
  53. data/firefox/src/extension/install.rdf +1 -1
  54. data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +2 -0
  55. data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +39 -33
  56. data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +7 -421
  57. data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +7 -64
  58. data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +2 -3
  59. data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +54 -10
  60. data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +2 -0
  61. data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +6 -0
  62. data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
  63. data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
  64. data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +2 -0
  65. data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +38 -13
  66. data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +9 -2
  67. data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +5 -0
  68. data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +2 -0
  69. data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +42 -38
  70. data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +56 -47
  71. data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +26 -26
  72. data/remote/client/src/rb/lib/selenium/webdriver/remote/patron_http_client.rb +58 -0
  73. data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +10 -12
  74. data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +2 -17
  75. metadata +44 -23
  76. data/common/src/js/context.js +0 -58
  77. data/firefox/src/extension/components/context.js +0 -37
@@ -4,7 +4,7 @@
4
4
  <Description about="urn:mozilla:install-manifest">
5
5
  <em:id>fxdriver@googlecode.com</em:id>
6
6
  <em:name>Firefox WebDriver</em:name>
7
- <em:version>2.0a2</em:version>
7
+ <em:version>2.0a3</em:version>
8
8
  <em:description>WebDriver implementation for Firefox</em:description>
9
9
  <em:creator>Simon Stewart</em:creator>
10
10
 
@@ -11,6 +11,8 @@ require "selenium/webdriver/firefox/bridge"
11
11
 
12
12
  module Selenium
13
13
  module WebDriver
14
+
15
+ # @private
14
16
  module Firefox
15
17
 
16
18
  DEFAULT_PROFILE_NAME = "WebDriver".freeze
@@ -1,11 +1,12 @@
1
1
  module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
+
5
+ # @private
4
6
  class Binary
5
7
 
6
8
  def initialize
7
9
  ENV['MOZ_NO_REMOTE'] = '1' # able to launch multiple instances
8
- check_binary_exists
9
10
  end
10
11
 
11
12
  def create_base_profile(name)
@@ -16,7 +17,6 @@ module Selenium
16
17
  _, status = wait
17
18
  end
18
19
 
19
-
20
20
  if status && status.to_i != 0
21
21
  raise Error::WebDriverError, "could not create base profile: (exit status: #{status})"
22
22
  end
@@ -29,7 +29,7 @@ module Selenium
29
29
  end
30
30
 
31
31
  def execute(*extra_args)
32
- args = [path, "-no-remote", "--verbose"] + extra_args
32
+ args = [self.class.path, "-no-remote", "--verbose"] + extra_args
33
33
  @process = ChildProcess.new(*args).start
34
34
  end
35
35
 
@@ -63,43 +63,49 @@ module Selenium
63
63
 
64
64
  private
65
65
 
66
- def path
67
- @path ||= case Platform.os
68
- when :macosx
69
- "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
70
- when :windows
71
- windows_path
72
- when :linux, :unix
73
- "/usr/bin/firefox"
74
- else
75
- raise "Unknown platform: #{Platform.os}"
76
- end
77
- end
66
+ class << self
67
+ def path
68
+ @path ||= case Platform.os
69
+ when :macosx
70
+ "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
71
+ when :windows
72
+ windows_path
73
+ when :linux, :unix
74
+ Platform.find_binary("firefox3", "firefox2", "firefox") || "/usr/bin/firefox"
75
+ else
76
+ raise "Unknown platform: #{Platform.os}"
77
+ end
78
+
79
+ unless File.file?(@path)
80
+ raise Error::WebDriverError, "Could not find Firefox binary. Make sure Firefox is installed (OS: #{Platform.os})"
81
+ end
78
82
 
79
- def check_binary_exists
80
- unless File.file?(path)
81
- raise Error::WebDriverError, "Could not find Firefox binary. Make sure Firefox is installed (OS: #{Platform.os})"
83
+ @path
82
84
  end
83
- end
84
85
 
85
- def windows_path
86
- windows_registry_path || (ENV['PROGRAMFILES'] || "\\Program Files") + "\\Mozilla Firefox\\firefox.exe"
87
- end
86
+ private
87
+
88
+ def windows_path
89
+ windows_registry_path || "#{ ENV['PROGRAMFILES'] || "\\Program Files" }\\Mozilla Firefox\\firefox.exe"
90
+ end
88
91
 
89
- def windows_registry_path
90
- return if Platform.jruby? || Platform.ironruby?
91
- require "win32/registry"
92
+ def windows_registry_path
93
+ require "win32/registry"
92
94
 
93
- lm = Win32::Registry::HKEY_LOCAL_MACHINE
94
- lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
95
- main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
96
- if entry = main.find {|key, type, data| key =~ /pathtoexe/i}
97
- return entry.last
95
+ lm = Win32::Registry::HKEY_LOCAL_MACHINE
96
+ lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
97
+ main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
98
+ if entry = main.find {|key, type, data| key =~ /pathtoexe/i}
99
+ return entry.last
100
+ end
98
101
  end
102
+ rescue LoadError
103
+ # older JRuby or IronRuby does not have win32/registry
104
+ nil
105
+ rescue Win32::Registry::Error
106
+ raise Error::WebDriverError, "Firefox not found in the Windows registry. Make sure Firefox is installed"
99
107
  end
100
- rescue Win32::Registry::Error
101
- raise Error::WebDriverError, "Firefox not found in Windows registry, please make sure you have it installed."
102
- end
108
+ end # class << self
103
109
 
104
110
  end # Binary
105
111
  end # Firefox
@@ -1,8 +1,9 @@
1
1
  module Selenium
2
2
  module WebDriver
3
3
  module Firefox
4
- class Bridge
5
- include BridgeHelper
4
+
5
+ # @private
6
+ class Bridge < Remote::Bridge
6
7
 
7
8
  def initialize(opts = {})
8
9
  @binary = Binary.new
@@ -17,8 +18,7 @@ module Selenium
17
18
  end
18
19
 
19
20
  @launcher.launch
20
- @connection = @launcher.connection
21
- @context = newSession
21
+ super :url => @launcher.connection.url, :desired_capabilities => :firefox
22
22
  end
23
23
 
24
24
  def browser
@@ -30,125 +30,14 @@ module Selenium
30
30
  end
31
31
 
32
32
  def quit
33
- @connection.quit
33
+ super
34
34
  @binary.wait rescue nil # might raise on windows
35
35
 
36
36
  nil
37
37
  end
38
38
 
39
- def getPageSource
40
- execute :getPageSource
41
- end
42
-
43
- def refresh
44
- execute :refresh
45
- end
46
-
47
- def getWindowHandles
48
- execute :getWindowHandles
49
- end
50
-
51
- def getCurrentWindowHandle
52
- execute :getCurrentWindowHandle
53
- end
54
-
55
- def getScreenshotAsBase64
56
- execute :getScreenshotAsBase64
57
- end
58
-
59
- def get(url)
60
- execute :get,
61
- :parameters => [url]
62
- end
63
-
64
- def close
65
- execute :close
66
- # TODO: rescue ?
67
- end
68
-
69
- def goBack
70
- execute :goBack
71
- end
72
-
73
- def goForward
74
- execute :goForward
75
- end
76
-
77
- def getCurrentUrl
78
- execute :getCurrentUrl
79
- end
80
-
81
- def getTitle
82
- execute :title
83
- end
84
-
85
- def executeScript(string, *args)
86
- typed_args = args.map { |e| wrap_script_argument(e) }
87
-
88
- resp = raw_execute :executeScript, :parameters => [string, typed_args]
89
- raise TypeError, "expected Hash" unless resp.kind_of? Hash
90
-
91
- unwrap_script_argument resp["response"]
92
- end
93
-
94
- #
95
- # Finders - TODO: should be shared with Chrome::Bridge
96
- #
97
-
98
- def findElementByClassName(parent, class_name)
99
- find_element_by 'class name', class_name, parent
100
- end
101
-
102
- def findElementsByClassName(parent, class_name)
103
- find_elements_by 'class name', class_name, parent
104
- end
105
-
106
- def findElementById(parent, id)
107
- find_element_by 'id', id, parent
108
- end
109
-
110
- def findElementsById(parent, id)
111
- find_elements_by 'id', id, parent
112
- end
113
-
114
- def findElementByLinkText(parent, link_text)
115
- find_element_by 'link text', link_text, parent
116
- end
117
-
118
- def findElementsByLinkText(parent, link_text)
119
- find_elements_by 'link text', link_text, parent
120
- end
121
-
122
- def findElementByPartialLinkText(parent, link_text)
123
- find_element_by 'partial link text', link_text, parent
124
- end
125
-
126
- def findElementsByPartialLinkText(parent, link_text)
127
- find_elements_by 'partial link text', link_text, parent
128
- end
129
-
130
- def findElementByName(parent, name)
131
- find_element_by 'name', name, parent
132
- end
133
-
134
- def findElementsByName(parent, name)
135
- find_elements_by 'name', name, parent
136
- end
137
-
138
- def findElementByTagName(parent, tag_name)
139
- find_element_by 'tag name', tag_name, parent
140
- end
141
-
142
- def findElementsByTagName(parent, tag_name)
143
- find_elements_by 'tag name', tag_name, parent
144
- end
145
-
146
- def findElementByXpath(parent, xpath)
147
- find_element_by 'xpath', xpath, parent
148
- end
149
-
150
- def findElementsByXpath(parent, xpath)
151
- find_elements_by 'xpath', xpath, parent
39
+ def getScreenshot
40
+ execute :screenshot
152
41
  end
153
42
 
154
43
  def findElementByCssSelector(parent, selector)
@@ -159,309 +48,6 @@ module Selenium
159
48
  find_elements_by 'css selector', selector, parent
160
49
  end
161
50
 
162
- #
163
- # Element functions
164
- #
165
-
166
- def clickElement(element)
167
- # execute :clickElement, :element_id => element
168
- execute :click,
169
- :element_id => element
170
- end
171
-
172
- def getElementTagName(element)
173
- # execute :getElementTagName, :element_id => element
174
- execute :getTagName,
175
- :element_id => element
176
- end
177
-
178
- def getElementAttribute(element, name)
179
- # execute :getElementAttribute, :element_id => element, :parameters => [name]
180
- execute :getAttribute,
181
- :element_id => element,
182
- :parameters => [name]
183
- end
184
-
185
- def getElementValue(element)
186
- # execute :getElementValue, :element_id => element
187
- execute :getValue,
188
- :element_id => element
189
- end
190
-
191
- def getElementText(element)
192
- # execute :getElementText, :element_id => element
193
- execute :getText,
194
- :element_id => element
195
- end
196
-
197
- def getElementLocation(element)
198
- # data = execute :getElementLocation, :element_id => element
199
- data = execute :getLocation,
200
- :element_id => element
201
-
202
- Point.new data["x"], data["y"]
203
- end
204
-
205
- def getElementSize(element)
206
- # execute :getElementSize, :element_id => element
207
- data = execute :getSize,
208
- :element_id => element
209
-
210
- Dimension.new data['width'], data['height']
211
- end
212
-
213
- def sendKeysToElement(element, string)
214
- # execute :sendKeysToElement, :element_id => element, :parameters => [string.split(//u)]
215
- execute :sendKeys,
216
- :element_id => element,
217
- :parameters => [string.to_s]
218
- end
219
-
220
- def clearElement(element)
221
- # execute :clearElement, :element_id => element
222
- execute :clear,
223
- :element_id => element
224
- end
225
-
226
- def isElementEnabled(element)
227
- # execute :isElementEnabled, :element_id => element
228
- !getElementAttribute(element, "disabled")
229
- end
230
-
231
- def isElementSelected(element)
232
- # execute :isElementSelected, :element_id => element
233
- execute :isSelected,
234
- :element_id => element
235
- end
236
-
237
- def isElementDisplayed(element)
238
- # execute :isElementDisplayed, :element_id => element
239
- execute :isDisplayed,
240
- :element_id => element
241
- end
242
-
243
- def submitElement(element)
244
- # execute :submitElement, :element_id => element
245
- execute :submit,
246
- :element_id => element
247
- end
248
-
249
- def toggleElement(element)
250
- # execute :toggleElement, :element_id => element
251
- execute :toggle,
252
- :element_id => element
253
- end
254
-
255
- def setElementSelected(element)
256
- # execute :setElementSelected, :element_id => element
257
- execute :setSelected,
258
- :element_id => element
259
- end
260
-
261
- def getElementValueOfCssProperty(element, prop)
262
- # execute :getElementValueOfCssProperty, :element_id => element, :parameters => [prop]
263
- execute :getValueOfCssProperty,
264
- :element_id => element,
265
- :parameters => [prop]
266
- end
267
-
268
- def hoverOverElement(element)
269
- execute :hover,
270
- :element_id => element
271
- # execute :hoverOverElement, :element_id => element
272
- end
273
-
274
- def dragElement(element, rigth_by, down_by)
275
- execute :dragElement,
276
- :element_id => element,
277
- :parameters => [rigth_by, down_by]
278
- end
279
-
280
-
281
- def setSpeed(speed)
282
- pixel_speed = case speed
283
- when "SLOW" then '1'
284
- when "MEDIUM" then '10'
285
- when "FAST" then '100'
286
- else
287
- raise ArgumentError, "unknown speed: #{speed.inspect}"
288
- end
289
-
290
- execute :setMouseSpeed,
291
- :parameters => [pixel_speed]
292
- end
293
-
294
- def getSpeed
295
- case execute(:getMouseSpeed)
296
- when '1' then "SLOW"
297
- when '10' then "MEDIUM"
298
- when '100' then "FAST"
299
- else
300
- "FAST"
301
- end
302
- end
303
-
304
- def addCookie(cookie)
305
- execute :addCookie,
306
- :parameters => [cookie.to_json] # uhm, sending text instead of data
307
- end
308
-
309
- def deleteCookie(name)
310
- execute :deleteCookie,
311
- :parameters => [{:name => name}.to_json] # ditto
312
- end
313
-
314
- def getAllCookies
315
- data = execute :getCookie
316
- data.map do |c|
317
- parse_cookie_string(c) unless c.strip.empty?
318
- end.compact
319
- end
320
-
321
- #
322
- # FF-specific?
323
- #
324
-
325
- def deleteAllCookies
326
- execute :deleteAllCookies
327
- end
328
-
329
- def getCookieNamed(name)
330
- getCookies.find { |c| c['name'] == name }
331
- end
332
-
333
- def switchToFrame(name)
334
- execute :switchToFrame,
335
- :parameters => [name.to_s]
336
- end
337
-
338
- def switchToDefaultContent
339
- execute :switchToDefaultContent
340
- end
341
-
342
- def switchToWindow(name)
343
- @context = execute :switchToWindow,
344
- :parameters => [name.to_s]
345
- end
346
-
347
- def switchToActiveElement
348
- Element.new self, element_id_from(execute(:switchToActiveElement))
349
- end
350
- alias_method :getActiveElement, :switchToActiveElement
351
-
352
- private
353
-
354
- def find_element_by(how, what, parent = nil)
355
- if parent
356
- id = execute :findChildElement,
357
- :parameters => [{:id => parent, :using => how, :value => what}]
358
- else
359
- id = execute :findElement,
360
- :parameters => [how, what]
361
- end
362
-
363
- Element.new self, element_id_from(id)
364
- end
365
-
366
- def find_elements_by(how, what, parent = nil)
367
- if parent
368
- id_string = execute :findChildElements,
369
- :parameters => [{:id => parent, :using => how, :value => what}]
370
- else
371
- id_string = execute :findElements,
372
- :parameters => [how, what]
373
- end
374
-
375
- id_string.map { |id| Element.new self, element_id_from(id) }
376
- end
377
-
378
- def newSession
379
- execute :newSession
380
- end
381
-
382
- def execute(*args)
383
- raw_execute(*args)['response']
384
- end
385
-
386
- def raw_execute(command, opts = {})
387
- request = {:commandName => command, :context => @context.to_s}
388
-
389
- if eid = opts[:element_id]
390
- request[:elementId] = eid
391
- end
392
-
393
- if params = opts[:parameters]
394
- request[:parameters] = params
395
- end
396
-
397
- puts "--> #{request.inspect}" if $DEBUG
398
-
399
- @connection.send_string request.to_json
400
- resp = @connection.read_response
401
-
402
- puts "<-- #{resp.inspect}" if $DEBUG
403
-
404
- if resp['isError']
405
- case resp['response']
406
- when String
407
- msg = resp['response']
408
- when Hash
409
- msg = resp['response']['message']
410
- end
411
-
412
- msg ||= resp.inspect
413
- raise Error::WebDriverError, msg
414
- end
415
-
416
- if ctx = resp['context']
417
- @context = ctx
418
- end
419
-
420
- resp
421
- end
422
-
423
- #
424
- # wrap/unwrap will be shared with Chrome (overrides BridgeHelper for now)
425
- #
426
-
427
- def wrap_script_argument(arg)
428
- case arg
429
- when Integer, Float
430
- { :type => "NUMBER", :value => arg }
431
- when TrueClass, FalseClass, NilClass
432
- { :type => "BOOLEAN", :value => !!arg }
433
- when Element
434
- { :type => "ELEMENT", :value => arg.ref }
435
- when String
436
- { :type => "STRING", :value => arg.to_s }
437
- when Array # Enumerable?
438
- arg.map { |e| wrap_script_argument(e) }
439
- else
440
- raise TypeError, "Parameter is not of recognized type: #{arg.inspect}:#{arg.class}"
441
- end
442
- end
443
-
444
- def unwrap_script_argument(arg)
445
- raise TypeError, "expected Hash" unless arg.kind_of? Hash
446
- case arg["type"]
447
- when "NULL"
448
- nil
449
- when "ELEMENT"
450
- Element.new self, element_id_from(arg["value"])
451
- when "ARRAY"
452
- arg['value'].map { |e| unwrap_script_argument(e) }
453
- # when "POINT"
454
- # Point.new arg['x'], arg['y']
455
- # when "DIMENSION"
456
- # Dimension.new arg['width'], arg['height']
457
- # when "COOKIE"
458
- # {:name => arg['name'], :value => arg['value']}
459
- else
460
- arg["value"]
461
- end
462
- end
463
-
464
-
465
51
  end # Bridge
466
52
  end # Firefox
467
53
  end # WebDriver