Funcionalidade específica do Edge
Microsoft Edge foi criado com recurso ao Chromium, cuja versão mais antiga suportada é a v79. Tal como o Chrome, a versão (maior) do edgedriver deve ser igual à do navegador Edge.
Todas as capacidades e opções encontradas na página Chrome page irão funcionar de igual forma para o Edge.
Opções
Capabilities common to all browsers are described on the Options page.
Capabilities unique to Chromium are documented at Google’s page for Capabilities & ChromeOptions
Este é um exemplo de como iniciar uma sessão Edge com um conjunto de opções básicas:
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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_edge_options()
driver = webdriver.Edge(options=options)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
var options = new EdgeOptions();
driver = new EdgeDriver(options);
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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 options = new edge.Options();
driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options)
.build();
Show full example
const {Browser, Builder} = require('selenium-webdriver');
const edge = require('selenium-webdriver/edge');
describe('Open Edge', function () {
let driver;
before(async function () {
let options = new edge.Options();
driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options)
.build();
});
after(async () => await driver.quit());
it('Basic Edge test', async function () {
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
});
});
Argumentos
The args
parameter is for a list of command line switches to be used when starting the browser.
There are two excellent resources for investigating these arguments:
Opções mais frequentes incluem --start-maximized
e --headless=new
e --user-data-dir=...
Adicione uma opção:
options.addArguments("--start-maximized");
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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")
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
options.AddArgument("--start-maximized");
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
options.args << '--start-maximized'
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
.setEdgeOptions(options.addArguments('--headless=new'))
Show full example
const {Browser, By, Builder } = require('selenium-webdriver');
const edge = require('selenium-webdriver/edge');
const options = new edge.Options();
const assert = require("assert");
describe('Should be able to Test Command line arguments', function () {
it('headless', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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();
});
it('Basic edge test', async function () {
const Options = new edge.Options();
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(Options)
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
await driver.quit();
});
it('Add Extension', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
let injected = await driver.findElement(By.id('webextensions-selenium-example'));
assert.equal(await injected.getText(), `Content injected by webextensions-selenium-example`)
await driver.quit();
});
});
Start browser in a specified location
The binary
parameter takes the path of an alternate location of browser to use. With this parameter you can
use chromedriver to drive various Chromium based browsers.
Add a browser location to options:
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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 = edge_bin
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
options.BinaryLocation = GetEdgeLocation();
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
options.binary = edge_location
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
Add extensions
The extensions
parameter accepts crx files. As for unpacked directories,
please use the load-extension
argument instead, as mentioned in
this post.
Add an extension to options:
options.addExtensions(extensionFilePath);
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
options.AddExtension(extensionFilePath);
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
options.add_extension(extension_file_path)
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
.setEdgeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
Show full example
const {Browser, By, Builder } = require('selenium-webdriver');
const edge = require('selenium-webdriver/edge');
const options = new edge.Options();
const assert = require("assert");
describe('Should be able to Test Command line arguments', function () {
it('headless', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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();
});
it('Basic edge test', async function () {
const Options = new edge.Options();
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(Options)
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
await driver.quit();
});
it('Add Extension', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
let injected = await driver.findElement(By.id('webextensions-selenium-example'));
assert.equal(await injected.getText(), `Content injected by webextensions-selenium-example`)
await driver.quit();
});
});
Keeping browser open
Setting the detach
parameter to true will keep the browser open after the process has ended,
so long as the quit command is not sent to the driver.
Note: This is already the default behavior in Java.
options.add_experimental_option("detach", True)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
Note: This is already the default behavior in .NET.
options.detach = true
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
.setEdgeOptions(options.detachDriver(true))
Show full example
const {Browser, By, Builder } = require('selenium-webdriver');
const edge = require('selenium-webdriver/edge');
const options = new edge.Options();
const assert = require("assert");
describe('Should be able to Test Command line arguments', function () {
it('headless', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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();
});
it('Basic edge test', async function () {
const Options = new edge.Options();
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(Options)
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
await driver.quit();
});
it('Add Extension', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
let injected = await driver.findElement(By.id('webextensions-selenium-example'));
assert.equal(await injected.getText(), `Content injected by webextensions-selenium-example`)
await driver.quit();
});
});
Excluding arguments
MSEdgedriver has several default arguments it uses to start the browser.
If you do not want those arguments added, pass them into excludeSwitches
.
A common example is to turn the popup blocker back on. A full list of default arguments
can be parsed from the
Chromium Source Code
Set excluded arguments on options:
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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'])
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
options.AddExcludedArgument("disable-popup-blocking");
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
options.exclude_switches << 'disable-popup-blocking'
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
.setEdgeOptions(options.excludeSwitches('enable-automation'))
Show full example
const {Browser, By, Builder } = require('selenium-webdriver');
const edge = require('selenium-webdriver/edge');
const options = new edge.Options();
const assert = require("assert");
describe('Should be able to Test Command line arguments', function () {
it('headless', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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.EDGE)
.setEdgeOptions(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();
});
it('Basic edge test', async function () {
const Options = new edge.Options();
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(Options)
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
await driver.quit();
});
it('Add Extension', async function () {
let driver = new Builder()
.forBrowser(Browser.EDGE)
.setEdgeOptions(options.addExtensions(['./test/resources/extensions/webextensions-selenium-example.crx']))
.build();
await driver.get('https://www.selenium.dev/selenium/web/blank.html');
let injected = await driver.findElement(By.id('webextensions-selenium-example'));
assert.equal(await injected.getText(), `Content injected by webextensions-selenium-example`)
await driver.quit();
});
});
Service
Examples for creating a default Service object, and for setting driver location and port can be found on the Driver Service page.
Log output
Getting driver logs can be helpful for debugging issues. The Service class lets you direct where the logs will go. Logging output is ignored unless the user directs it somewhere.
File output
To change the logging output to save to a specific file:
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");
WebElement consoleLogButton = driver.findElement(By.id("consoleError"));
consoleLogButton.click();
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
// Assert that at least one log contains the expected message
boolean logFound = false;
for (LogEntry log : logs) {
if (log.getMessage().contains("I am console error")) {
logFound = true;
break;
}
}
Assertions.assertTrue(logFound, "No matching log message found.");
driver.quit();
}
}
Note: Java also allows setting file output by System Property:
Property key: EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY
Property value: String representing path to log file
service = webdriver.EdgeService(log_output=log_path)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
service.LogPath = GetLogLocation();
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
service.log = file_name
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Console output
To change the logging output to display in the console as STDOUT:
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");
WebElement consoleLogButton = driver.findElement(By.id("consoleError"));
consoleLogButton.click();
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
// Assert that at least one log contains the expected message
boolean logFound = false;
for (LogEntry log : logs) {
if (log.getMessage().contains("I am console error")) {
logFound = true;
break;
}
}
Assertions.assertTrue(logFound, "No matching log message found.");
driver.quit();
}
}
Note: Java also allows setting console output by System Property;
Property key: EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY
Property value: DriverService.LOG_STDOUT
or DriverService.LOG_STDERR
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
$stdout
and $stderr
are both valid values
service.log = $stdout
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Log level
There are 6 available log levels: ALL
, DEBUG
, INFO
, WARNING
, SEVERE
, and OFF
.
Note that --verbose
is equivalent to --log-level=ALL
and --silent
is equivalent to --log-level=OFF
,
so this example is just setting the log level generically:
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");
WebElement consoleLogButton = driver.findElement(By.id("consoleError"));
consoleLogButton.click();
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
// Assert that at least one log contains the expected message
boolean logFound = false;
for (LogEntry log : logs) {
if (log.getMessage().contains("I am console error")) {
logFound = true;
break;
}
}
Assertions.assertTrue(logFound, "No matching log message found.");
driver.quit();
}
}
Note: Java also allows setting log level by System Property:
Property key: EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY
Property value: String representation of ChromiumDriverLogLevel
enum
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
service.args << '--log-level=DEBUG'
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Log file features
There are 2 features that are only available when logging to a file:
- append log
- readable timestamps
To use them, you need to also explicitly specify the log path and log level. The log output will be managed by the driver, not the process, so minor differences may be seen.
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");
WebElement consoleLogButton = driver.findElement(By.id("consoleError"));
consoleLogButton.click();
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
// Assert that at least one log contains the expected message
boolean logFound = false;
for (LogEntry log : logs) {
if (log.getMessage().contains("I am console error")) {
logFound = true;
break;
}
}
Assertions.assertTrue(logFound, "No matching log message found.");
driver.quit();
}
}
Note: Java also allows toggling these features by System Property:
Property keys: EdgeDriverService.EDGE_DRIVER_APPEND_LOG_PROPERTY
and EdgeDriverService.EDGE_DRIVER_READABLE_TIMESTAMP
Property value: "true"
or "false"
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
service.args << '--append-log'
service.args << '--readable-timestamp'
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Disabling build check
Edge browser and msedgedriver versions should match, and if they don’t the driver will error. If you disable the build check, you can force the driver to be used with any version of Edge. Note that this is an unsupported feature, and bugs will not be investigated.
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
driver.get("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html");
WebElement consoleLogButton = driver.findElement(By.id("consoleError"));
consoleLogButton.click();
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
// Assert that at least one log contains the expected message
boolean logFound = false;
for (LogEntry log : logs) {
if (log.getMessage().contains("I am console error")) {
logFound = true;
break;
}
}
Assertions.assertTrue(logFound, "No matching log message found.");
driver.quit();
}
}
Note: Java also allows disabling build checks by System Property:
Property key: EdgeDriverService.EDGE_DRIVER_DISABLE_BUILD_CHECK
Property value: "true"
or "false"
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
service.DisableBuildCheck = true;
Show full example
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
namespace SeleniumDocs.Browsers
{
[TestClass]
public class EdgeTest
{
private EdgeDriver 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 EdgeOptions();
driver = new EdgeDriver(options);
}
[TestMethod]
public void Arguments()
{
var options = new EdgeOptions();
options.AddArgument("--start-maximized");
driver = new EdgeDriver(options);
}
[TestMethod]
public void SetBrowserLocation()
{
var options = new EdgeOptions();
options.BinaryLocation = GetEdgeLocation();
driver = new EdgeDriver(options);
}
[TestMethod]
public void InstallExtension()
{
var options = new EdgeOptions();
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var extensionFilePath = Path.Combine(baseDir, "../../../Extensions/webextensions-selenium-example.crx");
options.AddExtension(extensionFilePath);
driver = new EdgeDriver(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 EdgeOptions();
options.AddExcludedArgument("disable-popup-blocking");
driver = new EdgeDriver(options);
}
[TestMethod]
public void LogsToFile()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("Starting Microsoft Edge WebDriver")));
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsToConsole()
{
var stringWriter = new StringWriter();
var originalOutput = Console.Out;
Console.SetOut(stringWriter);
var service = EdgeDriverService.CreateDefaultService();
//service.LogToConsole = true;
driver = new EdgeDriver(service);
Assert.IsTrue(stringWriter.ToString().Contains("Starting Microsoft Edge WebDriver"));
Console.SetOut(originalOutput);
stringWriter.Dispose();
}
[TestMethod]
[Ignore("Not implemented")]
public void LogsLevel()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
// service.LogLevel = ChromiumDriverLogLevel.Debug
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains("[DEBUG]:")));
}
[TestMethod]
[Ignore("Not implemented")]
public void ConfigureDriverLogs()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.EnableAppendLog = true;
// service.readableTimeStamp = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var lines = File.ReadLines(GetLogLocation());
var regex = new Regex(@"\[\d\d-\d\d-\d\d\d\d");
Assert.IsNotNull(lines.FirstOrDefault(line => regex.Matches("").Count > 0));
}
[TestMethod]
public void DisableBuildCheck()
{
var service = EdgeDriverService.CreateDefaultService();
service.LogPath = GetLogLocation();
service.EnableVerboseLogging = true;
service.DisableBuildCheck = true;
driver = new EdgeDriver(service);
driver.Quit(); // Close the Service log file before reading
var expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check";
var lines = File.ReadLines(GetLogLocation());
Assert.IsNotNull(lines.FirstOrDefault(line => line.Contains(expected)));
}
private string GetLogLocation()
{
if (_logLocation == null || !File.Exists(_logLocation))
{
_logLocation = Path.GetTempFileName();
}
return _logLocation;
}
private static string GetEdgeLocation()
{
var options = new EdgeOptions
{
BrowserVersion = "stable"
};
return new DriverFinder(options).GetBrowserPath();
}
}
}
service.args << '--disable-build-check'
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_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
Modo compatibilidade Internet Explorer
O Microsoft Edge pode ser controlado em modo “compatibilidade Internet Explorer”, são usadas classes do Internet Explorer Driver em conjunção com o Microsoft Edge. Leia a página Internet Explorer para mais detalhes.
Special Features
Some browsers have implemented additional features that are unique to them.
Casting
You can drive Chrome Cast devices with Edge, including sharing tabs
List<Map<String, String>> sinks = driver.getCastSinks();
if (!sinks.isEmpty()) {
String sinkName = sinks.get(0).get("name");
driver.startTabMirroring(sinkName);
driver.stopCasting(sinkName);
}
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
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
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Network conditions
You can simulate various network conditions.
ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions();
networkConditions.setOffline(false);
networkConditions.setLatency(java.time.Duration.ofMillis(20)); // 20 ms of latency
networkConditions.setDownloadThroughput(2000 * 1024 / 8); // 2000 kbps
networkConditions.setUploadThroughput(2000 * 1024 / 8); // 2000 kbps
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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)
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
@driver.network_conditions = {offline: false, latency: 100, throughput: 200}
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Logs
LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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")
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
logs = @driver.logs.get(:browser)
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
Permissions
driver.setPermission("camera", "denied");
Show full example
package dev.selenium.browsers;
import dev.selenium.BaseTest;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chromium.ChromiumDriverLogLevel;
import org.openqa.selenium.chromium.ChromiumNetworkConditions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeDriverService;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.logging.*;
import org.openqa.selenium.remote.service.DriverFinder;
public class EdgeTest extends BaseTest {
@AfterEach
public void clearProperties() {
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY);
System.clearProperty(EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY);
}
@Test
public void basicOptions() {
EdgeOptions options = getDefaultEdgeOptions();
driver = new EdgeDriver(options);
}
@Test
public void arguments() {
EdgeOptions options = getDefaultEdgeOptions();
options.addArguments("--start-maximized");
driver = new EdgeDriver(options);
}
@Test
public void setBrowserLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBinary(getEdgeLocation());
driver = new EdgeDriver(options);
}
@Test
public void extensionOptions() {
EdgeOptions options = getDefaultEdgeOptions();
Path path = Paths.get("src/test/resources/extensions/webextensions-selenium-example.crx");
File extensionFilePath = new File(path.toUri());
options.addExtensions(extensionFilePath);
driver = new EdgeDriver(options);
driver.get("https://www.selenium.dev/selenium/web/blank.html");
WebElement injected = driver.findElement(By.id("webextensions-selenium-example"));
Assertions.assertEquals(
"Content injected by webextensions-selenium-example", injected.getText());
}
@Test
public void excludeSwitches() {
EdgeOptions options = getDefaultEdgeOptions();
options.setExperimentalOption("excludeSwitches", List.of("disable-popup-blocking"));
driver = new EdgeDriver(options);
}
@Test
public void loggingPreferences() {
EdgeOptions options = getDefaultEdgeOptions();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
options.setCapability(EdgeOptions.LOGGING_PREFS, logPrefs);
driver = new EdgeDriver(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");
EdgeDriverService service = new EdgeDriverService.Builder().withLogFile(logLocation).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsToConsole() throws IOException {
File logLocation = getTempFile("logsToConsole", ".log");
System.setOut(new PrintStream(logLocation));
EdgeDriverService service = new EdgeDriverService.Builder().withLogOutput(System.out).build();
driver = new EdgeDriver(service);
String fileContent = new String(Files.readAllBytes(logLocation.toPath()));
Assertions.assertTrue(fileContent.contains("Starting Microsoft Edge WebDriver"));
}
@Test
public void logsWithLevel() throws IOException {
File logLocation = getTempFile("logsWithLevel", ".log");
System.setProperty(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
EdgeDriverService service =
new EdgeDriverService.Builder().withLoglevel(ChromiumDriverLogLevel.DEBUG).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY, ChromiumDriverLogLevel.DEBUG.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withAppendLog(true).withReadableTimestamp(true).build();
driver = new EdgeDriver(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(EdgeDriverService.EDGE_DRIVER_LOG_PROPERTY, logLocation.getAbsolutePath());
System.setProperty(
EdgeDriverService.EDGE_DRIVER_LOG_LEVEL_PROPERTY,
ChromiumDriverLogLevel.WARNING.toString());
EdgeDriverService service =
new EdgeDriverService.Builder().withBuildCheckDisabled(true).build();
driver = new EdgeDriver(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 getEdgeLocation() {
EdgeOptions options = getDefaultEdgeOptions();
options.setBrowserVersion("stable");
DriverFinder finder = new DriverFinder(EdgeDriverService.createDefaultService(), options);
return new File(finder.getBrowserPath());
}
@Test
public void setPermissions() {
EdgeDriver driver = new EdgeDriver();
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 EdgeDriver();
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
((EdgeDriver) driver).setNetworkConditions(networkConditions);
driver.get("https://www.selenium.dev");
// Assert the network conditions are set as expected
ChromiumNetworkConditions actualConditions = ((EdgeDriver) 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())
);
((EdgeDriver) driver).deleteNetworkConditions();
driver.quit();
}
@Test
public void castFeatures() {
EdgeDriver driver = new EdgeDriver();
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() {
EdgeDriver driver = new EdgeDriver();
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')
Show full example
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_edge_options()
driver = webdriver.Edge(options=options)
driver.quit()
def test_args():
options = get_default_edge_options()
options.add_argument("--start-maximized")
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_set_browser_location(edge_bin):
options = get_default_edge_options()
options.binary_location = edge_bin
driver = webdriver.Edge(options=options)
driver.quit()
def test_add_extension():
options = get_default_edge_options()
extension_file_path = os.path.abspath("tests/extensions/webextensions-selenium-example.crx")
options.add_extension(extension_file_path)
driver = webdriver.Edge(options=options)
driver.get("https://www.selenium.dev/selenium/web/blank.html")
driver.quit()
def test_keep_browser_open():
options = get_default_edge_options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_exclude_switches():
options = get_default_edge_options()
options.add_experimental_option('excludeSwitches', ['disable-popup-blocking'])
driver = webdriver.Edge(options=options)
driver.get('http://selenium.dev')
driver.quit()
def test_log_to_file(log_path):
service = webdriver.EdgeService(log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as fp:
assert "Starting Microsoft Edge WebDriver" in fp.readline()
driver.quit()
def test_log_to_stdout(capfd):
service = webdriver.EdgeService(log_output=subprocess.STDOUT)
driver = webdriver.Edge(service=service)
out, err = capfd.readouterr()
assert "Starting Microsoft Edge WebDriver" in out
driver.quit()
def test_log_level(log_path):
service = webdriver.EdgeService(service_args=['--log-level=DEBUG'], log_output=log_path)
driver = webdriver.Edge(service=service)
with open(log_path, 'r') as f:
assert '[DEBUG]' in f.read()
driver.quit()
def test_log_features(log_path):
service = webdriver.EdgeService(service_args=['--append-log', '--readable-timestamp'], log_output=log_path)
driver = webdriver.Edge(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(log_path):
service = webdriver.EdgeService(service_args=['--disable-build-check'], log_output=log_path)
driver = webdriver.Edge(service=service)
expected = "[WARNING]: You are using an unsupported command-line switch: --disable-build-check"
with open(log_path, 'r') as f:
assert expected in f.read()
driver.quit()
def test_set_network_conditions():
driver = webdriver.Edge()
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.Edge()
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.Edge()
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.Edge()
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_edge_options():
options = webdriver.EdgeOptions()
options.add_argument("--no-sandbox")
return options
@driver.add_permission('camera', 'denied')
@driver.add_permissions('clipboard-read' => 'denied', 'clipboard-write' => 'prompt')
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Edge' do
describe 'Options' do
let(:edge_location) { driver_finder && ENV.fetch('EDGE_BIN', nil) }
it 'basic options' do
options = Selenium::WebDriver::Options.edge
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'add arguments' do
options = Selenium::WebDriver::Options.edge
options.args << '--start-maximized'
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'sets location of binary' do
options = Selenium::WebDriver::Options.edge
options.binary = edge_location
@driver = Selenium::WebDriver.for :edge, 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.edge
options.add_extension(extension_file_path)
@driver = Selenium::WebDriver.for :edge, 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.edge
options.detach = true
@driver = Selenium::WebDriver.for :edge, options: options
end
it 'excludes switches' do
options = Selenium::WebDriver::Options.edge
options.exclude_switches << 'disable-popup-blocking'
@driver = Selenium::WebDriver.for :edge, options: options
end
end
describe 'Service' do
let(:file_name) { File.expand_path('msedgedriver.log') }
after { FileUtils.rm_f(file_name) }
it 'logs to file' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
@driver = Selenium::WebDriver.for :edge, service: service
expect(File.readlines(file_name).first).to include('Starting Microsoft Edge WebDriver')
end
it 'logs to console' do
service = Selenium::WebDriver::Service.edge
service.log = $stdout
expect {
@driver = Selenium::WebDriver.for :edge, service: service
}.to output(/Starting Microsoft Edge WebDriver/).to_stdout_from_any_process
end
it 'sets log level' do
service = Selenium::WebDriver::Service.edge
service.log = file_name
service.args << '--log-level=DEBUG'
@driver = Selenium::WebDriver.for :edge, 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.edge(args: args)
service.args << '--append-log'
service.args << '--readable-timestamp'
@driver = Selenium::WebDriver.for :edge, 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.edge log: file_name, args: ['--verbose']
service.args << '--disable-build-check'
@driver = Selenium::WebDriver.for :edge, 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 :edge
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 :edge
@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 :edge
@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 :edge
@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.edge(browser_version: 'stable')
service = Selenium::WebDriver::Service.edge
finder = Selenium::WebDriver::DriverFinder.new(options, service)
ENV['EDGEDRIVER_BIN'] = finder.driver_path
ENV['EDGE_BIN'] = finder.browser_path
end
def permission(name)
@driver.execute_async_script('callback = arguments[arguments.length - 1];' \
'callback(navigator.permissions.query({name: arguments[0]}));', name)['state']
end
end
DevTools
See the [Chrome DevTools] section for more information about using DevTools in Edge