Edge(Chromium) + Selenium(Python)を使ってみる ~導入編~

我が家のIEちゃんが余命いくばくもないのでブラウザ自動運転の後継を確保するべく簡単に調べた結果Seleniumとかいうのが今のところ一番メジャーらしい。ActiveX叩けば簡単に動かせてたIEに比べれば面倒臭いんだけど仕方ないね。もっと簡単なのがあればそっちがメジャーになってるだろうし。
なお資料は

を参照した。

まずは必要な物の確認

ブラウザ
これはEdge(Chromium)を使うものとする。Chromeは入れてないしFirefoxはなんだか面倒そうなので。
WebDriver
Windowsの設定からインストールすることが出来るらしい。なんと便利な。「設定→アプリ→オプション機能→機能の追加」からMicrosoft WebDriverを選ぶ。しかし後で問題発覚。素直にWebDriverを手動で落として来る事。
Selenium本体
言語はPythonとする。現在まだβのVer4推奨らしいがanaconda上にVer4が上がってない。公式推奨にも関わらず使う奴いないんだろうなたぶん。よく読むと「The Selenium Tools for Microsoft Edge」とやらを使えば同等の事が出来るらしい。仕方ないのでVer3に決定。

色々読むと基本これだけでいいらしい。

取り敢えずやってみるがWebDriverがおかしい

from selenium import webdriver
driver = webdriver.Edge(r"C:\windows\system32\MicrosoftWebDriver.exe")
driver.get("https://www.google.com")

こんな感じのコードをパクってきていざ実行・・・おい動かねーぞ!ブラウザは立ち上がるがぐぐるを開いてくれない。try-exceptでエラーコードを見るとどうもモジュール自体がエラーを吐いてる。WebDriverExceptionとか見えるが自動で落ちてくる奴がおかしいのか。仕方ないので検索して手動で探してきた奴を指定すると無事動いた。よく見ると自動で落ちてくる奴はMicrosoftWebDriver.exeだが手動で探してきた奴はmsedgedriver.exe。Selenium DocumentationによるとMicrosoftWebDriver.exeはLegacyつまり旧版Edge用でmsedgedriver.exeはChromium用だと。という事なので設定から自動で落ちてくる奴は使わない事。

The Selenium Tools for Microsoft Edge

Ver3の拡張パック的な物。これがあればVer4と同等の事が出来るらしい。

from msedge.selenium_tools import Edge, EdgeOptions
driver = Edge(executable_path="", capabilities=None, port=0, verbose=False, service_log_path=None, log_path=None, keep_alive=False, desired_capabilities=None, service_args=None, options=None)
WebDriver Class

インスタンス

引数 概要
executable_path string Edge用WebDriverのPathを指定する。未指定だとPathを通せば探しに行くらしい。
capabilities
desired_capabilities
dict 各ブラウザ共通の設定情報をdictで指定する。capabilitiesはLegacy Edge用でdesired_capabilitiesはChromium Edge用。だがちゃんと中でcapabilitiesとdesired_capabilitiesが振り分けれてるのでどっちでも問題ない。
port number サービスの実行ポートを指定する。defaultの0だと空きポートを適当に使う。
verbose boolean 詳細なログを吐く。
service_log_path string LogのPathを指定する。
log_path string 非推奨。service_log_pathを使う事。
keep_alive boolean EdgeRemoteConnectionでHTTP keep-aliveを有効にする。
service_args list serviceに渡す引数のListを指定する。
options object EdgeOptionsのインスタンスを指定する。

メソッド

メソッド名 引数 概要
launch_app id 指定したIDでEdgeアプリを起動する。オリジナルであるChromiumのドキュメントを読むと非公式のコマンドらしい。
get_network_conditions ネットワークの状態をdictで返す。
set_network_conditions offline
latency
download_throughput
upload_throughput
ネットワークの状態を設定する。
execute_cdp_cmd cmd
cmd_args
Edge Devtools Protocol commandを実行する。詳細はChrome DevTools Protocol参照。
quit ブラウザを閉じる。
create_options optionsのインスタンスを作る。後述するEdgeOptionsと全く一緒なのでどちらを使ってもいい。
Options Class

プロパティ

プロパティ名 概要
use_chromium boolean chromium版を使うかどうか。現状ほぼ必須。
use_webview boolean capabilityのbrowserNameにwebview2を設定する。Edgeアプリのレンダリングエンジンの事か。詳細不明。
page_load_strategy string capabilitiesのpageLoadStrategyを変更する。
capabilities read only、writeはset_capabilityを使う。
binary_location string ブラウザバイナリのpathを返す。
debugger_address string Devtoolsインスタンスのアドレスを返す。
arguments read only、writeはadd_argumentを使う。
extensions read only、writeはadd_extensionまたはadd_encoded_extensionを使う。
experimental_options read only、writeはadd_experimental_optionを使う。
headless boolean headlessモードを有効にするかどうか。GUIを表示せずに実行できるようになる。add_argumentで「--headless」を追加しても内部的には全く一緒だがheadlessプロパティはWindowsの場合「--disable-gpu」も一緒に追加しているので手間が一つ省ける。

メソッド

メソッド名 引数 概要
set_capability name
value
capabilitiesのブラウザ共通部分に項目を追加する。
to_capabilities capabilitiesオブジェクトを作成する。
add_argument argument capabilitiesのargsに追加する。
add_extension extension capabilitiesのextensionsに追加する。拡張機能のファイルPathを指定する事。
add_encoded_extension extension capabilitiesのextensionsに追加する。拡張機能のファイルをBase64エンコードした文字列を指定する事。
add_experimental_option name
value
capabilitiesのブラウザ固有部分に項目を追加する。
set_headless 廃止。headlessプロパティを使う事。
各ブラウザ共通capability

参考は下記。しかしW3Cにはproxyがあるのにseleniumの実装にはない。コマンドラインオプションにproxy関連があるからそっちでやれという事なんだろうか。

名前 概要
browserName string ブラウザ名。
browserVersion string ブラウザVer。
pageLoadStrategy string ページ読み込みの手順。使用可能な値は「normal, eager, none」の3つ。結局document.readyStateを見てるだけ。defaultのnormalはcomplete、eagerはeagerはinteractive、noneはAnyつまり何もしない。
platformName string 要はOS名。
acceptInsecureCerts boolean 名前通りでセキュアでない証明書を受け入れるかどうか。falseだとエラーを返す。
timeouts object タイムアウトを指定する。Script Timeout, Page Load Timeout, Implicit Wait TimeoutのObjectを指定する。
unhandledPromptBehavior string ブラウザがダイアログを出した場合の処理を指定する。
setWindowRect string ウィンドウのサイズと位置を変更する。内部でgetWindowRectを叩いてるだけ。
strictFileInteractability boolean type=fileのinput要素に厳密なチェックを行うかどうか。厳密なチェックとやらが何をするのか知らないが。
Edge固有capability

参考は下記。というかいちいち見に行くのが面倒なのでコピーしただけ。

ちなみにargsで指定できる値の一覧は下記。Chromiumの一覧だが「--headless」も「--disable-gpu」もちゃんとあるので大体あってるだろうたぶんきっと。

EdgeOptions オブジェクト

名前 概要
args list Microsoft Edge を起動するときに使用するコマンドライン引数の一覧です。 値が関連付けられた引数は、= 記号で区切る必要があります (['start-maximized', 'user-data-dir=/tmp/temp_profile'] など)。
binary string 使用する Microsoft Edge バイナリのパス (macOS では、アプリだけでなく実際のバイナリである必要があります。 例: /Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge)。
debuggerAddress string たとえば、接続先のデバッガー サーバーのアドレスを、次の hostname/ip:port 形式で指定します 127.0.0.1:38947 。
detach false WebDriver Microsoft Edgeがセッションを閉じていなくても、WebDriver サービスがシャットダウンすると終了します false 。 場合は、Microsoft Edge WebDriver ローカル エンドがセッションを閉じる場合 true にのみ終了します。 WebDriver ローカル エンドがセッションを閉じない場合は、ユーザー インスタンスで使用される一時的なユーザー true EdgeDriver データ フォルダー Microsoft Edgeされません。
excludeSwitches list Microsoft Edge の起動時に、既定で EdgeDriver によって除外される Microsoft Edge コマンド ライン スイッチの一覧。 スイッチの -- プレフィックスは使用しないようにします。
extensions list 起動時にインストールする拡張機能の一覧。 リスト内の各項目は、base-64 でエンコードされたパック拡張 (.crx) である必要があります。
localState dict 基本設定の名前と値で構成される各エントリを持つ辞書。 ユーザー設定は、ユーザー データ フォルダー内のローカル状態ファイルに適用されます。
minidumpPath string Microsoft Edge ミニダンプを保存するディレクトリ。 (Linux でのみサポートされています。)
mobileEmulation dict deviceName の値、または deviceMetrics および userAgent の値を含むディクショナリ。
perfLoggingPrefs dict パフォーマンス ログの設定を指定するオプションのディクショナリ。 詳細については、「perfLoggingPrefs オブジェクト」を参照してください。
prefs dict 基本設定の名前と値で構成される各エントリを持つ辞書。 ユーザー設定は、使用中のユーザー プロファイルにのみ適用されます。 たとえば、ファイルのユーザー データ Preferences フォルダー内のファイルに移動Microsoft Edge
wdpAddress string 接続先の Windowsバイス ポータル サーバーのアドレス。hostname/ip:port の形式で指定します。例: 127.0.0.1:50080。 詳細については、「リモート デバッグ-Windows 10 デバイス」を参照してください。
wdpPassword string Windowsバイス ポータル サーバーに接続するときに使用するオプションのパスワードです。 サーバーで認証が有効になっている場合は必須です。
wdpUsername string バイス ポータル サーバーへの接続時に使用Windowsオプションのユーザー名。 サーバーで認証が有効になっている場合は必須です。
windowsApp string 起動する Microsoft Edge アプリ パッケージのアプリケーション ユーザー モデル ID。例: Microsoft.MicrosoftEdge.Stable_8wekyb3d8bbwe!MSEDGE。 Windowsバイス ポータルを使って Windows 10X デバイスまたはエミュレーターに接続する場合は、binary の代わりに windowsApp を使います。
windowTypes list ウィンドウ ハンドルの一覧に表示されるウィンドウの型の一覧。 Android webview 要素にアクセスするには、一覧に webview を含めます。

perfLoggingPrefs オブジェクト

キー 既定値 詳細
bufferUsageReportingInterval 正の整数 1000 DevTools トレース バッファー使用量イベント間の要求されたミリ秒数。 たとえば、1000 の場合は 1 秒に 1 回、すべてのトレースバッファーの量が報告されます。 レポートにバッファー使用量が 100% と示されている場合は、警告が発生します。
enableNetwork ブール値 true ネットワーク ドメインからイベントを収集します (または収集しません)。
enablePage ブール値 true ページ ドメインからイベントを収集します (または収集しません)。
traceCategories 文字列 (空) トレース イベントを収集する Microsoft Edge トレース カテゴリのコンマ区切り文字列。 未指定または空の文字列は、トレースを無効にします。

Webdriver Manager for Python

ブラウザのVerとWebDriverのVerは合わせる必要がある。しかしEdgeは知らないうちにUpdateしてるので面倒臭い。とか思ってたらその辺をいい感じに解決してくれる便利アイテムがあるらしい。それはいいんだけど各ブラウザの公式からじゃなくてどのブラウザもWebDriverを置いておくスペースを別途用意してそこから落とすんだな。あとよくエラーを吐くがたぶんサーバーが不安定なんだろう。

from msedge.selenium_tools import Edge, EdgeOptions
from webdriver_manager.microsoft import EdgeChromiumDriverManager
options = EdgeOptions()
options.use_chromium = True
driver = Edge(executable_path = EdgeChromiumDriverManager().install(), options = options)
driver.get("https://www.google.co.jp")

こんな感じでWebDriverがなければ勝手に落としてきてくれあまつさえVerチェックまでしてくれる。特に何も指定しなければWebDriverのPathは「C:\Users\user名\.wdm\drivers\edgedriver\win64\Ver\msedgedriver.exe」となるが場所を指定したければ

from msedge.selenium_tools import Edge, EdgeOptions
from webdriver_manager.microsoft import EdgeChromiumDriverManager
options = EdgeOptions()
options.use_chromium = True
driver = Edge(executable_path = EdgeChromiumDriverManager(path="C:\webdriver").install(), options = options)
driver.get("https://www.google.co.jp")

とEdgeChromiumDriverManagerでpathを指定すればいい。