Chrome specific functionality
By default, Selenium 4 is compatible with Chrome v75 and greater. Note that the version of the Chrome browser and the version of chromedriver must match the major version.
Options
Capabilities common to all browsers are described on the Options page.
Capabilities unique to Chrome and Chromium are documented at Google’s page for Capabilities & ChromeOptions
Starting a Chrome session with basic defined options looks like this:
ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options);
/examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
options = get_default_chrome_options() driver = webdriver.Chrome(options=options)
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
var options = new ChromeOptions(); driver = new ChromeDriver(options);
/examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Arguments
The args
parameter is for a list of command line switches to be used when starting the browser. There are two excellent resources for investigating these arguments:
Commonly used args include --start-maximized
, --headless=new
and --user-data-dir=...
Add an argument to options:
options.addArguments("--start-maximized");
/examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
options.add_argument("--start-maximized")
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
options.AddArgument("--start-maximized");
/examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
options.args << '--start-maximized'
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Start browser in a specified location
The binary
parameter takes the path of an alternate location of browser to use. With this parameter you can use chromedriver to drive various Chromium based browsers.
Add a browser location to options:
options.setBinary(getChromeLocation());
/examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
options.binary_location = chrome_bin
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
var options = new ChromeOptions();
/examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
options.binary = chrome_location
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Add extensions
The extensions
parameter accepts crx files. As for unpacked directories, please use the load-extension
argument instead, as mentioned in this post.
Add an extension to options:
options.addExtensions(extensionFilePath);
/examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
options.add_extension(extension_file_path)
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch");
/examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
options.add_extension(extension_file_path)
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Keeping browser open
Setting the detach
parameter to true will keep the browser open after the process has ended, so long as the quit command is not sent to the driver.
Note: This is already the default behavior in Java.
options.add_experimental_option("detach", True)
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
Note: This is already the default behavior in .NET.
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Excluding arguments
Chromedriver has several default arguments it uses to start the browser. If you do not want those arguments added, pass them into excludeSwitches
. A common example is to turn the popup blocker back on. A full list of default arguments can be parsed from the Chromium Source Code
Set excluded arguments on options:
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
/examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
options.AddExcludedArgument("disable-popup-blocking");
examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build();
/examples/javascript/test/browser/chromeSpecificCaps.spec.js
const Chrome = require('selenium-webdriver/chrome'); const { Browser, Builder } = require("selenium-webdriver"); const options = new Chrome.Options(); describe('Should be able to Test Command line arguments', function () { it('headless', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addArguments('--headless=new')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('exclude switches', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.excludeSwitches('enable-automation')) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Keep browser open - set detach to true ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.detachDriver(true)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); // As tests runs in ci, quitting the driver instance to avoid any failures await driver.quit(); }); xit('Start browser from specified location ', async function () { let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.setChromeBinaryPath(`Path to chrome binary`)) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Basic Chrome test', async function () { const Options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(Options) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); it('Add Extension', async function () { const options = new Chrome.Options(); let driver = new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx'])) .build(); await driver.get('https://www.selenium.dev/selenium/web/blank.html'); await driver.quit(); }); });
Service
Examples for creating a default Service object, and for setting driver location and port can be found on the Driver Service page.
Log output
Getting driver logs can be helpful for debugging issues. The Service class lets you direct where the logs will go. Logging output is ignored unless the user directs it somewhere.
File output
To change the logging output to save to a specific file:
ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build();
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
Note: Java also allows setting file output by System Property:
Property key: ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
Property value: String representing path to log file
service = webdriver.ChromeService(log_output=log_path)
examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Console output
To change the logging output to display in the console as STDOUT:
ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build();
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
Note: Java also allows setting console output by System Property;
Property key: ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
Property value: DriverService.LOG_STDOUT
or DriverService.LOG_STDERR
service = webdriver.ChromeService(log_output=subprocess.STDOUT)
examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
$stdout
and $stderr
are both valid values
examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Log level
There are 6 available log levels: ALL
, DEBUG
, INFO
, WARNING
, SEVERE
, and OFF
. Note that --verbose
is equivalent to --log-level=ALL
and --silent
is equivalent to --log-level=OFF
, so this example is just setting the log level generically:
ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build();
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
Note: Java also allows setting log level by System Property:
Property key: ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY
Property value: String representation of ChromiumDriverLogLevel
enum
service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT)
examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Log file features
There are 2 features that are only available when logging to a file:
- append log
- readable timestamps
To use them, you need to also explicitly specify the log path and log level. The log output will be managed by the driver, not the process, so minor differences may be seen.
ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
Note: Java also allows toggling these features by System Property:
Property keys: ChromeDriverService.CHROME_DRIVER_APPEND_LOG_PROPERTY
and ChromeDriverService.CHROME_DRIVER_READABLE_TIMESTAMP
Property value: "true"
or "false"
service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
service.args << '--append-log'
examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Disabling build check
Chromedriver and Chrome browser versions should match, and if they don’t the driver will error. If you disable the build check, you can force the driver to be used with any version of Chrome. Note that this is an unsupported feature, and bugs will not be investigated.
ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build();
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
Note: Java also allows disabling build checks by System Property:
Property key: ChromeDriverService.CHROME_DRIVER_DISABLE_BUILD_CHECK
Property value: "true"
or "false"
service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT)
examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
public void DisableBuildCheck()
examples/dotnet/SeleniumDocs/Browsers/ChromeTest.cs
using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace SeleniumDocs.Browsers { [TestClass] public class ChromeTest { private ChromeDriver driver; private string _logLocation; [TestCleanup] public void Cleanup() { if (_logLocation != null && File.Exists(_logLocation)) { File.Delete(_logLocation); } driver.Quit(); } [TestMethod] public void BasicOptions() { var options = new ChromeOptions(); driver = new ChromeDriver(options); } [TestMethod] public void Arguments() { var options = new ChromeOptions(); options.AddArgument("--start-maximized"); driver = new ChromeDriver(options); } [TestMethod] public void SetBrowserLocation() { string userDataDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()); System.IO.Directory.CreateDirectory(userDataDir); var options = new ChromeOptions(); options.AddArgument($"--user-data-dir={userDataDir}"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.BinaryLocation = GetChromeLocation(); driver = new ChromeDriver(options); } [TestMethod] public void InstallExtension() { var options = new ChromeOptions(); var baseDir = AppDomain.CurrentDomain.BaseDirectory; var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx"); options.AddExtension(extensionFilePath); options.AddArgument("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.Url = "https://www.selenium.dev/selenium/web/blank.html"; IWebElement injected = driver.FindElement(By.Id("webextensions-selenium-example")); Assert.AreEqual("Content injected by webextensions-selenium-example", injected.Text); } [TestMethod] public void ExcludeSwitch() { var options = new ChromeOptions(); options.AddExcludedArgument("disable-popup-blocking"); driver = new ChromeDriver(options); } [TestMethod] public void LogsToFile() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting ChromeDriver"))); } [TestMethod] [Ignore("Not implemented")] public void LogsToConsole() { var stringWriter = new StringWriter(); var originalOutput = Console.Out; Console.SetOut(stringWriter); var service = ChromeDriverService.CreateDefaultService(); //service.LogToConsole = true; driver = new ChromeDriver(service); Assert.IsTrue(stringWriter.ToString().Contains("Starting ChromeDriver")); Console.SetOut(originalOutput); stringWriter.Dispose(); } [TestMethod] [Ignore("Not implemented")] public void LogsLevel() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); // service.LogLevel = ChromiumDriverLogLevel.Debug driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:"))); } [TestMethod] [Ignore("Not implemented")] public void ConfigureDriverLogs() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.EnableAppendLog = true; // service.readableTimeStamp = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var lines = File.ReadLines(GetLogLocation()); var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0)); } [TestMethod] public void DisableBuildCheck() { var service = ChromeDriverService.CreateDefaultService(); service.LogPath = GetLogLocation(); service.EnableVerboseLogging = true; service.DisableBuildCheck = true; driver = new ChromeDriver(service); driver.Quit(); // Close the Service log file before reading var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; var lines = File.ReadLines(GetLogLocation()); Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected))); } private string GetLogLocation() { if (_logLocation == null || !File.Exists(_logLocation)) { _logLocation = Path.GetTempFileName(); } return _logLocation; } private static string GetChromeLocation() { var options = new ChromeOptions { BrowserVersion = "stable" }; return new DriverFinder(options).GetBrowserPath(); } } }
examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Special Features
Some browsers have implemented additional features that are unique to them.
Casting
You can drive Chrome Cast devices, including sharing tabs
List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); }
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name)
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
@driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Network conditions
You can simulate various network conditions.
ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions);
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions)
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
@driver = Selenium::WebDriver.for :chrome
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Logs
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
logs = driver.get_log("browser")
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
@driver.navigate.to 'https://www.selenium.dev/selenium/web/'
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
Permissions
driver.setPermission("camera", "denied");
examples/java/src/test/java/dev/selenium/browsers/ChromeTest.java
package dev.selenium.browsers; import dev.selenium.BaseTest; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chromium.ChromiumDriverLogLevel; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.logging.*; import org.openqa.selenium.remote.service.DriverFinder; public class ChromeTest extends BaseTest { @AfterEach public void clearProperties() { System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY); System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); } @Test public void basicOptions() { ChromeOptions options = getDefaultChromeOptions(); driver = new ChromeDriver(options); } @Test public void arguments() { ChromeOptions options = getDefaultChromeOptions(); options.addArguments("--start-maximized"); driver = new ChromeDriver(options); } @Test public void setBrowserLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBinary(getChromeLocation()); driver = new ChromeDriver(options); } @Test public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx"); File extensionFilePath = new File(path.toUri()); options.addExtensions(extensionFilePath); options.addArguments("--disable-features=DisableLoadExtensionCommandLineSwitch"); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev/selenium/web/blank.html"); WebElement injected = driver.findElement(By.id("webextensions-selenium-example")); Assertions.assertEquals( "Content injected by webextensions-selenium-example", injected.getText()); } @Test public void excludeSwitches() { ChromeOptions options = getDefaultChromeOptions(); options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking")); driver = new ChromeDriver(options); } @Test public void loggingPreferences() { ChromeOptions options = getDefaultChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); options.setCapability(ChromeOptions.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(options); driver.get("https://www.selenium.dev"); LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); Assertions.assertFalse(logEntries.getAll().isEmpty()); } @Test public void logsToFile() throws IOException { File logLocation = getTempFile("logsToFile", ".log"); ChromeDriverService service = new ChromeDriverService.Builder().withLogFile(logLocation).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsToConsole() throws IOException { File logLocation = getTempFile("logsToConsole", ".log"); System.setOut(new PrintStream(logLocation)); ChromeDriverService service = new ChromeDriverService.Builder().withLogOutput(System.out).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver")); } @Test public void logsWithLevel() throws IOException { File logLocation = getTempFile("logsWithLevel", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); ChromeDriverService service = new ChromeDriverService.Builder().withLogLevel(ChromiumDriverLogLevel.DEBUG).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("[DEBUG]:")); } @Test public void configureDriverLogs() throws IOException { File logLocation = getTempFile("configureDriverLogs", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Pattern pattern = Pattern.compile("\\[\\d\\d-\\d\\d-\\d\\d\\d\\d", Pattern.CASE_INSENSITIVE); Assertions.assertTrue(pattern.matcher(fileContent).find()); } @Test public void disableBuildChecks() throws IOException { File logLocation = getTempFile("disableBuildChecks", ".log"); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath()); System.setProperty( ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.WARNING.toString()); ChromeDriverService service = new ChromeDriverService.Builder().withBuildCheckDisabled(true).build(); driver = new ChromeDriver(service); String fileContent = new String(Files.readAllBytes(logLocation.toPath())); String expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"; Assertions.assertTrue(fileContent.contains(expected)); } private File getChromeLocation() { ChromeOptions options = getDefaultChromeOptions(); options.setBrowserVersion("stable"); DriverFinder finder = new DriverFinder(ChromeDriverService.createDefaultService(), options); return new File(finder.getBrowserPath()); } @Test public void setPermission() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev"); driver.setPermission("camera", "denied"); // Verify the permission state is 'denied' String script = "return navigator.permissions.query({ name: 'camera' })" + " .then(permissionStatus => permissionStatus.state);"; String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test public void setNetworkConditions() { driver = new ChromeDriver(); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); networkConditions.setOffline(false); networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps ((ChromeDriver) driver).setNetworkConditions(networkConditions); driver.get("https://www.selenium.dev"); // Assert the network conditions are set as expected ChromiumNetworkConditions actualConditions = ((ChromeDriver) driver).getNetworkConditions(); Assertions.assertAll( () -> Assertions.assertEquals(networkConditions.getOffline(), actualConditions.getOffline()), () -> Assertions.assertEquals(networkConditions.getLatency(), actualConditions.getLatency()), () -> Assertions.assertEquals(networkConditions.getDownloadThroughput(), actualConditions.getDownloadThroughput()), () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } @Test public void castFeatures() { ChromeDriver driver = new ChromeDriver(); List<Map<String, String>> sinks = driver.getCastSinks(); if (!sinks.isEmpty()) { String sinkName = sinks.get(0).get("name"); driver.startTabMirroring(sinkName); driver.stopCasting(sinkName); } driver.quit(); } @Test public void getBrowserLogs() { ChromeDriver driver = new ChromeDriver(); driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html"); WebElement consoleLogButton = driver.findElement(By.id("consoleError")); consoleLogButton.click(); LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // Assert that at least one log contains the expected message boolean logFound = false; for (LogEntry log : logs) { if (log.getMessage().contains("I am console error")) { logFound = true; break; } } Assertions.assertTrue(logFound, "No matching log message found."); driver.quit(); } }
driver.set_permissions('camera', 'denied')
/examples/python/tests/browsers/test_chrome.py
import os import re import subprocess import pytest from selenium import webdriver from selenium.webdriver.common.by import By def test_basic_options(): options = get_default_chrome_options() driver = webdriver.Chrome(options=options) driver.quit() def test_args(): options = get_default_chrome_options() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_set_browser_location(chrome_bin): options = get_default_chrome_options() options.binary_location = chrome_bin driver = webdriver.Chrome(options=options) driver.quit() def test_add_extension(): options = get_default_chrome_options() extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx") options.add_extension(extension_file_path) driver = webdriver.Chrome(options=options) driver.get("https://www.selenium.dev/selenium/web/blank.html") driver.quit() def test_keep_browser_open(): options = get_default_chrome_options() options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_exclude_switches(): options = get_default_chrome_options() options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) driver = webdriver.Chrome(options=options) driver.get('http://selenium.dev') driver.quit() def test_log_to_file(log_path): service = webdriver.ChromeService(log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as fp: assert "Starting ChromeDriver" in fp.readline() driver.quit() def test_log_to_stdout(capfd): service = webdriver.ChromeService(log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert "Starting ChromeDriver" in out driver.quit() def test_log_level(capfd): service = webdriver.ChromeService(service_args=['--log-level=DEBUG'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) out, err = capfd.readouterr() assert '[DEBUG]' in err driver.quit() def test_log_features(log_path): service = webdriver.ChromeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path) driver = webdriver.Chrome(service=service) with open(log_path, 'r') as f: assert re.match(r"\[\d\d-\d\d-\d\d\d\d", f.read()) driver.quit() def test_build_checks(capfd): service = webdriver.ChromeService(service_args=['--disable-build-check'], log_output=subprocess.STDOUT) driver = webdriver.Chrome(service=service) expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check" out, err = capfd.readouterr() assert expected in err driver.quit() def test_set_network_conditions(): driver = webdriver.Chrome() network_conditions = { "offline": False, "latency": 20, # 20 ms of latency "download_throughput": 2000 * 1024 / 8, # 2000 kbps "upload_throughput": 2000 * 1024 / 8, # 2000 kbps } driver.set_network_conditions(**network_conditions) driver.get("https://www.selenium.dev") # check whether the network conditions are set assert driver.get_network_conditions() == network_conditions driver.quit() def test_set_permissions(): driver = webdriver.Chrome() driver.get('https://www.selenium.dev') driver.set_permissions('camera', 'denied') assert get_permission_state(driver, 'camera') == 'denied' driver.quit() def get_permission_state(driver, name): """Helper function to query the permission state.""" script = """ const callback = arguments[arguments.length - 1]; navigator.permissions.query({name: arguments[0]}).then(permissionStatus => { callback(permissionStatus.state); }); """ return driver.execute_async_script(script, name) def test_cast_features(): driver = webdriver.Chrome() try: sinks = driver.get_sinks() if sinks: sink_name = sinks[0]['name'] driver.start_tab_mirroring(sink_name) driver.stop_casting(sink_name) else: pytest.skip("No available Cast sinks to test with.") finally: driver.quit() def test_get_browser_logs(): driver = webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html") driver.find_element(By.ID, "consoleError").click() logs = driver.get_log("browser") # Assert that at least one log contains the expected message assert any("I am console error" in log['message'] for log in logs), "No matching log message found." driver.quit() def get_default_chrome_options(): options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") return options
@driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/'
/examples/ruby/spec/browsers/chrome_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Chrome' do describe 'Options' do let(:chrome_location) { driver_finder && ENV.fetch('CHROME_BIN', nil) } it 'basic options' do options = Selenium::WebDriver::Options.chrome @driver = Selenium::WebDriver.for :chrome, options: options end it 'add arguments' do options = Selenium::WebDriver::Options.chrome options.args << '--start-maximized' @driver = Selenium::WebDriver.for :chrome, options: options end it 'sets location of binary' do user_data_dir = Dir.mktmpdir('chrome-profile-') options = Selenium::WebDriver::Options.chrome options.add_argument("--user-data-dir=#{user_data_dir}") options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary = chrome_location @driver = Selenium::WebDriver.for :chrome, options: options end it 'add extensions' do extension_file_path = File.expand_path('../spec_support/extensions/webextensions-selenium-example.crx', __dir__) options = Selenium::WebDriver::Options.chrome options.add_extension(extension_file_path) options.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') @driver = Selenium::WebDriver.for :chrome, options: options @driver.get('https://www.selenium.dev/selenium/web/blank.html') injected = @driver.find_element(:id, 'webextensions-selenium-example') expect(injected.text).to eq 'Content injected by webextensions-selenium-example' end it 'keeps browser open' do options = Selenium::WebDriver::Options.chrome options.detach = true @driver = Selenium::WebDriver.for :chrome, options: options end it 'excludes switches' do options = Selenium::WebDriver::Options.chrome options.exclude_switches << 'disable-popup-blocking' @driver = Selenium::WebDriver.for :chrome, options: options end end describe 'Service' do let(:file_name) { File.expand_path('chromedriver.log') } after { FileUtils.rm_f(file_name) } it 'logs to file' do service = Selenium::WebDriver::Service.chrome service.log = file_name @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).first).to include('Starting ChromeDriver') end it 'logs to console' do service = Selenium::WebDriver::Service.chrome service.log = $stdout expect { @driver = Selenium::WebDriver.for :chrome, service: service }.to output(/Starting ChromeDriver/).to_stdout_from_any_process end it 'sets log level' do service = Selenium::WebDriver::Service.chrome service.log = file_name service.args << '--log-level=DEBUG' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[DEBUG\]:/).any?).to eq true end it 'sets log features' do args = ["--log-path=#{file_name}", '--verbose'] service = Selenium::WebDriver::Service.chrome(args: args) service.args << '--append-log' service.args << '--readable-timestamp' @driver = Selenium::WebDriver.for :chrome, service: service expect(File.readlines(file_name).grep(/\[\d\d-\d\d-\d\d\d\d/).any?).to eq true end it 'disables build checks' do service = Selenium::WebDriver::Service.chrome log: file_name, args: ['--verbose'] service.args << '--disable-build-check' @driver = Selenium::WebDriver.for :chrome, service: service warning = /\[WARNING\]: You are using an unsupported command-line switch: --disable-build-check/ expect(File.readlines(file_name).grep(warning).any?).to eq true end end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks unless sinks.empty? device_name = sinks.first['name'] @driver.start_cast_tab_mirroring(device_name) expect { @driver.stop_casting(device_name) }.not_to raise_exception end end it 'gets and sets network conditions' do @driver = Selenium::WebDriver.for :chrome @driver.network_conditions = {offline: false, latency: 100, throughput: 200} expect(@driver.network_conditions).to eq( 'offline' => false, 'latency' => 100, 'download_throughput' => 200, 'upload_throughput' => 200 ) end it 'gets the browser logs' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' sleep 1 logs = @driver.logs.get(:browser) expect(logs.first.message).to include 'Failed to load resource' end it 'sets permissions' do @driver = Selenium::WebDriver.for :chrome @driver.navigate.to 'https://www.selenium.dev/selenium/web/' @driver.add_permission('camera', 'denied') @driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt') expect(permission('camera')).to eq('denied') expect(permission('clipboard-read')).to eq('denied') expect(permission('clipboard-write')).to eq('prompt') end end def driver_finder options = Selenium::WebDriver::Options.chrome(browser_version: 'stable') service = Selenium::WebDriver::Service.chrome finder = Selenium::WebDriver::DriverFinder.new(options, service) ENV['CHROMEDRIVER_BIN'] = finder.driver_path ENV['CHROME_BIN'] = finder.browser_path end def permission(name) @driver.execute_async_script('callback = arguments[arguments.length - 1];' \ 'callback(navigator.permissions.query({name: arguments[0]}));', name)['state'] end end
DevTools
See the Chrome DevTools section for more information about using Chrome DevTools