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.
- data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
- data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
- data/chrome/src/extension/background.js +64 -48
- data/chrome/src/extension/content_script.js +253 -132
- data/chrome/src/extension/manifest-nonwin.json +1 -1
- data/chrome/src/extension/manifest-win.json +1 -1
- data/chrome/src/extension/utils.js +8 -8
- data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +9 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +38 -280
- data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +119 -117
- data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +36 -26
- data/common/src/js/abstractcommandprocessor.js +9 -11
- data/common/src/js/command.js +159 -83
- data/common/src/js/core/RemoteRunner.html +2 -2
- data/common/src/js/core/TestRunner-splash.html +3 -3
- data/common/src/js/core/TestRunner.html +5 -17
- data/common/src/js/core/scripts/htmlutils.js +4208 -2506
- data/common/src/js/core/scripts/selenium-api.js +2 -2
- data/common/src/js/core/scripts/selenium-browserbot.js +66 -58
- data/common/src/js/core/scripts/selenium-version.js +1 -1
- data/common/src/js/localcommandprocessor.js +5 -19
- data/common/src/js/testcase.js +2 -0
- data/common/src/js/webdriver.js +63 -93
- data/common/src/js/webelement.js +40 -42
- data/common/src/rb/lib/selenium/webdriver.rb +23 -14
- data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +8 -35
- data/common/src/rb/lib/selenium/webdriver/child_process.rb +2 -0
- data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +1 -0
- data/common/src/rb/lib/selenium/webdriver/core_ext/string.rb +5 -0
- data/common/src/rb/lib/selenium/webdriver/driver.rb +20 -15
- data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +7 -2
- data/common/src/rb/lib/selenium/webdriver/element.rb +11 -2
- data/common/src/rb/lib/selenium/webdriver/error.rb +9 -5
- data/common/src/rb/lib/selenium/webdriver/keys.rb +1 -2
- data/common/src/rb/lib/selenium/webdriver/navigation.rb +16 -0
- data/common/src/rb/lib/selenium/webdriver/options.rb +32 -0
- data/common/src/rb/lib/selenium/webdriver/platform.rb +17 -1
- data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
- data/firefox/src/extension/components/dispatcher.js +492 -0
- data/firefox/src/extension/components/driver-component.js +4 -1
- data/firefox/src/extension/components/errorcode.js +70 -0
- data/firefox/src/extension/components/firefoxDriver.js +173 -154
- data/firefox/src/extension/components/nsCommandProcessor.js +171 -132
- data/firefox/src/extension/components/promptService.js +5 -5
- data/firefox/src/extension/components/request.js +219 -0
- data/firefox/src/extension/components/response.js +276 -0
- data/firefox/src/extension/components/session.js +281 -0
- data/firefox/src/extension/components/sessionstore.js +226 -0
- data/firefox/src/extension/components/socketListener.js +350 -100
- data/firefox/src/extension/components/utils.js +166 -98
- data/firefox/src/extension/components/webdriverserver.js +9 -5
- data/firefox/src/extension/components/wrappedElement.js +189 -166
- data/firefox/src/extension/install.rdf +1 -1
- data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +2 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +39 -33
- data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +7 -421
- data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +7 -64
- data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +2 -3
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +54 -10
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +2 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +6 -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 +2 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +38 -13
- data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +9 -2
- data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +5 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +2 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +42 -38
- data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +56 -47
- data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +26 -26
- data/remote/client/src/rb/lib/selenium/webdriver/remote/patron_http_client.rb +58 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +10 -12
- data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +2 -17
- metadata +44 -23
- data/common/src/js/context.js +0 -58
- data/firefox/src/extension/components/context.js +0 -37
@@ -1,21 +1,25 @@
|
|
1
1
|
require "tmpdir"
|
2
2
|
require "fileutils"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
have_yajl = lambda {
|
5
|
+
begin
|
6
|
+
require "yajl/json_gem"
|
7
|
+
true
|
8
|
+
rescue LoadError
|
9
|
+
false
|
10
|
+
end
|
11
|
+
}
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
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, :
|
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
|
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|
|
14
|
+
arg.map { |e| unwrap_script_result(e) }
|
30
15
|
else
|
31
|
-
|
32
|
-
|
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
|
19
|
+
arg
|
44
20
|
end
|
45
21
|
end
|
46
22
|
end
|
47
23
|
|
48
24
|
def element_id_from(id)
|
49
|
-
|
50
|
-
after = str.split("/").last
|
51
|
-
|
52
|
-
after
|
25
|
+
id['ELEMENT']
|
53
26
|
end
|
54
27
|
|
55
28
|
def parse_cookie_string(str)
|
@@ -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 [
|
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
|
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
|
-
|
40
|
+
IE::Bridge.new(*args)
|
35
41
|
when :remote
|
36
|
-
|
42
|
+
Remote::Bridge.new(*args)
|
37
43
|
when :chrome
|
38
|
-
|
44
|
+
Chrome::Bridge.new(*args)
|
39
45
|
when :firefox, :ff
|
40
|
-
|
46
|
+
Firefox::Bridge.new(*args)
|
41
47
|
else
|
42
48
|
raise ArgumentError, "unknown driver: #{browser.inspect}"
|
43
49
|
end
|
44
50
|
|
45
|
-
|
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
|
-
# @
|
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.
|
18
|
+
bridge.getScreenshot
|
14
19
|
when :png
|
15
|
-
bridge.
|
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
|
-
# @
|
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
|
-
# @
|
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
|
-
|
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
|
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
|
-
|
42
|
+
UnknownCommandError,
|
41
43
|
ObsoleteElementError,
|
42
44
|
ElementNotDisplayedError,
|
43
45
|
ElementNotEnabledError,
|
44
46
|
UnhandledError,
|
45
47
|
ExpectedError,
|
46
|
-
|
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,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
|