Chrome DevTools 协议 API
虽然 Selenium 4 提供对 Chrome DevTools 协议 (CDP) 的直接访问,但最终会删除这些方法。建议尽可能使用 WebDriver Bidi API 方法,以确保未来的兼容性。
用法
如果您的用例已由 WebDriver Bidi 或 BiDi API 实现,您应该使用这些实现,而不是此实现。通常,您应该优先考虑此方法,而不是使用 CDP 端点 执行,尤其是在 Ruby 中。
示例
设置 Cookie
可以在 CDP 端点设置 Cookie 中找到备用实现。
由于 Java 需要使用所有参数示例,因此 CDP 端点设置 Cookie 中使用的 Map 方法可能更简单。
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()));
由于 Python 需要对该示例使用异步方法,因此 CDP 端点设置 Cookie 中找到的同步方法可能更容易。
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)
由于 .NET 中获取域并使用 awaits 执行的复杂性增加,因此 CDP 端点设置 Cookie 可能更容易。
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V121.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)
性能指标
可以在 CDP 端点性能指标 中找到备用实现。
devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metricList = devTools.send(Performance.getMetrics());
由于 Python 需要对该示例使用异步方法,因此 CDP 端点性能指标 中找到的同步方法可能更容易。
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())
由于 .NET 中获取域并使用 awaits 执行的复杂性增加,因此 CDP 端点性能指标 可能更容易。
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V121.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')
基本身份验证
可以在 CDP 端点基本身份验证 和 BiDi API 基本身份验证 中找到备用实现。
应优先使用 BiDi API 基本身份验证 实现。
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)));
由于 Python 需要对该示例使用异步方法,因此 CDP 端点基本身份验证 中找到的同步方法可能更容易。
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)))
由于 .NET 中获取域并使用 awaits 执行的复杂性增加,因此 CDP 端点基本身份验证 可能更容易。
var session = ((IDevTools)driver).GetDevToolsSession();
var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
await domains.Network.Enable(new OpenQA.Selenium.DevTools.V121.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);
应优先使用 BiDi API 基本身份验证 实现。
driver.devtools.network.enable
credentials = Base64.strict_encode64('admin:admin')
driver.devtools.network.set_extra_http_headers(headers: {authorization: "Basic #{credentials}"})
控制台日志
由于读取控制台日志需要设置事件侦听器,因此无法使用 CDP 端点实现。可以在 BiDi API 控制台日志和错误 和 WebDriver BiDi 控制台日志 中找到备用实现。
使用 WebDriver BiDi 控制台日志 实现。
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("")));
使用 BiDi API 控制台日志和错误 实现。
使用 BiDi API 控制台日志和错误 实现。
应优先使用 BiDi API 控制台日志和错误 实现。
driver.devtools.runtime.enable
logs = []
driver.devtools.runtime.on(:console_api_called) do |params|
logs << params['args'].first['value']
end
JavaScript 异常
与控制台日志类似,但它侦听实际的 javascript 异常,而不仅仅是记录的错误。可以在 BiDi API JavaScript 异常 和 WebDriver BiDi JavaScript 异常 中找到备用实现。
使用 WebDriver BiDi JavaScript 异常 实现。
DevTools devTools = ((HasDevTools) driver).getDevTools();
devTools.createSession();
devTools.send(Runtime.enable());
CopyOnWriteArrayList<JavascriptException> errors = new CopyOnWriteArrayList<>();
devTools.getDomains().events().addJavascriptExceptionListener(errors::add);
使用 BiDi API JavaScript 异常 实现。
使用 BiDi API JavaScript 异常 实现。
使用 BiDi API JavaScript 异常 实现。
下载完成
在继续之前,请等待下载完成。由于获取下载状态需要设置一个侦听器,因此无法使用 CDP 端点实现来完成此操作。
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