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 在取得網域和使用等待執行時增加了複雜性,因此 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 中取得網域和執行 await 的複雜性增加,因此 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 中取得網域和執行 await 的複雜性增加,因此 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);
下載完成
在繼續之前,請等待下載完成。由於取得下載狀態需要設定一個偵聽器,因此無法使用 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