Chrome DevTools Protocol API
Selenium 4はChrome DevTools Protocol(CDP)への直接アクセスを提供しますが、これらのメソッドは最終的に削除されます。将来の互換性を確保するために、可能な限りWebDriver BiDi APIメソッドを使用することをお勧めします。
使用方法
ユースケースがWebDriver BiDiまたはBiDi APIによって実装されている場合は、この実装ではなく、それらの実装を使用する必要があります。 特にRubyでは、CDPエンドポイントで実行するよりも、一般的にこのアプローチを優先する必要があります。
例
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ではドメインを取得してawaitで実行することの複雑さが増すため、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);
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