Skip to content

Commit a497c5b

Browse files
authored
[rb] output driver logs when SE_DEBUG is enabled (#16901)
* [rb] driver logs sent to stderr at verbose level when SE_DEBUG environment variable is set * [rb] warn when SE_DEBUG overrides user logging settings * Add Logger#debug! and Logger#stderr! to force settings and prevent overrides
1 parent 2f9fc2b commit a497c5b

File tree

19 files changed

+252
-8
lines changed

19 files changed

+252
-8
lines changed

rb/lib/selenium/webdriver.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ def self.for(*)
9696

9797
def self.logger(**)
9898
level = $DEBUG || ENV.key?('DEBUG') || ENV.key?('SE_DEBUG') ? :debug : :info
99-
@logger ||= WebDriver::Logger.new('Selenium', default_level: level, **)
99+
@logger ||= WebDriver::Logger.new('Selenium', default_level: level, **).tap do |logger|
100+
if ENV.key?('SE_DEBUG')
101+
logger.debug!
102+
logger.stderr!
103+
end
104+
end
100105
end
101106
end # WebDriver
102107
end # Selenium

rb/lib/selenium/webdriver/chrome/service.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ class Service < WebDriver::Service
2626
SHUTDOWN_SUPPORTED = true
2727
DRIVER_PATH_ENV_KEY = 'SE_CHROMEDRIVER'
2828

29+
def initialize(args: nil, **)
30+
if ENV.key?('SE_DEBUG')
31+
args = Array(args.dup)
32+
warn_driver_log_override if args.reject! { |arg| arg.include?('log-level') || arg.include?('silent') }
33+
args << '--verbose'
34+
end
35+
36+
super
37+
end
38+
2939
def log
3040
return @log unless @log.is_a? String
3141

rb/lib/selenium/webdriver/common/logger.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,32 @@ def initialize(progname = 'Selenium', default_level: nil, ignored: nil, allowed:
5555
@ignored = Array(ignored)
5656
@allowed = Array(allowed)
5757
@first_warning = false
58+
@level_forced = false
59+
@output_forced = false
60+
end
61+
62+
#
63+
# Forces debug level and prevents it from being overridden.
64+
#
65+
def debug!
66+
@level_forced = true
67+
@logger.level = :debug
68+
end
69+
70+
#
71+
# Forces output to stderr and prevents it from being overridden.
72+
#
73+
def stderr!
74+
@output_forced = true
75+
@logger.reopen($stderr)
5876
end
5977

6078
def level=(level)
79+
if @level_forced
80+
warn('Logger level is forced; ignoring override', id: :logger)
81+
return
82+
end
83+
6184
if level == :info && @logger.level == :info
6285
info(':info is now the default log level, to see additional logging, set log level to :debug')
6386
end
@@ -71,6 +94,11 @@ def level=(level)
7194
# @param [String] io
7295
#
7396
def output=(io)
97+
if @output_forced
98+
warn('Logger output is forced; ignoring override', id: :logger)
99+
return
100+
end
101+
74102
@logger.reopen(io)
75103
end
76104

rb/lib/selenium/webdriver/common/service.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ def find_driver_path
104104
def env_path
105105
ENV.fetch(self.class::DRIVER_PATH_ENV_KEY, nil)
106106
end
107+
108+
private
109+
110+
def warn_driver_log_override
111+
WebDriver.logger.warn('SE_DEBUG is set; overriding user-specified driver logging settings', id: :se_debug)
112+
end
107113
end # Service
108114
end # WebDriver
109115
end # Selenium

rb/lib/selenium/webdriver/common/service_manager.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,13 @@ def uri
8080
def build_process(*command)
8181
WebDriver.logger.debug("Executing Process #{command}", id: :driver_service)
8282
@process = ChildProcess.build(*command)
83-
@io ||= WebDriver.logger.io if WebDriver.logger.debug?
83+
if ENV.key?('SE_DEBUG')
84+
if @io && @io != WebDriver.logger.io
85+
WebDriver.logger.warn('SE_DEBUG is set; overriding user-specified driver log output to use stderr',
86+
id: :se_debug)
87+
end
88+
@io = WebDriver.logger.io
89+
end
8490
@process.io = @io if @io
8591

8692
@process

rb/lib/selenium/webdriver/edge/service.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ class Service < WebDriver::Service
2525
EXECUTABLE = 'msedgedriver'
2626
SHUTDOWN_SUPPORTED = true
2727
DRIVER_PATH_ENV_KEY = 'SE_EDGEDRIVER'
28+
29+
def initialize(args: nil, **)
30+
if ENV.key?('SE_DEBUG')
31+
args = Array(args.dup)
32+
warn_driver_log_override if args.reject! { |arg| arg.include?('log-level') || arg.include?('silent') }
33+
args << '--verbose'
34+
end
35+
36+
super
37+
end
38+
2839
def log
2940
return @log unless @log.is_a? String
3041

rb/lib/selenium/webdriver/firefox/service.rb

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,33 @@ class Service < WebDriver::Service
2626
SHUTDOWN_SUPPORTED = false
2727
DRIVER_PATH_ENV_KEY = 'SE_GECKODRIVER'
2828

29-
def initialize(path: nil, port: nil, log: nil, args: nil)
30-
args ||= []
29+
def initialize(args: nil, **)
30+
args = Array(args.dup)
3131
unless args.any? { |arg| arg.include?('--connect-existing') || arg.include?('--websocket-port') }
3232
args << '--websocket-port'
3333
args << '0'
3434
end
35+
36+
if ENV.key?('SE_DEBUG')
37+
remove_log_args(args)
38+
args << '-v'
39+
end
40+
3541
super
3642
end
43+
44+
private
45+
46+
def remove_log_args(args)
47+
if (index = args.index('--log'))
48+
args.delete_at(index) # delete '--log'
49+
args.delete_at(index) if args[index] && !args[index].start_with?('-') # delete value if present
50+
warn_driver_log_override
51+
elsif (index = args.index { |arg| arg.start_with?('--log=') })
52+
args.delete_at(index)
53+
warn_driver_log_override
54+
end
55+
end
3756
end # Service
3857
end # Firefox
3958
end # WebDriver

rb/lib/selenium/webdriver/ie/service.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ class Service < WebDriver::Service
2525
EXECUTABLE = 'IEDriverServer'
2626
SHUTDOWN_SUPPORTED = true
2727
DRIVER_PATH_ENV_KEY = 'SE_IEDRIVER'
28+
29+
def initialize(args: nil, **)
30+
if ENV.key?('SE_DEBUG')
31+
args = Array(args.dup)
32+
warn_driver_log_override if args.reject! { |arg| arg.include?('log-level') || arg.include?('silent') }
33+
args << '--log-level=DEBUG'
34+
end
35+
36+
super
37+
end
2838
end # Server
2939
end # IE
3040
end # WebDriver

rb/sig/lib/selenium/webdriver/chrome/service.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ module Selenium
1212

1313
SHUTDOWN_SUPPORTED: bool
1414

15+
def initialize: (?args: Array[String]?, **untyped) -> void
16+
1517
def log: () -> untyped
1618
end
1719
end

rb/sig/lib/selenium/webdriver/common/logger.rbs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@ module Selenium
44

55
@allowed: Array[Symbol]
66
@first_warning: bool
7+
@level_forced: bool
8+
@output_forced: bool
79

810
@ignored: Array[Symbol]
911
@logger: ::Logger
1012

1113
def initialize: (?::String progname, ?default_level: Symbol? default_level, ?ignored: Array[Symbol]? ignored, ?allowed: Array[Symbol]? allowed) -> void
1214

13-
def level=: (Symbol level) -> Symbol
15+
def debug!: () -> void
1416

15-
def output=: (String io) -> ::Logger
17+
def stderr!: () -> void
18+
19+
def level=: (Symbol level) -> Symbol?
20+
21+
def output=: (String io) -> ::Logger?
1622

1723
def io: () -> IO
1824

0 commit comments

Comments
 (0)