ブラウザオプション
Selenium 3 では、Desired Capabilities クラスを使用してセッションで capabilities が定義されていました。Selenium 4 以降では、ブラウザオプションクラスを使用する必要があります。リモートドライバセッションの場合、ブラウザオプションインスタンスは、使用するブラウザを決定するために必須です。
これらのオプションは、Capabilities に関する w3c 仕様で説明されています。
各ブラウザには、仕様で定義されているものに加えて定義できるカスタムオプションがあります。
browserName
ブラウザ名は、Options クラスインスタンスを使用するとデフォルトで設定されます。
ChromeOptions chromeOptions = new ChromeOptions();
String name = chromeOptions.getBrowserName();
options = webdriver.ChromeOptions()
assert options.capabilities['browserName'] == 'chrome'
options = Selenium::WebDriver::Options.chrome
browserVersion
この機能はオプションであり、リモートエンドで使用可能なブラウザのバージョンを設定するために使用されます。最近のバージョンの Selenium では、システム上でバージョンが見つからない場合、Selenium Manager によって自動的にダウンロードされます。
ChromeOptions chromeOptions = new ChromeOptions();
String version = "latest";
chromeOptions.setBrowserVersion(version);
options = webdriver.ChromeOptions()
options.browser_version = 'stable'
assert options.capabilities['browserVersion'] == 'stable'
options.browser_version = 'latest'
pageLoadStrategy
3 種類のページロード戦略が利用可能です。
ページロード戦略は、以下の表で説明されているように、document.readyState をクエリします。
戦略 | Ready State | 注 |
---|---|---|
normal | complete | デフォルトで使用され、すべてのリソースがダウンロードされるのを待ちます |
eager | interactive | DOM アクセスは準備完了ですが、画像などの他のリソースはまだロード中である可能性があります |
none | any | WebDriver をまったくブロックしません |
ドキュメントの document.readyState
プロパティは、現在のドキュメントのロード状態を表します。
URL 経由で新しいページに移動する場合、デフォルトでは、WebDriver はドキュメントの readyState が complete になるまで、ナビゲーションメソッド (例: driver.navigate().get()) の完了を保留します。これは、特に Ready State が complete を返す後に JavaScript を使用してコンテンツを動的にロードするシングルページアプリケーションのようなサイトの場合、ページがロードを完了したことを必ずしも意味するわけではありません。また、この動作は、要素をクリックしたり、フォームを送信したりすることによるナビゲーションには適用されないことにも注意してください。
自動化にとって重要でないアセット (例: 画像、CSS、JS) のダウンロードの結果としてページのロードに時間がかかる場合は、デフォルトパラメータの normal
から eager
または none
に変更して、セッションを高速化できます。この値はセッション全体に適用されるため、待機戦略 が不安定さを最小限に抑えるのに十分であることを確認してください。
normal (デフォルト)
WebDriver は、load イベントの発火が返されるまで待機します。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NORMAL);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.Normal;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :normal
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('normal'))
.build();
await driver.get('https://selenium.dokyumento.jp/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NORMAL)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
eager
WebDriver は、DOMContentLoaded イベントの発火が返されるまで待機します。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.Eager;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :eager
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('eager'))
.build();
await driver.get('https://selenium.dokyumento.jp/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.EAGER)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
none
WebDriver は、最初のページがダウンロードされるまでのみ待機します。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE);
WebDriver driver = new ChromeDriver(chromeOptions);
options = webdriver.ChromeOptions()
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace pageLoadStrategy {
class pageLoadStrategy {
public static void Main(string[] args) {
var chromeOptions = new ChromeOptions();
chromeOptions.PageLoadStrategy = PageLoadStrategy.None;
IWebDriver driver = new ChromeDriver(chromeOptions);
try {
driver.Navigate().GoToUrl("https://example.com");
} finally {
driver.Quit();
}
}
}
}
options = Selenium::WebDriver::Options.chrome
options.page_load_strategy = :none
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setPageLoadStrategy('none'))
.build();
await driver.get('https://selenium.dokyumento.jp/selenium/web/blank.html');
await driver.quit();
import org.openqa.selenium.PageLoadStrategy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
fun main() {
val chromeOptions = ChromeOptions()
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE)
val driver = ChromeDriver(chromeOptions)
try {
driver.get("https://www.google.com")
}
finally {
driver.quit()
}
}
platformName
これは、リモートエンドのオペレーティングシステムを識別し、platformName
をフェッチすると OS 名が返されます。
クラウドベースのプロバイダでは、platformName
を設定すると、リモートエンドの OS が設定されます。
ChromeOptions chromeOptions = new ChromeOptions();
String platform = "OS X 10.6";
chromeOptions.setPlatformName(platform);
options = webdriver.ChromeOptions()
options.platform_name = 'any'
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.firefox
options.platform_name = 'Windows 10'
acceptInsecureCerts
この機能は、セッション中にナビゲート中に期限切れの (または) 無効な TLS 証明書
が使用されているかどうかを確認します。
機能が false
に設定されている場合、ナビゲーションがドメイン証明書の問題に遭遇すると、安全でない証明書エラー が返されます。true
に設定すると、無効な証明書はブラウザによって信頼されます。
すべての自己署名証明書は、デフォルトでこの機能によって信頼されます。一度設定すると、acceptInsecureCerts
機能はセッション全体に影響を与えます。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setAcceptInsecureCerts(true);
options = webdriver.ChromeOptions()
options.accept_insecure_certs = True
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.accept_insecure_certs = true
let driver = new Builder()
.forBrowser(Browser.CHROME)
.setChromeOptions(options.setAcceptInsecureCerts(true))
.build();
timeouts
WebDriver セッション
には、特定の セッションタイムアウト
間隔が課せられ、その間、ユーザはスクリプトの実行やブラウザからの情報の取得の動作を制御できます。
各セッションタイムアウトは、以下に説明するように、さまざまな timeouts
の組み合わせで構成されています。
スクリプトタイムアウト
現在のブラウジングコンテキストで実行中のスクリプトをいつ中断するかを指定します。WebDriver によって新しいセッションが作成されると、デフォルトのタイムアウト 30,000 が課せられます。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setScriptTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'script': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {script: 40_000}
ページロードタイムアウト
現在のブラウジングコンテキストで Web ページをロードする必要がある時間間隔を指定します。WebDriver によって新しいセッションが作成されると、デフォルトのタイムアウト 300,000 が課せられます。ページロードが指定/デフォルトのタイムフレームを制限する場合、スクリプトは TimeoutException によって停止されます。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setPageLoadTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'pageLoad': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {page_load: 400_000}
暗黙的な待機タイムアウト
これは、要素を検索する際の暗黙的な要素位置特定戦略を待機する時間を指定します。WebDriver によって新しいセッションが作成されると、デフォルトのタイムアウト 0 が課せられます。
ChromeOptions chromeOptions = new ChromeOptions();
Duration duration = Duration.of(5, ChronoUnit.SECONDS);
chromeOptions.setImplicitWaitTimeout(duration);
options = webdriver.ChromeOptions()
options.timeouts = { 'implicit': 5000 }
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.timeouts = {implicit: 1}
unhandledPromptBehavior
現在のセッションの ユーザプロンプトハンドラ
の状態を指定します。デフォルトは dismiss and notify 状態 です。
ユーザプロンプトハンドラ
これは、リモートエンドでユーザプロンプトが発生した場合にどのようなアクションを実行する必要があるかを定義します。これは unhandledPromptBehavior
機能によって定義され、次の状態があります。
- dismiss (閉じる)
- accept (同意する)
- dismiss and notify (閉じて通知する)
- accept and notify (同意して通知する)
- ignore (無視する)
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.DISMISS_AND_NOTIFY);
options = webdriver.ChromeOptions()
options.unhandled_prompt_behavior = 'accept'
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.unhandled_prompt_behavior = :accept
setWindowRect
リモートエンドが、サイズ変更と位置変更 コマンド のすべてをサポートしているかどうかを示します。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability(CapabilityType.SET_WINDOW_RECT, true);
options = webdriver.FirefoxOptions()
options.set_window_rect = True # Full support in Firefox
driver = webdriver.Firefox(options=options)
options = Selenium::WebDriver::Options.firefox
options.set_window_rect = true
strictFileInteractability
この新しい機能は、厳密なインタラクタビリティチェックを input type=file 要素に適用する必要があるかどうかを示します。厳密なインタラクタビリティチェックはデフォルトでオフになっているため、非表示のファイルアップロードコントロールで Element Send Keys を使用する場合、動作が変更されます。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability(CapabilityType.STRICT_FILE_INTERACTABILITY, true);
options = webdriver.ChromeOptions()
options.strict_file_interactability = True
driver = webdriver.Chrome(options=options)
options = Selenium::WebDriver::Options.chrome
options.strict_file_interactability = true
proxy
プロキシサーバは、クライアントとサーバ間のリクエストの中継役として機能します。簡単に言うと、トラフィックは要求したアドレスへの往復の途中でプロキシサーバを通過します。
Selenium を使用した自動化スクリプトのプロキシサーバは、以下に役立ちます。
- ネットワークトラフィックのキャプチャ
- Web サイトによって行われたバックエンド呼び出しのモック
- 複雑なネットワークトポロジまたは厳格な企業制限/ポリシーの下で必要な Web サイトへのアクセス。
企業環境にいて、ブラウザが URL に接続できない場合、これは環境がアクセスするためにプロキシを必要としている可能性が最も高いです。
Selenium WebDriver は、プロキシ設定を行う方法を提供します。
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class ProxyTest {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.setHttpProxy("<HOST:PORT>");
ChromeOptions options = new ChromeOptions();
options.setCapability("proxy", proxy);
WebDriver driver = new ChromeDriver(options);
driver.get("https://www.google.com/");
driver.manage().window().maximize();
driver.quit();
}
}
options = webdriver.ChromeOptions()
options.proxy = Proxy({ 'proxyType': ProxyType.MANUAL, 'httpProxy' : 'http.proxy:1234'})
driver = webdriver.Chrome(options=options)
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
public class ProxyTest{
public static void Main() {
ChromeOptions options = new ChromeOptions();
Proxy proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.SslProxy = "<HOST:PORT>";
options.Proxy = proxy;
options.AddArgument("ignore-certificate-errors");
IWebDriver driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://selenium.dokyumento.jp/");
}
}
options = Selenium::WebDriver::Options.chrome
options.proxy = Selenium::WebDriver::Proxy.new(http: 'myproxy.com:8080')
let webdriver = require('selenium-webdriver');
let chrome = require('selenium-webdriver/chrome');
let proxy = require('selenium-webdriver/proxy');
let opts = new chrome.Options();
(async function example() {
opts.setProxy(proxy.manual({http: '<HOST:PORT>'}));
let driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(opts)
.build();
try {
await driver.get("https://selenium.dokyumento.jp");
}
finally {
await driver.quit();
}
}());
import org.openqa.selenium.Proxy
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
class proxyTest {
fun main() {
val proxy = Proxy()
proxy.setHttpProxy("<HOST:PORT>")
val options = ChromeOptions()
options.setCapability("proxy", proxy)
val driver: WebDriver = ChromeDriver(options)
driver["https://www.google.com/"]
driver.manage().window().maximize()
driver.quit()
}
}