selenium-webdriver 0.0.17 → 0.0.18

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 (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
@@ -1,21 +1,25 @@
1
1
  require "tmpdir"
2
2
  require "fileutils"
3
3
 
4
- def have_yajl?
5
- require "yajl/json_gem"
6
- true
7
- rescue LoadError
8
- false
9
- end
4
+ have_yajl = lambda {
5
+ begin
6
+ require "yajl/json_gem"
7
+ true
8
+ rescue LoadError
9
+ false
10
+ end
11
+ }
10
12
 
11
- def have_json?
12
- require "json"
13
- true
14
- rescue LoadError
15
- false
16
- end
13
+ have_json = lambda {
14
+ begin
15
+ require "json"
16
+ true
17
+ rescue LoadError
18
+ false
19
+ end
20
+ }
17
21
 
18
- unless have_yajl? || have_json?
22
+ unless have_yajl.call || have_json.call
19
23
  raise LoadError, <<-END
20
24
 
21
25
  You need to require rubygems or install one of these gems:
@@ -30,6 +34,7 @@ end
30
34
 
31
35
 
32
36
  require "selenium/webdriver/core_ext/dir"
37
+ require "selenium/webdriver/core_ext/string"
33
38
  require "selenium/webdriver/error"
34
39
  require "selenium/webdriver/platform"
35
40
  require "selenium/webdriver/child_process"
@@ -46,7 +51,7 @@ require "selenium/webdriver/element"
46
51
  module Selenium
47
52
  module WebDriver
48
53
  Point = Struct.new(:x, :y)
49
- Dimension = Struct.new(:width, :heigth)
54
+ Dimension = Struct.new(:width, :height)
50
55
 
51
56
  autoload :IE, 'selenium/webdriver/ie'
52
57
  autoload :Remote, 'selenium/webdriver/remote'
@@ -57,6 +62,10 @@ module Selenium
57
62
  @root ||= File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", ".."))
58
63
  end
59
64
 
65
+ #
66
+ # @see Selenium::WebDriver::Driver.for
67
+ #
68
+
60
69
  def self.for(*args)
61
70
  WebDriver::Driver.for(*args)
62
71
  end
@@ -4,52 +4,25 @@ module Selenium
4
4
  #
5
5
  # Shared across bridges
6
6
  #
7
+ # @private
8
+ #
7
9
 
8
10
  module BridgeHelper
9
11
 
10
- def wrap_script_argument(arg)
11
- case arg
12
- when Integer, Float
13
- { :type => "NUMBER", :value => arg }
14
- when TrueClass, FalseClass, NilClass
15
- { :type => "BOOLEAN", :value => !!arg }
16
- when Element
17
- { :type => "ELEMENT", :value => arg.ref }
18
- when String
19
- { :type => "STRING", :value => arg.to_s }
20
- when Array # Enumerable?
21
- arg.map { |e| wrap_script_argument(e) }
22
- else
23
- raise TypeError, "Parameter is not of recognized type: #{arg.inspect}:#{arg.class}"
24
- end
25
- end
26
-
27
- def unwrap_script_argument(arg)
12
+ def unwrap_script_result(arg)
28
13
  if arg.kind_of?(Array)
29
- arg.map { |e| unwrap_script_argument(e) }
14
+ arg.map { |e| unwrap_script_result(e) }
30
15
  else
31
- case arg["type"]
32
- when "NULL"
33
- nil
34
- when "ELEMENT"
35
- Element.new self, element_id_from(arg["value"])
36
- when "POINT"
37
- Point.new arg['x'], arg['y']
38
- when "DIMENSION"
39
- Dimension.new arg['width'], arg['height']
40
- when "COOKIE"
41
- {:name => arg['name'], :value => arg['value']}
16
+ if arg.kind_of?(Hash) && arg.member?("ELEMENT")
17
+ Element.new self, element_id_from(arg)
42
18
  else
43
- arg["value"]
19
+ arg
44
20
  end
45
21
  end
46
22
  end
47
23
 
48
24
  def element_id_from(id)
49
- str = id.kind_of?(Array) ? id.first : id
50
- after = str.split("/").last
51
-
52
- after
25
+ id['ELEMENT']
53
26
  end
54
27
 
55
28
  def parse_cookie_string(str)
@@ -4,6 +4,8 @@ module Selenium
4
4
  #
5
5
  # Cross platform child process launcher
6
6
  #
7
+ # @private
8
+ #
7
9
 
8
10
  class ChildProcess
9
11
  attr_reader :pid
@@ -1,4 +1,5 @@
1
1
  class Dir
2
+ # @private
2
3
  def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
3
4
  case prefix_suffix
4
5
  when nil
@@ -0,0 +1,5 @@
1
+ unless '1.9'.respond_to?(:bytesize)
2
+ class String
3
+ alias :bytesize :size
4
+ end
5
+ end
@@ -20,46 +20,51 @@ module Selenium
20
20
  #
21
21
  # Create a new Driver instance with the correct bridge for the given browser
22
22
  #
23
- # @param browser [Symbol]
23
+ # @param browser [:ie, :internet_explorer, :remote, :chrome, :firefox, :ff]
24
24
  # the driver type to use
25
25
  # @param *rest
26
- # arguments passed to the Bridge.new
26
+ # arguments passed to Bridge.new
27
27
  #
28
28
  # @return [Driver]
29
29
  #
30
+ # @example
31
+ #
32
+ # Driver.for :firefox, :profile => "some-profile"
33
+ # Driver.for :firefox, :profile => Profile.new
34
+ # Driver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => caps
35
+ #
30
36
 
31
37
  def for(browser, *args)
32
38
  bridge = case browser
33
39
  when :ie, :internet_explorer
34
- WebDriver::IE::Bridge.new(*args)
40
+ IE::Bridge.new(*args)
35
41
  when :remote
36
- WebDriver::Remote::Bridge.new(*args)
42
+ Remote::Bridge.new(*args)
37
43
  when :chrome
38
- WebDriver::Chrome::Bridge.new(*args)
44
+ Chrome::Bridge.new(*args)
39
45
  when :firefox, :ff
40
- WebDriver::Firefox::Bridge.new(*args)
46
+ Firefox::Bridge.new(*args)
41
47
  else
42
48
  raise ArgumentError, "unknown driver: #{browser.inspect}"
43
49
  end
44
50
 
45
- driver = new(bridge)
46
-
47
- unless bridge.driver_extensions.empty?
48
- driver.extend(*bridge.driver_extensions)
49
- end
50
-
51
- driver
51
+ new(bridge)
52
52
  end
53
53
  end
54
54
 
55
55
  #
56
- # A new Driver instance
56
+ # A new Driver instance with the given bridge
57
57
  #
58
58
  # @api private
59
59
  #
60
60
 
61
61
  def initialize(bridge)
62
62
  @bridge = bridge
63
+
64
+ # TODO: refactor this away
65
+ unless @bridge.driver_extensions.empty?
66
+ extend(*@bridge.driver_extensions)
67
+ end
63
68
  end
64
69
 
65
70
  def inspect
@@ -240,7 +245,7 @@ module Selenium
240
245
  #
241
246
  # for Find
242
247
  #
243
- # @api private
248
+ # @private
244
249
  #
245
250
 
246
251
  def ref
@@ -1,5 +1,10 @@
1
1
  module Selenium
2
2
  module WebDriver
3
+
4
+ #
5
+ # @private
6
+ #
7
+
3
8
  module DriverExtensions
4
9
  module TakesScreenshot
5
10
 
@@ -10,9 +15,9 @@ module Selenium
10
15
  def screenshot_as(format)
11
16
  case format
12
17
  when :base64
13
- bridge.getScreenshotAsBase64
18
+ bridge.getScreenshot
14
19
  when :png
15
- bridge.getScreenshotAsBase64.unpack("m")[0]
20
+ bridge.getScreenshot.unpack("m")[0]
16
21
  else
17
22
  raise Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
18
23
  end
@@ -8,7 +8,7 @@ module Selenium
8
8
  #
9
9
  # Creates a new Element
10
10
  #
11
- # @api private
11
+ # @private
12
12
  #
13
13
 
14
14
  def initialize(bridge, id)
@@ -248,14 +248,23 @@ module Selenium
248
248
  #
249
249
  # for Find and execute_script
250
250
  #
251
- # @api private
251
+ # @private
252
252
  #
253
253
 
254
254
  def ref
255
255
  @id
256
256
  end
257
257
 
258
+ #
259
+ # Convert to a WebElement JSON Object for transmission over the wire.
260
+ # @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Basic_Concepts_And_Terms
261
+ #
262
+ # @private
263
+ #
258
264
 
265
+ def to_json(*args)
266
+ { :ELEMENT => @id }.to_json(*args)
267
+ end
259
268
 
260
269
  end # Element
261
270
  end # WebDriver
@@ -11,13 +11,13 @@ module Selenium
11
11
  class NoSuchDriverError < WebDriverError; end # 6
12
12
  class NoSuchElementError < WebDriverError; end # 7
13
13
  class NoSuchFrameError < WebDriverError; end # 8
14
- # NotImplementedError # 9 - just use Ruby's
14
+ class UnknownCommandError < WebDriverError; end # 9
15
15
  class ObsoleteElementError < WebDriverError; end # 10
16
16
  class ElementNotDisplayedError < WebDriverError; end # 11
17
17
  class ElementNotEnabledError < WebDriverError; end # 12
18
18
  class UnhandledError < WebDriverError; end # 13
19
19
  class ExpectedError < WebDriverError; end # 14
20
- class ElementNotSelectedError < WebDriverError; end # 15
20
+ class ElementNotSelectableError < WebDriverError; end # 15
21
21
  class NoSuchDocumentError < WebDriverError; end # 16
22
22
  class UnexpectedJavascriptError < WebDriverError; end # 17
23
23
  class NoScriptResultError < WebDriverError; end # 18
@@ -26,6 +26,8 @@ module Selenium
26
26
  class TimeOutError < WebDriverError; end # 21
27
27
  class NullPointerError < WebDriverError; end # 22
28
28
  class NoSuchWindowError < WebDriverError; end # 23
29
+ class InvalidCookieDomainError < WebDriverError; end # 24
30
+ class UnableToSetCookieError < WebDriverError; end # 25
29
31
  class UnsupportedOperationError < WebDriverError; end
30
32
 
31
33
  Errors = [
@@ -37,13 +39,13 @@ module Selenium
37
39
  NoSuchDriverError,
38
40
  NoSuchElementError,
39
41
  NoSuchFrameError,
40
- NotImplementedError,
42
+ UnknownCommandError,
41
43
  ObsoleteElementError,
42
44
  ElementNotDisplayedError,
43
45
  ElementNotEnabledError,
44
46
  UnhandledError,
45
47
  ExpectedError,
46
- ElementNotSelectedError,
48
+ ElementNotSelectableError,
47
49
  NoSuchDocumentError,
48
50
  UnexpectedJavascriptError,
49
51
  NoScriptResultError,
@@ -51,7 +53,9 @@ module Selenium
51
53
  NoSuchCollectionError,
52
54
  TimeOutError,
53
55
  NullPointerError,
54
- NoSuchWindowError
56
+ NoSuchWindowError,
57
+ InvalidCookieDomainError,
58
+ UnableToSetCookieError
55
59
  ]
56
60
 
57
61
  class << self
@@ -6,8 +6,7 @@ module Selenium
6
6
 
7
7
  #
8
8
  # @see Element#send_keys
9
- #
10
- # http://www.google.com.au/search?&q=unicode+pua&btnG=Search
9
+ # @see http://www.google.com.au/search?&q=unicode+pua&btnG=Search
11
10
  #
12
11
 
13
12
  KEYS = {
@@ -6,18 +6,34 @@ module Selenium
6
6
  @bridge = driver.bridge
7
7
  end
8
8
 
9
+ #
10
+ # Navigate to the given URL
11
+ #
12
+
9
13
  def to(url)
10
14
  @bridge.get url
11
15
  end
12
16
 
17
+ #
18
+ # Move back a single entry in the browser's history.
19
+ #
20
+
13
21
  def back
14
22
  @bridge.goBack
15
23
  end
16
24
 
25
+ #
26
+ # Move forward a single entry in the browser's history.
27
+ #
28
+
17
29
  def forward
18
30
  @bridge.goForward
19
31
  end
20
32
 
33
+ #
34
+ # Refresh the current page.
35
+ #
36
+
21
37
  def refresh
22
38
  @bridge.refresh
23
39
  end
@@ -2,10 +2,26 @@ module Selenium
2
2
  module WebDriver
3
3
  class Options
4
4
 
5
+ #
6
+ # @private
7
+ #
8
+
5
9
  def initialize(driver)
6
10
  @bridge = driver.bridge
7
11
  end
8
12
 
13
+ #
14
+ # Add a cookie to the browser
15
+ #
16
+ # @param [Hash] opts the options to create a cookie with.
17
+ # @option opts [String] :name A name
18
+ # @option opts [String] :value A value
19
+ # @option opts [String] :path ('/') A path
20
+ # @option opts [String] :secure (false) A boolean
21
+ #
22
+ # @raise [ArgumentError] if :name or :value is not specified
23
+ #
24
+
9
25
  def add_cookie(opts = {})
10
26
  raise ArgumentError, "name is required" unless opts[:name]
11
27
  raise ArgumentError, "value is required" unless opts[:value]
@@ -16,14 +32,30 @@ module Selenium
16
32
  @bridge.addCookie opts
17
33
  end
18
34
 
35
+ #
36
+ # Delete the cookie with the given name
37
+ #
38
+ # @param [String] name the name of the cookie to delete
39
+ #
40
+
19
41
  def delete_cookie(name)
20
42
  @bridge.deleteCookie name
21
43
  end
22
44
 
45
+ #
46
+ # Delete all cookies
47
+ #
48
+
23
49
  def delete_all_cookies
24
50
  @bridge.deleteAllCookies
25
51
  end
26
52
 
53
+ #
54
+ # Get all cookies
55
+ #
56
+ # @return [Array<Hash>] list of cookies
57
+ #
58
+
27
59
  def all_cookies
28
60
  @bridge.getAllCookies.map do |cookie|
29
61
  {
@@ -2,13 +2,15 @@ require "rbconfig"
2
2
 
3
3
  module Selenium
4
4
  module WebDriver
5
+
6
+ # @private
5
7
  module Platform
6
8
 
7
9
  module_function
8
10
 
9
11
  def home
10
12
  # jruby has an issue with ENV['HOME'] on Windows
11
- @home ||= Platform.jruby? ? java.lang.System.getProperty('user.home') : ENV['HOME']
13
+ @home ||= Platform.jruby? ? Java.java.lang.System.getProperty('user.home') : ENV['HOME']
12
14
  end
13
15
 
14
16
  def platform
@@ -71,6 +73,20 @@ module Selenium
71
73
  File.chmod 0766, file
72
74
  end
73
75
 
76
+ def find_binary(*binary_names)
77
+ paths = ENV['PATH'].split(File::PATH_SEPARATOR)
78
+ binary_names.map! { |n| "#{n}.exe" } if win?
79
+
80
+ binary_names.each do |binary_name|
81
+ paths.each do |path|
82
+ exe = File.join(path, binary_name)
83
+ return exe if File.executable?(exe)
84
+ end
85
+ end
86
+
87
+ nil
88
+ end
89
+
74
90
  end # Platform
75
91
  end # WebDriver
76
92
  end # Selenium