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