Logging Selenium commands
Turning on logging is a valuable way to get extra information that might help you determine why you might be having a problem.
Getting a logger
Java logs are typically created per class. You can work with the default logger to work with all loggers. To filter out specific classes, see Filtering
Get the root logger:
Logger logger = Logger.getLogger("");
Java Logging is not exactly straightforward, and if you are just looking for an easy way to look at the important Selenium logs, take a look at the Selenium Logger project
Python logs are typically created per module. You can match all submodules by referencing the top level module. So to work with all loggers in selenium module, you can do this:
logger = logging.getLogger('selenium')
.NET does not currently have a Logging implementation
If you want to see as much debugging as possible in all the classes,
you can turn on debugging globally in Ruby by setting $DEBUG = true
.
For more fine-tuned control, Ruby Selenium created its own Logger class to wrap the default Logger
class.
This implementation provides some interesting additional features.
Obtain the logger directly from the #logger
class method on the Selenium::WebDriver
module:
logger = Selenium::WebDriver.logger
const logging = require('selenium-webdriver/lib/logging')
logger = logging.getLogger('webdriver')
Content Help
Check our contribution guidelines if you’d like to help.
Logger level
Logger level helps to filter out logs based on their severity.
Java has 7 logger levels: SEVERE
, WARNING
, INFO
, CONFIG
, FINE
, FINER
, and FINEST
.
The default is INFO
.
You have to change both the level of the logger and the level of the handlers on the root logger:
logger.setLevel(Level.FINE);
Arrays.stream(logger.getHandlers()).forEach(handler -> {
handler.setLevel(Level.FINE);
});
Python has 6 logger levels: CRITICAL
, ERROR
, WARNING
, INFO
, DEBUG
, and NOTSET
.
The default is WARNING
To change the level of the logger:
logger.setLevel(logging.DEBUG)
Things get complicated when you use PyTest, though. By default, PyTest hides logging unless the test fails. You need to set 3 things to get PyTest to display logs on passing tests.
To always output logs with PyTest you need to run with additional arguments.
First, -s
to prevent PyTest from capturing the console.
Second, -p no:logging
, which allows you to override the default PyTest logging settings so logs can
be displayed regardless of errors.
So you need to set these flags in your IDE, or run PyTest on command line like:
pytest -s -p no:logging
Finally, since you turned off logging in the arguments above, you now need to add configuration to turn it back on:
logging.basicConfig(level=logging.WARN)
.NET does not currently have a Logging implementation
Ruby logger has 5 logger levels: :debug
, :info
, :warn
, :error
, :fatal
.
The default is :info
.
To change the level of the logger:
logger.level = :debug
JavaScript has 9 logger levels: OFF
, SEVERE
, WARNING
, INFO
, DEBUG
, FINE
, FINER
, FINEST
, ALL
.
The default is OFF
.
To change the level of the logger:
logger.setLevel(logging.Level.INFO)
Content Help
Check our contribution guidelines if you’d like to help.
Actionable items
Things are logged as warnings if they are something the user needs to take action on. This is often used for deprecations. For various reasons, Selenium project does not follow standard Semantic Versioning practices. Our policy is to mark things as deprecated for 3 releases and then remove them, so deprecations may be logged as warnings.
Java logs actionable content at logger level WARN
Example:
May 08, 2023 9:23:38 PM dev.selenium.troubleshooting.LoggingTest logging
WARNING: this is a warning
Python logs actionable content at logger level — WARNING
Details about deprecations are logged at this level.
Example:
WARNING selenium:test_logging.py:23 this is a warning
.NET does not currently have a Logging implementation
Ruby logs actionable content at logger level — :warn
.
Details about deprecations are logged at this level.
For example:
2023-05-08 20:53:13 WARN Selenium [:example_id] this is a warning
Because these items can get annoying, we’ve provided an easy way to turn them off, see filtering section below.
Content Help
Check our contribution guidelines if you’d like to help.
Content Help
Check our contribution guidelines if you’d like to help.
Useful information
This is the default level where Selenium logs things that users should be aware of but do not need to take actions on. This might reference a new method or direct users to more information about something
Java logs useful information at logger level INFO
Example:
May 08, 2023 9:23:38 PM dev.selenium.troubleshooting.LoggingTest logging
INFO: this is useful information
Python logs useful information at logger level — INFO
Example:
INFO selenium:test_logging.py:22 this is useful information
.NET does not currently have a Logging implementation
Ruby logs useful information at logger level — :info
.
Example:
2023-05-08 20:53:13 INFO Selenium [:example_id] this is useful information
Logs useful information at level: INFO
Content Help
Check our contribution guidelines if you’d like to help.
Debugging Details
The debug log level is used for information that may be needed for diagnosing issues and troubleshooting problems.
Java logs most debug content at logger level FINE
Example:
May 08, 2023 9:23:38 PM dev.selenium.troubleshooting.LoggingTest logging
FINE: this is detailed debug information
Python logs debugging details at logger level — DEBUG
Example:
DEBUG selenium:test_logging.py:24 this is detailed debug information
.NET does not currently have a Logging implementation
Ruby only provides one level for debugging, so all details are at logger level — :debug
.
Example:
2023-05-08 20:53:13 DEBUG Selenium [:example_id] this is detailed debug information
Logs debugging details at level: FINER
and FINEST
Content Help
Check our contribution guidelines if you’d like to help.
Logger output
Logs can be displayed in the console or stored in a file. Different languages have different defaults.
By default all logs are sent to System.err
. To direct output to a file, you need to add a handler:
Handler handler = new FileHandler("selenium.xml");
logger.addHandler(handler);
By default all logs are sent to sys.stderr
. To direct output somewhere else, you need to add a
handler with either a StreamHandler
or a FileHandler
:
handler = logging.FileHandler(log_path)
logger.addHandler(handler)
.NET does not currently have a Logging implementation
By default, logs are sent to the console in stdout
.
To store the logs in a file:
logger.output = file_name
JavaScript does not currently support sending output to a file.
To send logs to console output:
logging.installConsoleHandler()
Content Help
Check our contribution guidelines if you’d like to help.
Logger filtering
Java logging is managed on a per class level, so
instead of using the root logger (Logger.getLogger("")
), set the level you want to use on a per-class
basis:
Logger.getLogger(RemoteWebDriver.class.getName()).setLevel(Level.FINEST);
Logger.getLogger(SeleniumManager.class.getName()).setLevel(Level.SEVERE);
logging.getLogger('selenium.webdriver.remote').setLevel(logging.WARN)
logging.getLogger('selenium.webdriver.common').setLevel(logging.DEBUG)
.NET does not currently have a Logging implementation
Ruby’s logger allows you to opt in (“allow”) or opt out (“ignore”) of log messages based on their IDs.
Everything that Selenium logs includes an ID. You can also turn on or off all deprecation notices by
using :deprecations
.
These methods accept one or more symbols or an array of symbols:
logger.ignore(:jwp_caps, :logger_info)
or
logger.allow(%i[selenium_manager example_id])
Content Help
Check our contribution guidelines if you’d like to help.
Content Help
Check our contribution guidelines if you’d like to help.