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
@@ -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