Funcionalidade específica do Chrome
Por omissão, Selenium 4 é compatível com Chrome v75 e superiores. Note que a versão (maior) do navegador e do chromedriver devem ser idênticas.
Opções
Capacidades comuns a todos os navegadores estão descritas na página Opções.
Capacidades únicas ao Chrome podem ser encontradas na página da Google para Capacidades e & ChromeOptions
Este é um exemplo de como iniciar uma sessão Chrome com um conjunto de opções básicas:
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(); }); });
Alguns exemplos de uso com capacidades diferentes:
Argumentos
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(); }); });
Iniciar navegador numa localização específica
Adicionar uma localização:
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.add_argument("--user-data-dir=#{user_data_dir}")
/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(); }); });
Adicionar extensões
O parametro extensions
aceita ficheiros crx
The extensions
parameter accepts crx files. As for unpacked directories, please use the load-extension
argument instead, as mentioned in this post.
Adicionar uma extensão:
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(); } } }
it 'add extensions' do
/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(); }); });
Manter o navegador aberto
Ao definir o parametro detach
para true, irá manter o navegador aberto mesmo depois do driver fechar.
Adicionar detach:
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.
end
/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(); }); });
Excluindo parametros
Chrome adiciona vários parametros, se não os pretende adicionar, passe-os em excludeSwitches
.
Um exemplo comum é voltar a activar o bloqueador de popups. A full list of default arguments can be parsed from the Chromium Source Code
Exclua parametros:
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(); } } }
end
/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(); } } }
after { FileUtils.rm_f(file_name) }
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
end
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
it 'sets log features' do
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(); } } }
end
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
Casting
Pode comandar dispositivos Chrome Cast, incluindo partilhar abas
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
end describe 'Special Features' do it 'casts' do @driver = Selenium::WebDriver.for :chrome sinks = @driver.cast_sinks
/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
Condições de rede
Pode simular vários estados de rede (como exemplo, simular situações com pouca banda).
The following examples are for local webdrivers. For remote webdrivers, please refer to the Remote WebDriver page.
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
end
/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
end
/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
Permissões
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
expect(logs.first.message).to include 'Failed to load resource' end
/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
Veja a secção [Chrome DevTools] para mais informação em como usar Chrome DevTools