Chrome DevTools Network Features
Network features using CDP.
While Selenium 4 provides direct access to the Chrome DevTools Protocol, these methods will eventually be removed when WebDriver BiDi implemented.
Basic authentication
Some applications make use of browser authentication to secure pages. It used to be common to handle them in the URL, but browsers stopped supporting this. With this code you can insert the credentials into the header when necessary
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
credentials = base64.b64encode("admin:admin".encode()).decode()
auth = {'authorization': 'Basic ' + credentials}
await connection.session.execute(connection.devtools.network.set_extra_http_headers(Headers(auth)))
Show full example
import base64
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.common.devtools.v134.network import Headers
@pytest.mark.trio
async def test_basic_auth(driver):
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.network.enable())
credentials = base64.b64encode("admin:admin".encode()).decode()
auth = {'authorization': 'Basic ' + credentials}
await connection.session.execute(connection.devtools.network.set_extra_http_headers(Headers(auth)))
driver.get('https://the-internet.herokuapp.com/basic_auth')
success = driver.find_element(by=By.TAG_NAME, value='p')
assert success.text == 'Congratulations! You must have the proper credentials.'
@pytest.mark.trio
async def test_performance(driver):
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.performance.enable())
metric_list = await connection.session.execute(connection.devtools.performance.get_metrics())
metrics = {metric.name: metric.value for metric in metric_list}
assert metrics["DevToolsCommandDuration"] > 0
assert metrics["Frames"] == 12
@pytest.mark.trio
async def test_set_cookie(driver):
async with driver.bidi_connection() as connection:
execution = connection.devtools.network.set_cookie(
name="cheese",
value="gouda",
domain="www.selenium.dev",
secure=True
)
await connection.session.execute(execution)
driver.get("https://www.selenium.dev")
cheese = driver.get_cookie("cheese")
assert cheese["value"] == "gouda"
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Network Interception
Both requests and responses can be recorded or transformed.
Response information
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Response transformation
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Request interception
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Performance Metrics
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.performance.enable())
metric_list = await connection.session.execute(connection.devtools.performance.get_metrics())
Show full example
import base64
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.common.devtools.v134.network import Headers
@pytest.mark.trio
async def test_basic_auth(driver):
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.network.enable())
credentials = base64.b64encode("admin:admin".encode()).decode()
auth = {'authorization': 'Basic ' + credentials}
await connection.session.execute(connection.devtools.network.set_extra_http_headers(Headers(auth)))
driver.get('https://the-internet.herokuapp.com/basic_auth')
success = driver.find_element(by=By.TAG_NAME, value='p')
assert success.text == 'Congratulations! You must have the proper credentials.'
@pytest.mark.trio
async def test_performance(driver):
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.performance.enable())
metric_list = await connection.session.execute(connection.devtools.performance.get_metrics())
metrics = {metric.name: metric.value for metric in metric_list}
assert metrics["DevToolsCommandDuration"] > 0
assert metrics["Frames"] == 12
@pytest.mark.trio
async def test_set_cookie(driver):
async with driver.bidi_connection() as connection:
execution = connection.devtools.network.set_cookie(
name="cheese",
value="gouda",
domain="www.selenium.dev",
secure=True
)
await connection.session.execute(execution)
driver.get("https://www.selenium.dev")
cheese = driver.get_cookie("cheese")
assert cheese["value"] == "gouda"
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Setting Cookies
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
async with driver.bidi_connection() as connection:
execution = connection.devtools.network.set_cookie(
name="cheese",
value="gouda",
domain="www.selenium.dev",
secure=True
)
await connection.session.execute(execution)
Show full example
import base64
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.common.devtools.v134.network import Headers
@pytest.mark.trio
async def test_basic_auth(driver):
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.network.enable())
credentials = base64.b64encode("admin:admin".encode()).decode()
auth = {'authorization': 'Basic ' + credentials}
await connection.session.execute(connection.devtools.network.set_extra_http_headers(Headers(auth)))
driver.get('https://the-internet.herokuapp.com/basic_auth')
success = driver.find_element(by=By.TAG_NAME, value='p')
assert success.text == 'Congratulations! You must have the proper credentials.'
@pytest.mark.trio
async def test_performance(driver):
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
async with driver.bidi_connection() as connection:
await connection.session.execute(connection.devtools.performance.enable())
metric_list = await connection.session.execute(connection.devtools.performance.get_metrics())
metrics = {metric.name: metric.value for metric in metric_list}
assert metrics["DevToolsCommandDuration"] > 0
assert metrics["Frames"] == 12
@pytest.mark.trio
async def test_set_cookie(driver):
async with driver.bidi_connection() as connection:
execution = connection.devtools.network.set_cookie(
name="cheese",
value="gouda",
domain="www.selenium.dev",
secure=True
)
await connection.session.execute(execution)
driver.get("https://www.selenium.dev")
cheese = driver.get_cookie("cheese")
assert cheese["value"] == "gouda"
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
Show full example
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.DevTools;
using System.Linq;
using OpenQA.Selenium.DevTools.V132.Network;
using OpenQA.Selenium.DevTools.V132.Performance;
namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
public class NetworkTest : BaseTest
{
[TestInitialize]
public void Startup()
{
StartDriver("132");
}
[TestMethod]
public async Task BasicAuthentication()
{
var handler = new NetworkAuthenticationHandler()
{
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("Congratulations! You must have the proper credentials.",
driver.FindElement(By.TagName("p")).Text);
}
[TestMethod]
public async Task RecordNetworkResponse()
{
var contentType = new List<string>();
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.NetworkResponseReceived += (_, e) =>
{
contentType.Add(e.ResponseHeaders["content-type"]);
};
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/blank.html");
await networkInterceptor.StopMonitoring();
Assert.AreEqual("text/html; charset=utf-8", contentType[0]);
}
[TestMethod]
public async Task TransformNetworkResponse()
{
var handler = new NetworkResponseHandler()
{
ResponseMatcher = _ => true,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddResponseHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Navigate().GoToUrl("https://www.selenium.dev");
await networkInterceptor.StopMonitoring();
var body = driver.FindElement(By.TagName("body"));
Assert.AreEqual("Creamy, delicious cheese!", body.Text);
}
[TestMethod]
public async Task TransformNetworkRequest()
{
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request.Url.Contains("one.js"),
RequestTransformer = request =>
{
request.Url = request.Url.Replace("one", "two");
return request;
}
};
INetwork networkInterceptor = driver.Manage().Network;
networkInterceptor.AddRequestHandler(handler);
await networkInterceptor.StartMonitoring();
driver.Url = "https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html";
driver.FindElement(By.TagName("button")).Click();
await networkInterceptor.StopMonitoring();
Assert.AreEqual("two", driver.FindElement(By.Id("result")).Text);
}
[TestMethod]
public async Task PerformanceMetrics()
{
driver.Url = "https://www.selenium.dev/selenium/web/frameset.html";
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V132.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
var metrics = metricsResponse.Metrics.ToDictionary(
dict => dict.Name,
dict => dict.Value
);
Assert.IsTrue(metrics["DevToolsCommandDuration"] > 0);
Assert.AreEqual(12, metrics["Frames"]);
}
[TestMethod]
public async Task SetCookie()
{
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V132.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V132.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.Url = "https://www.selenium.dev";
OpenQA.Selenium.Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
Assert.AreEqual("gouda", cheese.Value);
}
}
}
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end
Waiting for Downloads
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
Show full example
package dev.selenium.bidi.cdp;
import com.google.common.net.MediaType;
import dev.selenium.BaseTest;
import java.net.*;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.NetworkInterceptor;
import org.openqa.selenium.devtools.v134.browser.Browser;
import org.openqa.selenium.devtools.v134.network.Network;
import org.openqa.selenium.devtools.v134.performance.Performance;
import org.openqa.selenium.devtools.v134.performance.model.Metric;
import org.openqa.selenium.remote.http.*;
import org.openqa.selenium.support.ui.WebDriverWait;
public class NetworkTest extends BaseTest {
@BeforeEach
public void createSession() {
driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
@Test
public void basicAuthentication() {
Predicate<URI> uriPredicate = uri -> uri.toString().contains("herokuapp.com");
Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin");
((HasAuthentication) driver).register(uriPredicate, authentication);
driver.get("https://the-internet.herokuapp.com/basic_auth");
String successMessage = "Congratulations! You must have the proper credentials.";
WebElement elementMessage = driver.findElement(By.tagName("p"));
Assertions.assertEquals(successMessage, elementMessage.getText());
}
@Test
public void recordResponse() {
CopyOnWriteArrayList<String> contentType = new CopyOnWriteArrayList<>();
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
HttpResponse res = next.execute(req);
contentType.add(res.getHeader("Content-Type"));
return res;
})) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
wait.until(_d -> contentType.size() > 1);
}
Assertions.assertEquals("text/html; charset=utf-8", contentType.get(0));
}
@Test
public void transformResponses() {
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
Route.matching(req -> true)
.to(
() ->
req ->
new HttpResponse()
.setStatus(200)
.addHeader("Content-Type", MediaType.HTML_UTF_8.toString())
.setContent(Contents.utf8String("Creamy, delicious cheese!"))))) {
driver.get("https://www.selenium.dev/selenium/web/blank.html");
}
WebElement body = driver.findElement(By.tagName("body"));
Assertions.assertEquals("Creamy, delicious cheese!", body.getText());
}
@Test
public void interceptRequests() {
AtomicBoolean completed = new AtomicBoolean(false);
try (NetworkInterceptor ignored =
new NetworkInterceptor(
driver,
(Filter)
next ->
req -> {
if (req.getUri().contains("one.js")) {
req =
new HttpRequest(
HttpMethod.GET, req.getUri().replace("one.js", "two.js"));
}
completed.set(true);
return next.execute(req);
})) {
driver.get("https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html");
driver.findElement(By.tagName("button")).click();
}
Assertions.assertEquals("two", driver.findElement(By.id("result")).getText());
}
@Test
public void performanceMetrics() {
driver.get("https://www.selenium.dev/selenium/web/frameset.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Map<String, Number> metrics = new HashMap<>();
for (Metric metric : metricList) {
metrics.put(metric.getName(), metric.getValue());
}
Assertions.assertTrue(metrics.get("DevToolsCommandDuration").doubleValue() > 0);
Assertions.assertEquals(12, metrics.get("Frames").intValue());
}
@Test
public void setCookie() {
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Network.setCookie(
"cheese",
"gouda",
Optional.empty(),
Optional.of("www.selenium.dev"),
Optional.empty(),
Optional.of(true),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty()));
driver.get("https://www.selenium.dev");
Cookie cheese = driver.manage().getCookieNamed("cheese");
Assertions.assertEquals("gouda", cheese.getValue());
}
@Test
public void waitForDownload() {
driver.get("https://www.selenium.dev/selenium/web/downloads/download.html");
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(
Browser.setDownloadBehavior(
Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
Optional.empty(),
Optional.of(""),
Optional.of(true)));
AtomicBoolean completed = new AtomicBoolean(false);
devTools.addListener(
Browser.downloadProgress(),
e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
driver.findElement(By.id("file-2")).click();
Assertions.assertDoesNotThrow(() -> wait.until(_d -> completed));
}
}
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
Show full example
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Network' do
let(:driver) { start_session }
it 'does basic authentication' do
driver.register(username: 'admin',
password: 'admin',
uri: /herokuapp/)
driver.get('https://the-internet.herokuapp.com/basic_auth')
expect(driver.find_element(tag_name: 'p').text).to eq('Congratulations! You must have the proper credentials.')
end
it 'records network response' do
content_type = []
driver.intercept do |request, &continue|
continue.call(request) do |response|
content_type << response.headers['content-type']
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(content_type.first).to eq('text/html; charset=utf-8')
end
it 'transforms network response' do
driver.intercept do |request, &continue|
continue.call(request) do |response|
response.body = 'Creamy, delicious cheese!' if request.url.include?('blank')
end
end
driver.get('https://www.selenium.dev/selenium/web/blank.html')
expect(driver.find_element(tag_name: 'body').text).to eq('Creamy, delicious cheese!')
end
it 'intercepts network request' do
driver.intercept do |request, &continue|
uri = URI(request.url)
request.url = uri.to_s.gsub('one', 'two') if uri.path&.end_with?('one.js')
continue.call(request)
end
driver.get('https://www.selenium.dev/selenium/web/devToolsRequestInterceptionTest.html')
driver.find_element(tag_name: 'button').click
expect(driver.find_element(id: 'result').text).to eq('two')
end
it 'gets performance metrics' do
driver.get('https://www.selenium.dev/selenium/web/frameset.html')
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
metrics = metric_list.each_with_object({}) do |metric, hash|
hash[metric['name']] = metric['value']
end
expect(metrics['DevToolsCommandDuration']).to be > 0
expect(metrics['Frames']).to eq 12
end
it 'sets cookie' do
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
driver.get('https://www.selenium.dev')
cheese = driver.manage.cookie_named('cheese')
expect(cheese[:value]).to eq 'gouda'
end
it 'waits for downloads', except: {platform: :windows} do
driver.get('https://www.selenium.dev/selenium/web/downloads/download.html')
driver.devtools.browser.set_download_behavior(behavior: 'allow',
download_path: '',
events_enabled: true)
driver.devtools.browser.on(:download_progress) do |progress|
@completed = progress['state'] == 'completed'
end
driver.find_element(id: 'file-2').click
expect { Selenium::WebDriver::Wait.new.until { @completed } }.not_to raise_exception
end
end