webdrivers 3.9.1 → 3.9.2
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 +5 -5
- data/.github/ISSUE_TEMPLATE.md +13 -13
- data/.gitignore +7 -7
- data/.rubocop.yml +44 -44
- data/.travis.yml +24 -24
- data/CHANGELOG.md +137 -133
- data/Gemfile +6 -6
- data/LICENSE.txt +22 -22
- data/README.md +169 -169
- data/Rakefile +11 -11
- data/appveyor.yml +22 -22
- data/lib/webdrivers.rb +6 -6
- data/lib/webdrivers/chromedriver.rb +185 -167
- data/lib/webdrivers/common.rb +191 -157
- data/lib/webdrivers/geckodriver.rb +80 -72
- data/lib/webdrivers/iedriver.rb +70 -62
- data/lib/webdrivers/logger.rb +111 -111
- data/lib/webdrivers/mswebdriver.rb +55 -55
- data/lib/webdrivers/network.rb +61 -58
- data/lib/webdrivers/system.rb +154 -151
- data/spec/spec_helper.rb +18 -18
- data/spec/webdrivers/chromedriver_spec.rb +257 -243
- data/spec/webdrivers/geckodriver_spec.rb +210 -210
- data/spec/webdrivers/i_edriver_spec.rb +192 -192
- data/spec/webdrivers/ms_webdriver_spec.rb +30 -30
- data/spec/webdrivers_proxy_support_spec.rb +53 -53
- data/webdrivers.gemspec +31 -31
- metadata +4 -11
@@ -1,72 +1,80 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'webdrivers/common'
|
5
|
-
|
6
|
-
module Webdrivers
|
7
|
-
class Geckodriver < Common
|
8
|
-
class << self
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'webdrivers/common'
|
5
|
+
|
6
|
+
module Webdrivers
|
7
|
+
class Geckodriver < Common
|
8
|
+
class << self
|
9
|
+
#
|
10
|
+
# Returns current geckodriver version.
|
11
|
+
#
|
12
|
+
# @return [Gem::Version]
|
13
|
+
def current_version
|
14
|
+
Webdrivers.logger.debug 'Checking current version'
|
15
|
+
return nil unless exists?
|
16
|
+
|
17
|
+
version = binary_version
|
18
|
+
return nil if version.nil?
|
19
|
+
|
20
|
+
normalize_version version.match(/geckodriver (\d+\.\d+\.\d+)/)[1]
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Returns latest available geckodriver version.
|
25
|
+
#
|
26
|
+
# @return [Gem::Version]
|
27
|
+
def latest_version
|
28
|
+
@latest_version ||= with_cache(file_name) { normalize_version(Network.get_url("#{base_url}/latest")[/[^v]*$/]) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def file_name
|
34
|
+
System.platform == 'win' ? 'geckodriver.exe' : 'geckodriver'
|
35
|
+
end
|
36
|
+
|
37
|
+
def base_url
|
38
|
+
'https://github.com/mozilla/geckodriver/releases'
|
39
|
+
end
|
40
|
+
|
41
|
+
def download_url
|
42
|
+
@download_url ||= if required_version == EMPTY_VERSION
|
43
|
+
direct_url(latest_version)
|
44
|
+
else
|
45
|
+
direct_url(required_version)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def direct_url(version)
|
50
|
+
"#{base_url}/download/v#{version}/geckodriver-v#{version}-#{platform_ext}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def platform_ext
|
54
|
+
case System.platform
|
55
|
+
when 'linux'
|
56
|
+
"linux#{System.bitsize}.tar.gz"
|
57
|
+
when 'mac'
|
58
|
+
'macos.tar.gz'
|
59
|
+
when 'win'
|
60
|
+
"win#{System.bitsize}.zip"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
68
|
+
::Selenium::WebDriver::Firefox::Service.driver_path = proc { ::Webdrivers::Geckodriver.update }
|
69
|
+
else
|
70
|
+
# v3.141.0 and lower
|
71
|
+
module Selenium
|
72
|
+
module WebDriver
|
73
|
+
module Firefox
|
74
|
+
def self.driver_path
|
75
|
+
@driver_path ||= Webdrivers::Geckodriver.update
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/webdrivers/iedriver.rb
CHANGED
@@ -1,62 +1,70 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'rubygems/version'
|
5
|
-
require 'webdrivers/common'
|
6
|
-
|
7
|
-
module Webdrivers
|
8
|
-
class IEdriver < Common
|
9
|
-
class << self
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'rubygems/version'
|
5
|
+
require 'webdrivers/common'
|
6
|
+
|
7
|
+
module Webdrivers
|
8
|
+
class IEdriver < Common
|
9
|
+
class << self
|
10
|
+
#
|
11
|
+
# Returns current IEDriverServer.exe version.
|
12
|
+
#
|
13
|
+
# @return [Gem::Version]
|
14
|
+
def current_version
|
15
|
+
Webdrivers.logger.debug 'Checking current version'
|
16
|
+
return nil unless exists?
|
17
|
+
|
18
|
+
version = binary_version
|
19
|
+
return nil if version.nil?
|
20
|
+
|
21
|
+
normalize_version version.match(/IEDriverServer.exe (\d\.\d+\.\d+)/)[1]
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Returns latest available IEDriverServer.exe version.
|
26
|
+
#
|
27
|
+
# @return [Gem::Version]
|
28
|
+
def latest_version
|
29
|
+
@latest_version ||= with_cache(file_name) { downloads.keys.max }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def file_name
|
35
|
+
'IEDriverServer.exe'
|
36
|
+
end
|
37
|
+
|
38
|
+
def base_url
|
39
|
+
'https://selenium-release.storage.googleapis.com/'
|
40
|
+
end
|
41
|
+
|
42
|
+
def downloads
|
43
|
+
doc = Nokogiri::XML.parse(Network.get(base_url))
|
44
|
+
items = doc.css('Key').collect(&:text)
|
45
|
+
items.select! { |item| item.include?('IEDriverServer_Win32') }
|
46
|
+
ds = items.each_with_object({}) do |item, hash|
|
47
|
+
key = normalize_version item[/([^_]+)\.zip/, 1]
|
48
|
+
hash[key] = "#{base_url}#{item}"
|
49
|
+
end
|
50
|
+
Webdrivers.logger.debug "Versions now located on downloads site: #{ds.keys}"
|
51
|
+
ds
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
58
|
+
::Selenium::WebDriver::IE::Service.driver_path = proc { ::Webdrivers::IEdriver.update }
|
59
|
+
else
|
60
|
+
# v3.141.0 and lower
|
61
|
+
module Selenium
|
62
|
+
module WebDriver
|
63
|
+
module IE
|
64
|
+
def self.driver_path
|
65
|
+
@driver_path ||= Webdrivers::IEdriver.update
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/webdrivers/logger.rb
CHANGED
@@ -1,111 +1,111 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'forwardable'
|
4
|
-
require 'logger'
|
5
|
-
|
6
|
-
# Code adapted from Selenium Implementation
|
7
|
-
# https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/logger.rb
|
8
|
-
|
9
|
-
module Webdrivers
|
10
|
-
#
|
11
|
-
# @example Enable full logging
|
12
|
-
# Webdrivers.logger.level = :debug
|
13
|
-
#
|
14
|
-
# @example Log to file
|
15
|
-
# Webdrivers.logger.output = 'webdrivers.log'
|
16
|
-
#
|
17
|
-
# @example Use logger manually
|
18
|
-
# Webdrivers.logger.info('This is info message')
|
19
|
-
# Webdrivers.logger.warn('This is warning message')
|
20
|
-
#
|
21
|
-
class Logger
|
22
|
-
extend Forwardable
|
23
|
-
include ::Logger::Severity
|
24
|
-
|
25
|
-
def_delegators :@logger, :debug, :debug?,
|
26
|
-
:info, :info?,
|
27
|
-
:warn, :warn?,
|
28
|
-
:error, :error?,
|
29
|
-
:fatal, :fatal?,
|
30
|
-
:level
|
31
|
-
|
32
|
-
def initialize
|
33
|
-
@logger = create_logger($stdout)
|
34
|
-
end
|
35
|
-
|
36
|
-
def output=(io)
|
37
|
-
# `Logger#reopen` was added in Ruby 2.3
|
38
|
-
if @logger.respond_to?(:reopen)
|
39
|
-
@logger.reopen(io)
|
40
|
-
else
|
41
|
-
@logger = create_logger(io)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
#
|
46
|
-
# For Ruby < 2.3 compatibility
|
47
|
-
# Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
|
48
|
-
#
|
49
|
-
|
50
|
-
def level=(severity)
|
51
|
-
if severity.is_a?(Integer)
|
52
|
-
@logger.level = severity
|
53
|
-
else
|
54
|
-
case severity.to_s.downcase
|
55
|
-
when 'debug'
|
56
|
-
@logger.level = DEBUG
|
57
|
-
when 'info'
|
58
|
-
@logger.level = INFO
|
59
|
-
when 'warn'
|
60
|
-
@logger.level = WARN
|
61
|
-
when 'error'
|
62
|
-
@logger.level = ERROR
|
63
|
-
when 'fatal'
|
64
|
-
@logger.level = FATAL
|
65
|
-
when 'unknown'
|
66
|
-
@logger.level = UNKNOWN
|
67
|
-
else
|
68
|
-
raise ArgumentError, "invalid log level: #{severity}"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
#
|
74
|
-
# Returns IO object used by logger internally.
|
75
|
-
#
|
76
|
-
# Normally, we would have never needed it, but we want to
|
77
|
-
# use it as IO object for all child processes to ensure their
|
78
|
-
# output is redirected there.
|
79
|
-
#
|
80
|
-
# It is only used in debug level, in other cases output is suppressed.
|
81
|
-
#
|
82
|
-
# @api private
|
83
|
-
#
|
84
|
-
def io
|
85
|
-
@logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
|
86
|
-
end
|
87
|
-
|
88
|
-
#
|
89
|
-
# Marks code as deprecated with replacement.
|
90
|
-
#
|
91
|
-
# @param [String] old
|
92
|
-
# @param [String] new
|
93
|
-
#
|
94
|
-
def deprecate(old, new)
|
95
|
-
warn "[DEPRECATION] #{old} is deprecated. Use #{new} instead."
|
96
|
-
end
|
97
|
-
|
98
|
-
private
|
99
|
-
|
100
|
-
def create_logger(output)
|
101
|
-
logger = ::Logger.new(output)
|
102
|
-
logger.progname = 'Webdrivers'
|
103
|
-
logger.level = ($DEBUG ? DEBUG : WARN)
|
104
|
-
logger.formatter = proc do |severity, time, progname, msg|
|
105
|
-
"#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
|
106
|
-
end
|
107
|
-
|
108
|
-
logger
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
# Code adapted from Selenium Implementation
|
7
|
+
# https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/logger.rb
|
8
|
+
|
9
|
+
module Webdrivers
|
10
|
+
#
|
11
|
+
# @example Enable full logging
|
12
|
+
# Webdrivers.logger.level = :debug
|
13
|
+
#
|
14
|
+
# @example Log to file
|
15
|
+
# Webdrivers.logger.output = 'webdrivers.log'
|
16
|
+
#
|
17
|
+
# @example Use logger manually
|
18
|
+
# Webdrivers.logger.info('This is info message')
|
19
|
+
# Webdrivers.logger.warn('This is warning message')
|
20
|
+
#
|
21
|
+
class Logger
|
22
|
+
extend Forwardable
|
23
|
+
include ::Logger::Severity
|
24
|
+
|
25
|
+
def_delegators :@logger, :debug, :debug?,
|
26
|
+
:info, :info?,
|
27
|
+
:warn, :warn?,
|
28
|
+
:error, :error?,
|
29
|
+
:fatal, :fatal?,
|
30
|
+
:level
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
@logger = create_logger($stdout)
|
34
|
+
end
|
35
|
+
|
36
|
+
def output=(io)
|
37
|
+
# `Logger#reopen` was added in Ruby 2.3
|
38
|
+
if @logger.respond_to?(:reopen)
|
39
|
+
@logger.reopen(io)
|
40
|
+
else
|
41
|
+
@logger = create_logger(io)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# For Ruby < 2.3 compatibility
|
47
|
+
# Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
|
48
|
+
#
|
49
|
+
|
50
|
+
def level=(severity)
|
51
|
+
if severity.is_a?(Integer)
|
52
|
+
@logger.level = severity
|
53
|
+
else
|
54
|
+
case severity.to_s.downcase
|
55
|
+
when 'debug'
|
56
|
+
@logger.level = DEBUG
|
57
|
+
when 'info'
|
58
|
+
@logger.level = INFO
|
59
|
+
when 'warn'
|
60
|
+
@logger.level = WARN
|
61
|
+
when 'error'
|
62
|
+
@logger.level = ERROR
|
63
|
+
when 'fatal'
|
64
|
+
@logger.level = FATAL
|
65
|
+
when 'unknown'
|
66
|
+
@logger.level = UNKNOWN
|
67
|
+
else
|
68
|
+
raise ArgumentError, "invalid log level: #{severity}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Returns IO object used by logger internally.
|
75
|
+
#
|
76
|
+
# Normally, we would have never needed it, but we want to
|
77
|
+
# use it as IO object for all child processes to ensure their
|
78
|
+
# output is redirected there.
|
79
|
+
#
|
80
|
+
# It is only used in debug level, in other cases output is suppressed.
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
#
|
84
|
+
def io
|
85
|
+
@logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# Marks code as deprecated with replacement.
|
90
|
+
#
|
91
|
+
# @param [String] old
|
92
|
+
# @param [String] new
|
93
|
+
#
|
94
|
+
def deprecate(old, new)
|
95
|
+
warn "[DEPRECATION] #{old} is deprecated. Use #{new} instead."
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def create_logger(output)
|
101
|
+
logger = ::Logger.new(output)
|
102
|
+
logger.progname = 'Webdrivers'
|
103
|
+
logger.level = ($DEBUG ? DEBUG : WARN)
|
104
|
+
logger.formatter = proc do |severity, time, progname, msg|
|
105
|
+
"#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
|
106
|
+
end
|
107
|
+
|
108
|
+
logger
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|