ブラウザオプション

これらの機能はすべてのブラウザで共有されています。

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
normalcompleteデフォルトで使用され、すべてのリソースがダウンロードされるのを待ちます
eagerinteractiveDOM アクセスは準備完了ですが、画像などの他のリソースはまだロード中である可能性があります
noneanyWebDriver をまったくブロックしません

ドキュメントの 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()
    }
}