Chrome 特定功能
默认情况下,Selenium 4与Chrome v75及更高版本兼容. 但是请注意Chrome浏览器的版本与chromedriver的主版本需要匹配.
Options
所有浏览器的通用功能请看这 Options page.
Chrome浏览器的特有功能可以在谷歌的页面找到: Capabilities & ChromeOptions
基于默认选项的Chrome浏览器会话看起来是这样:
System.clearProperty(ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY); }/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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();/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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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(); }); });下面是一些不同功能的常见示例:
参数
args 参数用于启动浏览器时要使用的命令行开关列表. 有两个很好的资源可以用于研究这些参数:
常用的参数包括 --start-maximized, --headless=new 以及 --user-data-dir=...
向选项添加参数:
/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 /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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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(); }); });从指定位置启动浏览器
binary 参数接收一个使用浏览器的备用路径,通过这个参数你可以使用chromedriver 去驱动各种基于Chromium 内核的浏览器.
添加一个浏览器地址到选项中:
/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 Directory.CreateDirectory(userDataDir);/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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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(); }); });添加扩展程序
extensions 参数接受crx文件. 至于解压的目录, 请使用 load-extension 参数代替, 正如 这篇文章 所示.
添加一个扩展程序到选项中:
@DisabledOnOs(OS.WINDOWS)/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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);/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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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(); }); });保持浏览器的打开状态
将 detach 参数设置为true将在驱动过程结束后保持浏览器的打开状态.
添加一个布尔值到选项中:
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(); }); });排除的参数
Chrome 添加了各种参数,如果你不希望添加某些参数,可以将其传入 excludeSwitches. 一个常见的例子是重新打开弹出窗口阻止程序. 默认参数的完整列表可以参考 Chromium 源码
设置排除参数至选项中:
driver.get("https://www.selenium.dev/selenium/web/blank.html");/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 /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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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 对象的示例, 以及用于设置驱动程序位置和端口 可以参考 驱动服务 页面.
日志输出
获取驱动程序日志有助于调试问题. 使用 Service 类, 可以指明日志的路径. 除非用户将其定向到某个位置, 否则将忽略日志记录输出.
文件输出
更改日志记录输出以保存到特定文件:
driver = new ChromeDriver(options); driver.get("https://www.selenium.dev");/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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(); } } 注意: Java 还允许通过系统属性设置文件输出:
属性键: ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
属性值: 表示日志文件路径的字符串
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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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 命令行输出
更改日志记录输出以在控制台中显示为标准输出:
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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(); } } 注意: Java 还允许通过系统属性设置控制台输出;
属性键: ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY
属性值: DriverService.LOG_STDOUT 或 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 日志级别
共有六种日志级别: ALL, DEBUG, INFO, WARNING, SEVERE, 以及 OFF. 注意 --verbose 等效于 --log-level=ALL 以及 --silent 等效于 --log-level=OFF, 因此, 此示例只是通用地设置日志级别:
String fileContent = new String(Files.readAllBytes(logLocation.toPath())); Assertions.assertTrue(fileContent.contains("Starting ChromeDriver"));/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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(); } } 注意: Java 还允许通过系统属性设置日志级别:
属性键: ChromeDriverService.CHROME_DRIVER_LOG_LEVEL_PROPERTY
属性值: ChromiumDriverLogLevel 枚举的字面值
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 日志文件功能
有 2 个功能仅在写入文件时可用:
- 追加日志
- 可读时间戳
要使用它们, 您还需要显式指定日志路径和日志级别. 日志输出将由驱动程序管理, 而不是由进程管理, 因此可能会看到细微的差异.
@Test/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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(); } } 注意: Java 还允许通过系统属性切换这些功能:
属性键: ChromeDriverService.CHROME_DRIVER_APPEND_LOG_PROPERTY 以及 ChromeDriverService.CHROME_DRIVER_READABLE_TIMESTAMP
属性值: "true" 或 "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 禁用构建检查
Chromedriver 和 Chrome 浏览器版本应该匹配, 如果它们不匹配, 驱动程序将出错. 如果您停用构建检查功能, 则可以强制将驱动程序与任何版本的 Chrome 一起使用. 请注意, 这是一项不受支持的功能, 并且不会调查 bug.
@Test/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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(); } } 注意: Java 还允许通过系统属性禁用构建检查:
属性键: ChromeDriverService.CHROME_DRIVER_DISABLE_BUILD_CHECK
属性值: "true" 或 "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 }/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; using OpenQA.Selenium.Chromium; 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 = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 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] 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] 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 \d\d:\d\d:\d\d\.\d+\]"); Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches(line).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 (string.IsNullOrEmpty(_logLocation) && !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 特殊功能
Casting
你可以驱动 Chrome Cast 设备,包括共享选项卡
() -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((ChromeDriver) driver).deleteNetworkConditions(); driver.quit(); } /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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 网络条件
您可以模拟各种网络条件.
以下示例适用于本地 webdrivers. 针对远程 webdrivers, 请参考 Remote WebDriver 页面.
String permissionState = (String) driver.executeScript(script); Assertions.assertEquals("denied", permissionState); driver.quit(); } @Test/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 日志
driver.quit();/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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 权限
options.setBrowserVersion("stable");/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.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.bidi.webextension.ExtensionPath; import org.openqa.selenium.bidi.webextension.InstallExtensionParameters; import org.openqa.selenium.bidi.webextension.WebExtension; 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 @DisabledOnOs(OS.WINDOWS) public void extensionOptions() { ChromeOptions options = getDefaultChromeOptions(); options.enableBiDi(); options.addArguments("--remote-debugging-pipe"); options.addArguments("--enable-unsafe-extension-debugging"); driver = new ChromeDriver(options); Path path = Paths.get("src/test/resources/extensions/selenium-example"); WebExtension extension = new WebExtension(driver); ExtensionPath extensionPath = new ExtensionPath(path.toString()); InstallExtensionParameters parameters = new InstallExtensionParameters(extensionPath); extension.install(parameters); 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
详见 Chrome DevTools 部分以获取有关使用Chrome DevTools的更多信息




