Chrome DevTools Network Features
Network features using CDP.
Page being translated from English to Chinese. Do you speak Chinese? Help us to translate it by sending us pull requests!
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);
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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)))
/examples/python/tests/bidi/cdp/test_network.py
import base64 import pytest from selenium.webdriver.common.by import By from selenium.webdriver.common.devtools.v137.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();
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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/)
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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; })) {
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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();
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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!"))))) {
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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();
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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); })) {
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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();
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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());
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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())
/examples/python/tests/bidi/cdp/test_network.py
import base64 import pytest from selenium.webdriver.common.by import By from selenium.webdriver.common.devtools.v137.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.V137.Performance.EnableCommandSettings()); var metricsResponse = await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>( new GetMetricsCommandSettings() );
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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')
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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()));
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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)
/examples/python/tests/bidi/cdp/test_network.py
import base64 import pytest from selenium.webdriver.common.by import By from selenium.webdriver.common.devtools.v137.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);
/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
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.V137.Network; using OpenQA.Selenium.DevTools.V137.Performance; namespace SeleniumDocs.BiDi.CDP { [TestClass] public class NetworkTest : BaseTest { [TestInitialize] public void Startup() { StartDriver("137"); } [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.V137.DevToolsSessionDomains>(); await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V137.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.V137.DevToolsSessionDomains>(); await domains.Network.Enable(new OpenQA.Selenium.DevTools.V137.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)
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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)));
/examples/java/src/test/java/dev/selenium/bidi/cdp/NetworkTest.java
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.v137.browser.Browser; import org.openqa.selenium.devtools.v137.network.Network; import org.openqa.selenium.devtools.v137.performance.Performance; import org.openqa.selenium.devtools.v137.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
/examples/ruby/spec/bidi/cdp/network_spec.rb
# 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
最后修改 August 17, 2024: add missing foreign language pages under cdp (#1864) (36b16c7407d)