Chrome DevTools Protocol API
While Selenium 4 provides direct access to the Chrome DevTools Protocol (CDP), these methods will eventually be removed. It is recommended to use the WebDriver Bidi APIs methods where possible to ensure future compatibility.
Usage
If your use case has been implemented by WebDriver Bidi or the BiDi API, you should use those implementations instead of this one. Generally you should prefer this approach over executing with the CDP Endpoint, especially in Ruby.
Examples
Set Cookie
An alternate implementation can be found at CDP Endpoint Set Cookie
Because Java requires using all the parameters example, the Map approach used in CDP Endpoint Set Cookie might be more simple.
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()));
Because Python requires using async methods for this example, the synchronous approach found in CDP Endpoint Set Cookie might be easier.
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)
Due to the added complexity in .NET of obtaining the domains and executing with awaits, the CDP Endpoint Set Cookie might be easier.
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V118.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V118.Network.EnableCommandSettings());
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese",
Value = "gouda",
Domain = "www.selenium.dev",
Secure = true
};
await domains.Network.SetCookie(cookieCommandSettings);
driver.devtools.network.set_cookie(name: 'cheese',
value: 'gouda',
domain: 'www.selenium.dev',
secure: true)
Performance Metrics
An alternate implementation can be found at CDP Endpoint Performance Metrics
devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
Because Python requires using async methods for this example, the synchronous approach found in CDP Endpoint Performance Metrics might be easier.
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())
Due to the added complexity in .NET of obtaining the domains and executing with awaits, the CDP Endpoint Performance Metrics might be easier.
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V118.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V118.Performance.EnableCommandSettings());
var metricsResponse =
await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
new GetMetricsCommandSettings()
);
driver.devtools.performance.enable
metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')
Basic authentication
Alternate implementations can be found at CDP Endpoint Basic Authentication and BiDi API Basic Authentication
The BiDi API Basic Authentication implementation should be preferred
devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.of(100000), Optional.of(100000), Optional.of(100000)));
String encodedAuth = Base64.getEncoder().encodeToString("admin:admin".getBytes());
Map<String, Object> headers = ImmutableMap.of("Authorization", "Basic " + encodedAuth);
devTools.send(Network.setExtraHTTPHeaders(new Headers(headers)));
Because Python requires using async methods for this example, the synchronous approach found in CDP Endpoint Basic Authentication might be easier.
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)))
Due to the added complexity in .NET of obtaining the domains and executing with awaits, the CDP Endpoint Basic Authentication might be easier.
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V118.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V118.Network.EnableCommandSettings());
var encodedAuth = Convert.ToBase64String(Encoding.Default.GetBytes("admin:admin"));
var headerSettings = new SetExtraHTTPHeadersCommandSettings
{
Headers = new Headers()
{
{ "authorization", "Basic " + encodedAuth }
}
};
await domains.Network.SetExtraHTTPHeaders(headerSettings);
The BiDi API Basic Authentication implementation should be preferred
driver.devtools.network.enable
credentials = Base64.strict_encode64('admin:admin')
driver.devtools.network.set_extra_http_headers(headers: {authorization: "Basic #{credentials}"})
Console logs
Because reading console logs requires setting an event listener, this cannot be done with a CDP Endpoint implementation Alternate implementations can be found at BiDi API Console logs and errors and WebDriver BiDi Console logs
Use the WebDriver BiDi Console logs implementation
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Runtime.enable());
CopyOnWriteArrayList<String> logs = new CopyOnWriteArrayList<>();
devTools.addListener(
Runtime.consoleAPICalled(),
event -> logs.add((String) event.getArgs().get(0).getValue().orElse("")));
Use the BiDi API Console logs and errors implementation
Use the BiDi API Console logs and errors implementation
The BiDi API Console logs and errors implementation should be preferred
driver.devtools.runtime.enable
logs = []
driver.devtools.runtime.on(:console_api_called) do |params|
logs << params['args'].first['value']
end
JavaScript exceptions
Similar to console logs, but this listens for actual javascript exceptions not just logged errors Alternate implementations can be found at BiDi API JavaScript exceptions and WebDriver BiDi JavaScript exceptions
Use the WebDriver BiDi JavaScript exceptions implementation
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Runtime.enable());
CopyOnWriteArrayList<JavascriptException> errors = new CopyOnWriteArrayList<>();
devTools.getDomains().events().addJavascriptExceptionListener(errors::add);
Use the BiDi API JavaScript exceptions implementation
Use the BiDi API JavaScript exceptions implementation
Use the BiDi API JavaScript exceptions implementation
Download complete
Wait for a download to finish before continuing. Because getting download status requires setting a listener, this cannot be done with a CDP Endpoint implementation.
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.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