selenium-webdriver 2.45.0 → 3.142.7
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.
- checksums.yaml +7 -0
- data/CHANGES +795 -3
- data/Gemfile +2 -0
- data/{COPYING → LICENSE} +1 -3
- data/README.md +13 -9
- data/lib/selenium/server.rb +93 -71
- data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
- data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
- data/lib/selenium/webdriver/atoms.rb +37 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
- data/lib/selenium/webdriver/chrome/driver.rb +127 -0
- data/lib/selenium/webdriver/chrome/options.rb +190 -0
- data/lib/selenium/webdriver/chrome/profile.rb +40 -20
- data/lib/selenium/webdriver/chrome/service.rb +46 -62
- data/lib/selenium/webdriver/chrome.rb +34 -6
- data/lib/selenium/webdriver/common/action_builder.rb +69 -56
- data/lib/selenium/webdriver/common/alert.rb +25 -8
- data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
- data/lib/selenium/webdriver/common/driver.rb +90 -63
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
- data/lib/selenium/webdriver/common/element.rb +79 -37
- data/lib/selenium/webdriver/common/error.rb +282 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
- data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
- data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
- data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
- data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
- data/lib/selenium/webdriver/common/keyboard.rb +27 -12
- data/lib/selenium/webdriver/common/keys.rb +118 -81
- data/lib/selenium/webdriver/common/log_entry.rb +27 -8
- data/lib/selenium/webdriver/common/logger.rb +115 -0
- data/lib/selenium/webdriver/common/logs.rb +24 -7
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +29 -12
- data/lib/selenium/webdriver/common/navigation.rb +21 -4
- data/lib/selenium/webdriver/common/options.rb +43 -126
- data/lib/selenium/webdriver/common/platform.rb +101 -97
- data/lib/selenium/webdriver/common/port_prober.rb +24 -17
- data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
- data/lib/selenium/webdriver/common/proxy.rb +86 -73
- data/lib/selenium/webdriver/common/search_context.rb +49 -33
- data/lib/selenium/webdriver/common/service.rb +219 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
- data/lib/selenium/webdriver/common/target_locator.rb +35 -14
- data/lib/selenium/webdriver/common/timeouts.rb +23 -6
- data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
- data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
- data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
- data/lib/selenium/webdriver/common/wait.rb +34 -14
- data/lib/selenium/webdriver/common/window.rb +75 -16
- data/lib/selenium/webdriver/common/zipper.rb +26 -11
- data/lib/selenium/webdriver/common.rb +40 -7
- data/lib/selenium/webdriver/edge/bridge.rb +76 -0
- data/lib/selenium/webdriver/edge/driver.rb +66 -0
- data/lib/selenium/webdriver/edge/options.rb +80 -0
- data/lib/selenium/webdriver/edge/service.rb +52 -0
- data/lib/selenium/webdriver/edge.rb +44 -0
- data/lib/selenium/webdriver/firefox/binary.rb +70 -48
- data/lib/selenium/webdriver/firefox/driver.rb +50 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/extension.rb +50 -19
- data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
- data/lib/selenium/webdriver/firefox/options.rb +162 -0
- data/lib/selenium/webdriver/firefox/profile.rb +66 -48
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
- data/lib/selenium/webdriver/firefox/service.rb +52 -0
- data/lib/selenium/webdriver/firefox/util.rb +19 -2
- data/lib/selenium/webdriver/firefox.rb +46 -10
- data/lib/selenium/webdriver/ie/driver.rb +85 -0
- data/lib/selenium/webdriver/ie/options.rb +138 -0
- data/lib/selenium/webdriver/ie/service.rb +54 -0
- data/lib/selenium/webdriver/ie.rb +32 -10
- data/lib/selenium/webdriver/remote/bridge.rb +117 -572
- data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
- data/lib/selenium/webdriver/remote/driver.rb +51 -0
- data/lib/selenium/webdriver/remote/http/common.rb +54 -23
- data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
- data/lib/selenium/webdriver/remote/http/default.rb +85 -42
- data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
- data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
- data/lib/selenium/webdriver/remote/response.rb +68 -30
- data/lib/selenium/webdriver/remote/server_error.rb +22 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
- data/lib/selenium/webdriver/remote.rb +27 -13
- data/lib/selenium/webdriver/safari/bridge.rb +38 -107
- data/lib/selenium/webdriver/safari/driver.rb +68 -0
- data/lib/selenium/webdriver/safari/options.rb +56 -75
- data/lib/selenium/webdriver/safari/service.rb +38 -0
- data/lib/selenium/webdriver/safari.rb +49 -31
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
- data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
- data/lib/selenium/webdriver/support/color.rb +82 -46
- data/lib/selenium/webdriver/support/escaper.rb +43 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
- data/lib/selenium/webdriver/support/select.rb +66 -89
- data/lib/selenium/webdriver/support.rb +20 -0
- data/lib/selenium/webdriver/version.rb +24 -0
- data/lib/selenium/webdriver.rb +55 -25
- data/lib/selenium-webdriver.rb +19 -0
- data/selenium-webdriver.gemspec +42 -29
- metadata +331 -260
- data/Gemfile.lock +0 -48
- data/lib/selenium/client/base.rb +0 -132
- data/lib/selenium/client/driver.rb +0 -10
- data/lib/selenium/client/errors.rb +0 -9
- data/lib/selenium/client/extensions.rb +0 -118
- data/lib/selenium/client/idiomatic.rb +0 -488
- data/lib/selenium/client/javascript_expression_builder.rb +0 -116
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
- data/lib/selenium/client/legacy_driver.rb +0 -1720
- data/lib/selenium/client/protocol.rb +0 -104
- data/lib/selenium/client/selenium_helper.rb +0 -34
- data/lib/selenium/client.rb +0 -38
- data/lib/selenium/rake/server_task.rb +0 -157
- data/lib/selenium/webdriver/android/bridge.rb +0 -49
- data/lib/selenium/webdriver/android.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
- data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
- data/lib/selenium/webdriver/common/html5/location.rb +0 -0
- data/lib/selenium/webdriver/common/json_helper.rb +0 -34
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
- data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
- data/lib/selenium/webdriver/ie/bridge.rb +0 -69
- data/lib/selenium/webdriver/ie/server.rb +0 -90
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
- data/lib/selenium/webdriver/iphone.rb +0 -9
- data/lib/selenium/webdriver/opera/bridge.rb +0 -112
- data/lib/selenium/webdriver/opera/service.rb +0 -49
- data/lib/selenium/webdriver/opera.rb +0 -24
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
- data/lib/selenium/webdriver/phantomjs.rb +0 -22
- data/lib/selenium/webdriver/remote/commands.rb +0 -192
- data/lib/selenium/webdriver/safari/browser.rb +0 -20
- data/lib/selenium/webdriver/safari/extensions.rb +0 -170
- data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
- data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
- data/lib/selenium/webdriver/safari/server.rb +0 -145
- data/lib/selenium-client.rb +0 -2
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module Client
|
|
3
|
-
|
|
4
|
-
HTTP_HEADERS = { 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8' }
|
|
5
|
-
|
|
6
|
-
# Module in charge of handling Selenium over-the-wire HTTP protocol
|
|
7
|
-
module Protocol
|
|
8
|
-
attr_reader :session_id
|
|
9
|
-
|
|
10
|
-
def remote_control_command(verb, args=[])
|
|
11
|
-
timeout(@default_timeout_in_seconds) do
|
|
12
|
-
status, response = http_post(http_request_for(verb, args))
|
|
13
|
-
raise CommandError, response unless status == "OK"
|
|
14
|
-
response[3..-1] # strip "OK," from response
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def string_command(verb, args=[])
|
|
19
|
-
remote_control_command(verb, args)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def string_array_command(verb, args=[])
|
|
23
|
-
csv = string_command(verb, args)
|
|
24
|
-
token = ""
|
|
25
|
-
tokens = []
|
|
26
|
-
escape = false
|
|
27
|
-
csv.split(//).each do |letter|
|
|
28
|
-
if escape
|
|
29
|
-
token += letter
|
|
30
|
-
escape = false
|
|
31
|
-
next
|
|
32
|
-
end
|
|
33
|
-
case letter
|
|
34
|
-
when '\\'
|
|
35
|
-
escape = true
|
|
36
|
-
when ','
|
|
37
|
-
tokens << token
|
|
38
|
-
token = ""
|
|
39
|
-
else
|
|
40
|
-
token += letter
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
tokens << token
|
|
44
|
-
return tokens
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def number_command(verb, args)
|
|
48
|
-
string_command verb, args
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def number_array_command(verb, args)
|
|
52
|
-
string_array_command verb, args
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def boolean_command(verb, args=[])
|
|
56
|
-
parse_boolean_value string_command(verb, args)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def boolean_array_command(verb, args)
|
|
60
|
-
string_array_command(verb, args).collect {|value| parse_boolean_value(value)}
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
protected
|
|
64
|
-
|
|
65
|
-
def parse_boolean_value(value)
|
|
66
|
-
if ("true" == value)
|
|
67
|
-
return true
|
|
68
|
-
elsif ("false" == value)
|
|
69
|
-
return false
|
|
70
|
-
end
|
|
71
|
-
raise ProtocolError, "Invalid Selenese boolean value that is neither 'true' nor 'false': got '#{value}'"
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def http_request_for(verb, args)
|
|
75
|
-
data = "cmd=#{CGI::escape(verb)}"
|
|
76
|
-
args.each_with_index do |arg, index|
|
|
77
|
-
data << "&#{index.succ}=#{CGI::escape(arg.to_s)}"
|
|
78
|
-
end
|
|
79
|
-
data << "&sessionId=#{session_id}" unless session_id.nil?
|
|
80
|
-
data
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def http_post(data)
|
|
84
|
-
start = Time.now
|
|
85
|
-
called_from = caller.detect{|line| line !~ /(selenium-client|vendor|usr\/lib\/ruby|\(eval\))/i}
|
|
86
|
-
http = Net::HTTP.new(@host, @port)
|
|
87
|
-
http.open_timeout = default_timeout_in_seconds
|
|
88
|
-
http.read_timeout = default_timeout_in_seconds
|
|
89
|
-
response = http.post('/selenium-server/driver/', data, HTTP_HEADERS)
|
|
90
|
-
if response.body !~ /^OK/
|
|
91
|
-
puts "#{start} selenium-client received failure from selenium server:"
|
|
92
|
-
puts "requested:"
|
|
93
|
-
puts "\t" + CGI::unescape(data.split('&').join("\n\t"))
|
|
94
|
-
puts "received:"
|
|
95
|
-
puts "\t#{response.body.inspect}"
|
|
96
|
-
puts "\tcalled from #{called_from}"
|
|
97
|
-
end
|
|
98
|
-
[ response.body[0..1], response.body ]
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
end
|
|
104
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Defines a mixin module that you can use to write Selenium tests
|
|
2
|
-
# without typing "@selenium." in front of every command. Every
|
|
3
|
-
# call to a missing method will be automatically sent to the @selenium
|
|
4
|
-
# object.
|
|
5
|
-
module Selenium
|
|
6
|
-
module Client
|
|
7
|
-
|
|
8
|
-
module SeleniumHelper
|
|
9
|
-
|
|
10
|
-
# Overrides default open method to actually delegates to @selenium
|
|
11
|
-
def open(url)
|
|
12
|
-
@selenium.open url
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Overrides default type method to actually delegates to @selenium
|
|
16
|
-
def type(locator, value)
|
|
17
|
-
@selenium.type locator, value
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Overrides default select method to actually delegates to @selenium
|
|
21
|
-
def select(input_locator, option_locator)
|
|
22
|
-
@selenium.select input_locator, option_locator
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Delegates to @selenium on method missing
|
|
26
|
-
def method_missing(method_name, *args)
|
|
27
|
-
return super unless @selenium.respond_to?(method_name)
|
|
28
|
-
|
|
29
|
-
@selenium.send(method_name, *args)
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
end
|
|
34
|
-
end
|
data/lib/selenium/client.rb
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
require 'net/http'
|
|
2
|
-
require 'uri'
|
|
3
|
-
require 'cgi'
|
|
4
|
-
require 'digest/md5'
|
|
5
|
-
require 'base64'
|
|
6
|
-
require 'fileutils'
|
|
7
|
-
require 'tmpdir'
|
|
8
|
-
|
|
9
|
-
require 'selenium/client/errors'
|
|
10
|
-
require 'selenium/client/protocol'
|
|
11
|
-
require 'selenium/client/legacy_driver'
|
|
12
|
-
require 'selenium/client/javascript_expression_builder'
|
|
13
|
-
require 'selenium/client/javascript_frameworks/prototype'
|
|
14
|
-
require 'selenium/client/javascript_frameworks/jquery'
|
|
15
|
-
require 'selenium/client/extensions'
|
|
16
|
-
require 'selenium/client/idiomatic'
|
|
17
|
-
require 'selenium/client/base'
|
|
18
|
-
require 'selenium/client/driver'
|
|
19
|
-
require 'selenium/client/selenium_helper'
|
|
20
|
-
require 'selenium/server'
|
|
21
|
-
|
|
22
|
-
module Selenium
|
|
23
|
-
DEPRECATED_CONSTANTS = {
|
|
24
|
-
:SeleniumDriver => Selenium::Client::Driver,
|
|
25
|
-
:CommandError => Selenium::Client::CommandError
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
def self.const_missing(name)
|
|
29
|
-
if replacement = DEPRECATED_CONSTANTS[name.to_sym]
|
|
30
|
-
warn "the Selenium::#{name} constant has been deprecated, please use #{replacement} instead"
|
|
31
|
-
replacement
|
|
32
|
-
else
|
|
33
|
-
super
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
autoload :Rake, 'selenium/rake/server_task'
|
|
38
|
-
end # Selenium
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
require 'selenium/server'
|
|
2
|
-
require 'rake'
|
|
3
|
-
|
|
4
|
-
module Selenium
|
|
5
|
-
module Rake
|
|
6
|
-
|
|
7
|
-
class MissingJarFileError < StandardError
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
#
|
|
11
|
-
# Defines rake tasks for starting, stopping and restarting the Selenium server.
|
|
12
|
-
#
|
|
13
|
-
# Usage:
|
|
14
|
-
#
|
|
15
|
-
# require 'selenium/rake/server_task'
|
|
16
|
-
#
|
|
17
|
-
# Selenium::Rake::ServerTask.new do |t|
|
|
18
|
-
# t.jar = "/path/to/selenium-server-standalone.jar"
|
|
19
|
-
# t.port = 4444
|
|
20
|
-
# t.opts = %w[-some options]
|
|
21
|
-
# end
|
|
22
|
-
#
|
|
23
|
-
# Alternatively, you can have the task download a specific version of the server:
|
|
24
|
-
#
|
|
25
|
-
# Selenium::Rake::ServerTask.new(:server) do |t|
|
|
26
|
-
# t.version = '2.6.0'
|
|
27
|
-
# end
|
|
28
|
-
#
|
|
29
|
-
# or the latest version
|
|
30
|
-
#
|
|
31
|
-
# Selenium::Rake::ServerTask.new(:server) do |t|
|
|
32
|
-
# t.version = :latest
|
|
33
|
-
# end
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
# Tasks defined:
|
|
37
|
-
#
|
|
38
|
-
# rake selenium:server:start
|
|
39
|
-
# rake selenium:server:stop
|
|
40
|
-
# rake selenium:server:restart
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
class ServerTask
|
|
44
|
-
include ::Rake::DSL if defined?(::Rake::DSL)
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
# Path to the selenium server jar
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
attr_accessor :jar
|
|
51
|
-
|
|
52
|
-
#
|
|
53
|
-
# Port to use for the server.
|
|
54
|
-
# Default: 4444
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
attr_accessor :port
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
# Timeout in seconds for the server to start/stop.
|
|
62
|
-
# Default: 30
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
-
attr_accessor :timeout
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
# Whether we should detach from the server process.
|
|
69
|
-
# Default: true
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
attr_accessor :background
|
|
73
|
-
alias_method :background?, :background
|
|
74
|
-
|
|
75
|
-
#
|
|
76
|
-
# Configure logging. Pass a log file path or a boolean.
|
|
77
|
-
# Default: true
|
|
78
|
-
#
|
|
79
|
-
# true - log to stdout/stderr
|
|
80
|
-
# false - no logging
|
|
81
|
-
# String - log to the specified file
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
attr_accessor :log
|
|
85
|
-
|
|
86
|
-
#
|
|
87
|
-
# Add additional options passed to the server jar.
|
|
88
|
-
#
|
|
89
|
-
|
|
90
|
-
attr_accessor :opts
|
|
91
|
-
|
|
92
|
-
#
|
|
93
|
-
# Specify the version of the server jar to download
|
|
94
|
-
#
|
|
95
|
-
|
|
96
|
-
attr_accessor :version
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def initialize(prefix = "selenium:server")
|
|
100
|
-
@jar = nil
|
|
101
|
-
@prefix = prefix
|
|
102
|
-
@port = 4444
|
|
103
|
-
@timeout = 30
|
|
104
|
-
@background = true
|
|
105
|
-
@log = true
|
|
106
|
-
@opts = []
|
|
107
|
-
@version = nil
|
|
108
|
-
|
|
109
|
-
yield self if block_given?
|
|
110
|
-
|
|
111
|
-
if @version
|
|
112
|
-
@jar = Selenium::Server.download(@version)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
unless @jar
|
|
116
|
-
raise MissingJarFileError, "must provide path to the selenium server jar"
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
@server = Selenium::Server.new(@jar, :port => @port,
|
|
120
|
-
:timeout => @timeout,
|
|
121
|
-
:background => @background,
|
|
122
|
-
:log => @log )
|
|
123
|
-
|
|
124
|
-
@server << @opts
|
|
125
|
-
|
|
126
|
-
define_start_task
|
|
127
|
-
define_stop_task
|
|
128
|
-
define_restart_task
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
private
|
|
132
|
-
|
|
133
|
-
def define_start_task
|
|
134
|
-
desc "Start the Selenium server"
|
|
135
|
-
task "#{@prefix}:start" do
|
|
136
|
-
@server.start
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def define_stop_task
|
|
141
|
-
desc 'Stop the Selenium server'
|
|
142
|
-
task "#{@prefix}:stop" do
|
|
143
|
-
@server.stop
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def define_restart_task
|
|
148
|
-
desc 'Restart the Selenium server'
|
|
149
|
-
task "#{@prefix}:restart" do
|
|
150
|
-
@server.stop
|
|
151
|
-
@server.start
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
end # ServerTask
|
|
156
|
-
end # Rake
|
|
157
|
-
end # Selenium
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module WebDriver
|
|
3
|
-
module Android
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
# @api private
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
class Bridge < Remote::Bridge
|
|
10
|
-
|
|
11
|
-
DEFAULT_URL = "http://#{Platform.localhost}:8080/wd/hub/"
|
|
12
|
-
|
|
13
|
-
def initialize(opts = {})
|
|
14
|
-
warn 'The Android driver is deprecated - please use either http://selendroid.io or http://appium.io instead.'
|
|
15
|
-
|
|
16
|
-
remote_opts = {
|
|
17
|
-
:url => opts.fetch(:url, DEFAULT_URL),
|
|
18
|
-
:desired_capabilities => opts.fetch(:desired_capabilities, capabilities),
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
remote_opts[:http_client] = opts[:http_client] if opts.has_key?(:http_client)
|
|
22
|
-
|
|
23
|
-
super remote_opts
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def browser
|
|
27
|
-
:android
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def driver_extensions
|
|
31
|
-
[
|
|
32
|
-
DriverExtensions::TakesScreenshot,
|
|
33
|
-
DriverExtensions::Rotatable,
|
|
34
|
-
DriverExtensions::HasInputDevices,
|
|
35
|
-
DriverExtensions::HasWebStorage,
|
|
36
|
-
DriverExtensions::HasLocation,
|
|
37
|
-
DriverExtensions::HasBrowserConnection,
|
|
38
|
-
DriverExtensions::HasTouchScreen
|
|
39
|
-
]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def capabilities
|
|
43
|
-
@capabilities ||= Remote::Capabilities.android
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
end # Bridge
|
|
47
|
-
end # Android
|
|
48
|
-
end # WebDriver
|
|
49
|
-
end # Selenium
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
class Dir
|
|
2
|
-
# @api private
|
|
3
|
-
def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
|
|
4
|
-
case prefix_suffix
|
|
5
|
-
when nil
|
|
6
|
-
prefix = "d"
|
|
7
|
-
suffix = ""
|
|
8
|
-
when String
|
|
9
|
-
prefix = prefix_suffix
|
|
10
|
-
suffix = ""
|
|
11
|
-
when Array
|
|
12
|
-
prefix = prefix_suffix[0]
|
|
13
|
-
suffix = prefix_suffix[1]
|
|
14
|
-
else
|
|
15
|
-
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
|
16
|
-
end
|
|
17
|
-
tmpdir ||= Dir.tmpdir
|
|
18
|
-
t = Time.now.strftime("%Y%m%d")
|
|
19
|
-
n = nil
|
|
20
|
-
begin
|
|
21
|
-
path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
|
22
|
-
path << "-#{n}" if n
|
|
23
|
-
path << suffix
|
|
24
|
-
Dir.mkdir(path, 0700)
|
|
25
|
-
rescue Errno::EEXIST
|
|
26
|
-
n ||= 0
|
|
27
|
-
n += 1
|
|
28
|
-
retry
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
if block_given?
|
|
32
|
-
begin
|
|
33
|
-
yield path
|
|
34
|
-
ensure
|
|
35
|
-
FileUtils.remove_entry_secure path
|
|
36
|
-
end
|
|
37
|
-
else
|
|
38
|
-
path
|
|
39
|
-
end
|
|
40
|
-
end unless respond_to? :mktmpdir # > 1.8.7
|
|
41
|
-
end
|
|
42
|
-
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module WebDriver
|
|
3
|
-
|
|
4
|
-
#
|
|
5
|
-
# @api private
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
module DriverExtensions
|
|
9
|
-
module HasInputDevices
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
# @return [ActionBuilder]
|
|
13
|
-
# @api public
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
def action
|
|
17
|
-
ActionBuilder.new mouse, keyboard
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
#
|
|
21
|
-
# @api private
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
def mouse
|
|
25
|
-
Mouse.new @bridge
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
#
|
|
29
|
-
# @api private
|
|
30
|
-
#
|
|
31
|
-
|
|
32
|
-
def keyboard
|
|
33
|
-
Keyboard.new @bridge
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end # HasInputDevices
|
|
37
|
-
end # DriverExtensions
|
|
38
|
-
end # WebDriver
|
|
39
|
-
end # Selenium
|
|
File without changes
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module WebDriver
|
|
3
|
-
module JsonHelper
|
|
4
|
-
|
|
5
|
-
# ActiveSupport may define Object#load, so we can't use MultiJson.respond_to? here
|
|
6
|
-
sm = MultiJson.singleton_methods.map { |e| e.to_sym }
|
|
7
|
-
|
|
8
|
-
if sm.include? :load
|
|
9
|
-
# @api private
|
|
10
|
-
def json_load(obj)
|
|
11
|
-
MultiJson.load(obj)
|
|
12
|
-
end
|
|
13
|
-
else
|
|
14
|
-
# @api private
|
|
15
|
-
def json_load(obj)
|
|
16
|
-
MultiJson.decode(obj)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
if sm.include? :dump
|
|
21
|
-
# @api private
|
|
22
|
-
def json_dump(obj)
|
|
23
|
-
MultiJson.dump(obj)
|
|
24
|
-
end
|
|
25
|
-
else
|
|
26
|
-
# @api private
|
|
27
|
-
def json_dump(obj)
|
|
28
|
-
MultiJson.encode(obj)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module WebDriver
|
|
3
|
-
module Firefox
|
|
4
|
-
|
|
5
|
-
# @api private
|
|
6
|
-
class Bridge < Remote::Bridge
|
|
7
|
-
|
|
8
|
-
def initialize(opts = {})
|
|
9
|
-
port = opts.delete(:port) || DEFAULT_PORT
|
|
10
|
-
profile = opts.delete(:profile)
|
|
11
|
-
http_client = opts.delete(:http_client)
|
|
12
|
-
proxy = opts.delete(:proxy)
|
|
13
|
-
|
|
14
|
-
caps = opts.delete(:desired_capabilities) do
|
|
15
|
-
Remote::Capabilities.firefox(:native_events => DEFAULT_ENABLE_NATIVE_EVENTS)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
@launcher = create_launcher(port, profile)
|
|
19
|
-
|
|
20
|
-
unless opts.empty?
|
|
21
|
-
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
@launcher.launch
|
|
25
|
-
|
|
26
|
-
caps.proxy = proxy if proxy
|
|
27
|
-
|
|
28
|
-
remote_opts = {
|
|
29
|
-
:url => @launcher.url,
|
|
30
|
-
:desired_capabilities => caps
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
remote_opts.merge!(:http_client => http_client) if http_client
|
|
34
|
-
|
|
35
|
-
begin
|
|
36
|
-
super(remote_opts)
|
|
37
|
-
rescue
|
|
38
|
-
@launcher.quit
|
|
39
|
-
raise
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def browser
|
|
44
|
-
:firefox
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def driver_extensions
|
|
48
|
-
[
|
|
49
|
-
DriverExtensions::TakesScreenshot,
|
|
50
|
-
DriverExtensions::HasInputDevices
|
|
51
|
-
]
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def quit
|
|
55
|
-
super
|
|
56
|
-
nil
|
|
57
|
-
ensure
|
|
58
|
-
@launcher.quit
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
private
|
|
62
|
-
|
|
63
|
-
def create_launcher(port, profile)
|
|
64
|
-
Launcher.new Binary.new, port, profile
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
end # Bridge
|
|
68
|
-
end # Firefox
|
|
69
|
-
end # WebDriver
|
|
70
|
-
end # Selenium
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
module Selenium
|
|
2
|
-
module WebDriver
|
|
3
|
-
module Firefox
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
# @api private
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
class SocketLock
|
|
10
|
-
|
|
11
|
-
def initialize(port, timeout)
|
|
12
|
-
@port = port
|
|
13
|
-
@timeout = timeout
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def locked(&blk)
|
|
17
|
-
lock
|
|
18
|
-
|
|
19
|
-
begin
|
|
20
|
-
yield
|
|
21
|
-
ensure
|
|
22
|
-
release
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def lock
|
|
29
|
-
max_time = Time.now + @timeout
|
|
30
|
-
|
|
31
|
-
until can_lock? || Time.now >= max_time
|
|
32
|
-
sleep 0.1
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
unless did_lock?
|
|
36
|
-
raise Error::WebDriverError, "unable to bind to locking port #{@port} within #{@timeout} seconds"
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def release
|
|
41
|
-
@server && @server.close
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def can_lock?
|
|
45
|
-
@server = TCPServer.new(Platform.localhost, @port)
|
|
46
|
-
ChildProcess.close_on_exec @server
|
|
47
|
-
|
|
48
|
-
true
|
|
49
|
-
rescue SocketError, Errno::EADDRINUSE, Errno::EBADF => ex
|
|
50
|
-
$stderr.puts "#{self}: #{ex.message}" if $DEBUG
|
|
51
|
-
false
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def did_lock?
|
|
55
|
-
!!@server
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
end # SocketLock
|
|
59
|
-
end # Firefox
|
|
60
|
-
end # WebDriver
|
|
61
|
-
end # Selenium
|