selenium-webdriver 3.0.0.beta3.1 → 3.0.0.beta4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +19 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +11 -9
- data/lib/selenium/webdriver/chrome/bridge.rb +35 -66
- data/lib/selenium/webdriver/chrome/profile.rb +11 -7
- data/lib/selenium/webdriver/common/driver.rb +2 -6
- data/lib/selenium/webdriver/common/service.rb +1 -1
- data/lib/selenium/webdriver/edge.rb +0 -9
- data/lib/selenium/webdriver/edge/bridge.rb +13 -37
- data/lib/selenium/webdriver/firefox/bridge.rb +7 -22
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/w3c_bridge.rb +23 -8
- data/lib/selenium/webdriver/ie/bridge.rb +21 -26
- data/lib/selenium/webdriver/phantomjs/bridge.rb +7 -18
- data/lib/selenium/webdriver/remote/bridge.rb +2 -1
- data/lib/selenium/webdriver/remote/capabilities.rb +1 -3
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +2 -1
- data/lib/selenium/webdriver/safari.rb +10 -27
- data/lib/selenium/webdriver/safari/{apple_bridge.rb → bridge.rb} +8 -8
- data/selenium-webdriver.gemspec +1 -1
- metadata +3 -8
- data/lib/selenium/webdriver/safari/browser.rb +0 -38
- data/lib/selenium/webdriver/safari/legacy_bridge.rb +0 -138
- data/lib/selenium/webdriver/safari/options.rb +0 -61
- data/lib/selenium/webdriver/safari/resources/client.js +0 -56
- data/lib/selenium/webdriver/safari/server.rb +0 -181
@@ -26,28 +26,17 @@ module Selenium
|
|
26
26
|
|
27
27
|
class Bridge < Remote::Bridge
|
28
28
|
def initialize(opts = {})
|
29
|
-
|
30
|
-
|
29
|
+
port = opts.delete(:port) || Service::DEFAULT_PORT
|
30
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.phantomjs
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
args = opts.delete(:args) || caps['phantomjs.cli.args']
|
36
|
-
|
37
|
-
@service = Service.new(PhantomJS.path, Service::DEFAULT_PORT, *args)
|
32
|
+
unless opts.key?(:url)
|
33
|
+
args = opts.delete(:args) || opts[:desired_capabilities]['phantomjs.cli.args']
|
34
|
+
@service = Service.new(PhantomJS.path, port, *args)
|
38
35
|
@service.start
|
39
|
-
|
40
|
-
url = @service.uri
|
36
|
+
opts[:url] = @service.uri
|
41
37
|
end
|
42
38
|
|
43
|
-
|
44
|
-
url: url,
|
45
|
-
desired_capabilities: caps
|
46
|
-
}
|
47
|
-
|
48
|
-
remote_opts[:http_client] = http_client if http_client
|
49
|
-
|
50
|
-
super(remote_opts)
|
39
|
+
super(opts)
|
51
40
|
end
|
52
41
|
|
53
42
|
def browser
|
@@ -62,9 +62,10 @@ module Selenium
|
|
62
62
|
def initialize(opts = {})
|
63
63
|
opts = opts.dup
|
64
64
|
|
65
|
+
port = opts.delete(:port) || 4444
|
65
66
|
http_client = opts.delete(:http_client) { Http::Default.new }
|
66
67
|
desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.firefox }
|
67
|
-
url = opts.delete(:url) { "http://#{Platform.localhost}
|
68
|
+
url = opts.delete(:url) { "http://#{Platform.localhost}:#{port}/wd/hub" }
|
68
69
|
|
69
70
|
unless opts.empty?
|
70
71
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
@@ -67,9 +67,10 @@ module Selenium
|
|
67
67
|
|
68
68
|
opts = opts.dup
|
69
69
|
|
70
|
+
port = opts.delete(:port) || 4444
|
70
71
|
http_client = opts.delete(:http_client) { Http::Default.new }
|
71
72
|
desired_capabilities = opts.delete(:desired_capabilities) { W3CCapabilities.firefox }
|
72
|
-
url = opts.delete(:url) { "http://#{Platform.localhost}
|
73
|
+
url = opts.delete(:url) { "http://#{Platform.localhost}:#{port}/wd/hub" }
|
73
74
|
|
74
75
|
desired_capabilities = W3CCapabilities.send(desired_capabilities) if desired_capabilities.is_a? Symbol
|
75
76
|
|
@@ -24,9 +24,8 @@ module Selenium
|
|
24
24
|
module WebDriver
|
25
25
|
module Safari
|
26
26
|
MISSING_TEXT = <<-ERROR.tr("\n", '').freeze
|
27
|
-
Unable to find
|
28
|
-
|
29
|
-
somewhere on your PATH. More info at https://github.com/SeleniumHQ/selenium/wiki/SafariDriver.
|
27
|
+
Unable to find Apple's safaridriver which comes with Safari 10.
|
28
|
+
More info at https://webkit.org/blog/6900/webdriver-support-in-safari-10/
|
30
29
|
ERROR
|
31
30
|
|
32
31
|
class << self
|
@@ -36,22 +35,10 @@ module Selenium
|
|
36
35
|
end
|
37
36
|
|
38
37
|
def path
|
39
|
-
@path ||=
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
when :macosx
|
44
|
-
'/Applications/Safari.app/Contents/MacOS/Safari'
|
45
|
-
else
|
46
|
-
Platform.find_binary('Safari')
|
47
|
-
end
|
48
|
-
|
49
|
-
unless File.file?(path) && File.executable?(path)
|
50
|
-
raise Error::WebDriverError, MISSING_TEXT
|
51
|
-
end
|
52
|
-
|
53
|
-
path
|
54
|
-
)
|
38
|
+
@path ||= '/Applications/Safari.app/Contents/MacOS/Safari'
|
39
|
+
return @path if File.file?(@path) && File.executable?(@path)
|
40
|
+
raise Error::WebDriverError, 'Safari is only supported on Mac' unless Platform.os == :macosx
|
41
|
+
raise Error::WebDriverError, 'Unable to find Safari'
|
55
42
|
end
|
56
43
|
|
57
44
|
def resource_path
|
@@ -64,18 +51,14 @@ module Selenium
|
|
64
51
|
end
|
65
52
|
|
66
53
|
def driver_path
|
67
|
-
@driver_path
|
54
|
+
@driver_path ||= '/usr/bin/safaridriver'
|
55
|
+
return @driver_path if File.file?(@driver_path) && File.executable?(@driver_path)
|
56
|
+
raise Error::WebDriverError, MISSING_TEXT
|
68
57
|
end
|
69
58
|
end
|
70
59
|
end # Safari
|
71
60
|
end # WebDriver
|
72
61
|
end # Selenium
|
73
62
|
|
74
|
-
require 'selenium/webdriver/safari/
|
75
|
-
require 'selenium/webdriver/safari/server'
|
76
|
-
require 'selenium/webdriver/safari/options'
|
77
|
-
require 'selenium/webdriver/safari/legacy_bridge'
|
78
|
-
require 'selenium/webdriver/safari/apple_bridge'
|
63
|
+
require 'selenium/webdriver/safari/bridge'
|
79
64
|
require 'selenium/webdriver/safari/service'
|
80
|
-
|
81
|
-
Selenium::WebDriver::Safari::Bridge = Selenium::WebDriver::Safari::LegacyBridge
|
@@ -21,16 +21,17 @@ module Selenium
|
|
21
21
|
module WebDriver
|
22
22
|
module Safari
|
23
23
|
# @api private
|
24
|
-
class
|
24
|
+
class Bridge < Remote::Bridge
|
25
25
|
def initialize(opts = {})
|
26
26
|
opts[:desired_capabilities] ||= Remote::Capabilities.safari
|
27
|
+
port = opts.delete(:port) || Service::DEFAULT_PORT
|
28
|
+
service_args = opts.delete(:service_args) || {}
|
27
29
|
|
28
|
-
@service = Service.new(Safari.driver_path,
|
30
|
+
@service = Service.new(Safari.driver_path, port, *extract_service_args(service_args))
|
29
31
|
@service.start
|
30
|
-
|
31
32
|
opts[:url] = @service.uri
|
32
33
|
|
33
|
-
super
|
34
|
+
super(opts)
|
34
35
|
end
|
35
36
|
|
36
37
|
def quit
|
@@ -41,11 +42,10 @@ module Selenium
|
|
41
42
|
|
42
43
|
private
|
43
44
|
|
44
|
-
def extract_service_args(
|
45
|
-
|
46
|
-
service_log_path ? ["--log-path=#{service_log_path}"] : []
|
45
|
+
def extract_service_args(args = {})
|
46
|
+
args.key?(:port) ? ["--port=#{args[:port]}"] : []
|
47
47
|
end
|
48
|
-
end #
|
48
|
+
end # Bridge
|
49
49
|
end # Safari
|
50
50
|
end # WebDriver
|
51
51
|
end # Selenium
|
data/selenium-webdriver.gemspec
CHANGED
@@ -5,7 +5,7 @@ raise "cwd must be #{root} when reading gemspec" if root != Dir.pwd
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'selenium-webdriver'
|
8
|
-
s.version = '3.0.0.
|
8
|
+
s.version = '3.0.0.beta4.0'
|
9
9
|
|
10
10
|
s.authors = ['Alex Rodionov', 'Titus Fortner']
|
11
11
|
s.email = ['p0deje@gmail.com', 'titusfortner@gmail.com']
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: selenium-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 3.0.0.
|
5
|
+
version: 3.0.0.beta4.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alex Rodionov
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2016-
|
14
|
+
date: 2016-10-04 00:00:00 -05:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -219,13 +219,8 @@ files:
|
|
219
219
|
- lib/selenium/webdriver/remote/http/curb.rb
|
220
220
|
- lib/selenium/webdriver/remote/http/default.rb
|
221
221
|
- lib/selenium/webdriver/remote/http/persistent.rb
|
222
|
-
- lib/selenium/webdriver/safari/
|
223
|
-
- lib/selenium/webdriver/safari/browser.rb
|
224
|
-
- lib/selenium/webdriver/safari/legacy_bridge.rb
|
225
|
-
- lib/selenium/webdriver/safari/options.rb
|
226
|
-
- lib/selenium/webdriver/safari/server.rb
|
222
|
+
- lib/selenium/webdriver/safari/bridge.rb
|
227
223
|
- lib/selenium/webdriver/safari/service.rb
|
228
|
-
- lib/selenium/webdriver/safari/resources/client.js
|
229
224
|
- lib/selenium/webdriver/support/abstract_event_listener.rb
|
230
225
|
- lib/selenium/webdriver/support/block_event_listener.rb
|
231
226
|
- lib/selenium/webdriver/support/color.rb
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
-
# or more contributor license agreements. See the NOTICE file
|
5
|
-
# distributed with this work for additional information
|
6
|
-
# regarding copyright ownership. The SFC licenses this file
|
7
|
-
# to you under the Apache License, Version 2.0 (the
|
8
|
-
# "License"); you may not use this file except in compliance
|
9
|
-
# with the License. You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing,
|
14
|
-
# software distributed under the License is distributed on an
|
15
|
-
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
-
# KIND, either express or implied. See the License for the
|
17
|
-
# specific language governing permissions and limitations
|
18
|
-
# under the License.
|
19
|
-
|
20
|
-
module Selenium
|
21
|
-
module WebDriver
|
22
|
-
module Safari
|
23
|
-
class Browser
|
24
|
-
def start(*args)
|
25
|
-
Platform.exit_hook { stop } # make sure we don't leave the browser running
|
26
|
-
|
27
|
-
@process = ChildProcess.new(Safari.path, *args)
|
28
|
-
@process.io.inherit! if $DEBUG
|
29
|
-
@process.start
|
30
|
-
end
|
31
|
-
|
32
|
-
def stop
|
33
|
-
@process.stop if @process
|
34
|
-
end
|
35
|
-
end # Browser
|
36
|
-
end # Safari
|
37
|
-
end # WebDriver
|
38
|
-
end # Selenium
|
@@ -1,138 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
-
# or more contributor license agreements. See the NOTICE file
|
5
|
-
# distributed with this work for additional information
|
6
|
-
# regarding copyright ownership. The SFC licenses this file
|
7
|
-
# to you under the Apache License, Version 2.0 (the
|
8
|
-
# "License"); you may not use this file except in compliance
|
9
|
-
# with the License. You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing,
|
14
|
-
# software distributed under the License is distributed on an
|
15
|
-
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
-
# KIND, either express or implied. See the License for the
|
17
|
-
# specific language governing permissions and limitations
|
18
|
-
# under the License.
|
19
|
-
|
20
|
-
module Selenium
|
21
|
-
module WebDriver
|
22
|
-
module Safari
|
23
|
-
# @api private
|
24
|
-
class LegacyBridge < Remote::Bridge
|
25
|
-
COMMAND_TIMEOUT = 60
|
26
|
-
|
27
|
-
def self.legacy?
|
28
|
-
!File.exist?(Safari.driver_path)
|
29
|
-
end
|
30
|
-
|
31
|
-
def initialize(opts = {})
|
32
|
-
command_timeout = Integer(opts[:timeout] || COMMAND_TIMEOUT)
|
33
|
-
safari_options = opts.delete(:options) || Safari::Options.new(opts)
|
34
|
-
capabilities = merge_capabilities(opts, safari_options)
|
35
|
-
|
36
|
-
@command_id ||= 0
|
37
|
-
|
38
|
-
# TODO: handle safari_opts['cleanSession']
|
39
|
-
@server = Server.new(safari_options.port, command_timeout)
|
40
|
-
@server.start
|
41
|
-
|
42
|
-
@safari = Browser.new
|
43
|
-
@safari.start(prepare_connect_file)
|
44
|
-
|
45
|
-
@server.wait_for_connection
|
46
|
-
|
47
|
-
super(desired_capabilities: capabilities)
|
48
|
-
end
|
49
|
-
|
50
|
-
def quit
|
51
|
-
super
|
52
|
-
|
53
|
-
@server.stop
|
54
|
-
@safari.stop
|
55
|
-
end
|
56
|
-
|
57
|
-
def driver_extensions
|
58
|
-
[
|
59
|
-
DriverExtensions::TakesScreenshot,
|
60
|
-
DriverExtensions::HasInputDevices
|
61
|
-
]
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
def create_session(desired_capabilities)
|
67
|
-
resp = raw_execute :newSession, {}, {desiredCapabilities: desired_capabilities}
|
68
|
-
Remote::Capabilities.json_create resp.fetch('value')
|
69
|
-
end
|
70
|
-
|
71
|
-
def raw_execute(command, opts = {}, command_hash = nil)
|
72
|
-
@command_id += 1
|
73
|
-
|
74
|
-
params = {}
|
75
|
-
opts.each do |key, value|
|
76
|
-
params[camel_case(key.to_s)] = value
|
77
|
-
end
|
78
|
-
|
79
|
-
params.merge!(command_hash) if command_hash
|
80
|
-
|
81
|
-
@server.send(
|
82
|
-
origin: 'webdriver',
|
83
|
-
type: 'command',
|
84
|
-
command: {id: @command_id.to_s, name: command, parameters: params}
|
85
|
-
)
|
86
|
-
|
87
|
-
raw = @server.receive
|
88
|
-
response = raw.fetch('response')
|
89
|
-
|
90
|
-
status_code = response['status']
|
91
|
-
if status_code != 0
|
92
|
-
raise Error.for_code(status_code), response['value']['message']
|
93
|
-
end
|
94
|
-
|
95
|
-
if raw['id'].to_s != @command_id.to_s
|
96
|
-
raise Error::WebDriverError, "response id does not match command id: #{raw['id']} != #{@command_id}"
|
97
|
-
end
|
98
|
-
|
99
|
-
response
|
100
|
-
end
|
101
|
-
|
102
|
-
def camel_case(str)
|
103
|
-
parts = str.split('_')
|
104
|
-
parts[1..-1].map(&:capitalize!)
|
105
|
-
|
106
|
-
parts.join
|
107
|
-
end
|
108
|
-
|
109
|
-
def prepare_connect_file
|
110
|
-
# TODO: use tempfile?
|
111
|
-
path = File.join(Dir.tmpdir, "safaridriver-#{Time.now.usec}.html")
|
112
|
-
|
113
|
-
File.open(path, 'w') do |io|
|
114
|
-
io << "<!DOCTYPE html><script>window.location = '#{@server.uri}';</script>"
|
115
|
-
end
|
116
|
-
|
117
|
-
FileReaper << path
|
118
|
-
path.tr! '/', '\\' if Platform.windows?
|
119
|
-
|
120
|
-
path
|
121
|
-
end
|
122
|
-
|
123
|
-
def merge_capabilities(opts, safari_options)
|
124
|
-
caps = safari_options.to_capabilities
|
125
|
-
other = opts[:desired_capabilities]
|
126
|
-
|
127
|
-
if other
|
128
|
-
other = opts[:desired_capabilities].as_json
|
129
|
-
caps['safari.options'].merge!(other.delete('safari.options') || {})
|
130
|
-
caps.merge!(other)
|
131
|
-
end
|
132
|
-
|
133
|
-
caps
|
134
|
-
end
|
135
|
-
end # Bridge
|
136
|
-
end # Safari
|
137
|
-
end # WebDriver
|
138
|
-
end # Selenium
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
-
# or more contributor license agreements. See the NOTICE file
|
5
|
-
# distributed with this work for additional information
|
6
|
-
# regarding copyright ownership. The SFC licenses this file
|
7
|
-
# to you under the Apache License, Version 2.0 (the
|
8
|
-
# "License"); you may not use this file except in compliance
|
9
|
-
# with the License. You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing,
|
14
|
-
# software distributed under the License is distributed on an
|
15
|
-
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
-
# KIND, either express or implied. See the License for the
|
17
|
-
# specific language governing permissions and limitations
|
18
|
-
# under the License.
|
19
|
-
|
20
|
-
module Selenium
|
21
|
-
module WebDriver
|
22
|
-
module Safari
|
23
|
-
class Options
|
24
|
-
DEFAULT_PORT = 56485
|
25
|
-
|
26
|
-
attr_accessor :port, :data_dir, :skip_extension_installation
|
27
|
-
|
28
|
-
def initialize(opts = {})
|
29
|
-
extract_options(opts)
|
30
|
-
end
|
31
|
-
|
32
|
-
def clean_session?
|
33
|
-
@clean_session == true
|
34
|
-
end
|
35
|
-
|
36
|
-
def to_capabilities
|
37
|
-
caps = Remote::Capabilities.safari
|
38
|
-
caps['safari.options'] = as_json
|
39
|
-
|
40
|
-
caps
|
41
|
-
end
|
42
|
-
|
43
|
-
def as_json
|
44
|
-
{
|
45
|
-
'port' => port,
|
46
|
-
'dataDir' => data_dir,
|
47
|
-
'cleanSession' => clean_session?
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def extract_options(opts)
|
54
|
-
@port = Integer(opts[:port] || DEFAULT_PORT)
|
55
|
-
@data_dir = opts[:custom_data_dir] || opts[:data_dir]
|
56
|
-
@clean_session = opts[:clean_session]
|
57
|
-
end
|
58
|
-
end # Options
|
59
|
-
end # Safari
|
60
|
-
end # WebDriver
|
61
|
-
end # Selenium
|