我が家の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を指定すればいい。