まえがき
SeleniumVBA という Excel VBA でブラウザを操作するための WebDriver のラッパー(HTTP クライアント)に触れる機会があり、そのとき覚えたことをまとめてみました。
準備
SeleniumVBA の入手
こちら からダウンロードできます。
本記事執筆時点の最新バージョンは 2.0
です。
アドイン登録
本家が Excel アドイン(SeleniumVBA.xlam)を用意してくれているので、Excel にそれを登録します。
- [開発]タブ ⇒ [Excel アドイン]ボタン ⇒ [アドイン]ダイアログ を表示
- [参照]ボタン ⇒ SeleniumVBA.xlam の格納パスに移動1 ⇒ SeleniumVBA.xlam を選択
- [有効なアドイン]に
Seleniumvba
が追加され、チェックが入っていることを確認
WebDriver の入手
操作したいブラウザの製品およびバージョンに合わせた WebDriver を入手します。
- Edge の場合
Microsoft Edge WebDriver - Chrome の場合
ChromeDriver - Firefox の場合
GeckoDriver
Edge 用は 64bit版
も提供されていますが、Chrome と Firefox は 32bit版
だけのようです。
ダウンロードした zip ファイルから、msedgedriver.exe / chromedriver.exe / geckodriver.exe を取り出し、任意のフォルダに配置します。
以降の実装サンプルは、マクロ有効ワークシート(.xlsm)と同じフォルダに配置した想定となります。
実装サンプル
SeleniumVBA のシンプルな使い方をサンプルコードとしてまとめました。
今後も可能な限り拡充予定です。
ブラウザ起動 / 終了
起動はターゲットのブラウザごとに若干異なります。
Dim driver As SeleniumVBA.WebDriver
Set driver = SeleniumVBA.New_WebDriver
driver.StartEdge ThisWorkbook.Path & "\msedgedriver.exe"
driver.OpenBrowser
Dim driver As SeleniumVBA.WebDriver
Set driver = SeleniumVBA.New_WebDriver
driver.StartChrome ThisWorkbook.Path & "\chromedriver.exe"
driver.OpenBrowser
Dim driver As SeleniumVBA.WebDriver
Set driver = SeleniumVBA.New_WebDriver
driver.StartFirefox ThisWorkbook.Path & "\geckodriver.exe"
driver.OpenBrowser
終了は共通です。
driver.CloseBrowser
driver.Shutdown
ページ移動
指定した URL にページ移動したい場合は、以下のようになります。
driver.NavigateTo "<url>"
進む(GoForward)
や 戻る(GoBack)
、再読み込みする(Refresh)
こともできます。
要素検索
ページ内の要素は ID
クラス名
CSS セレクタ
XPath
などの指定によって検索できます。
Dim element as WebElement
Set element = driver.FindElementByID("<id>")
Dim element as WebElement
Set element = driver.FindElementByClassName("<class_name>")
Dim element as WebElement
Set element = driver.FindElementByCssSelector("<css_selector>")
Dim element as WebElement
Set element = driver.FindElementByXPath("<xpath>")
上記以外にも 名前(Name)
リンクのテキスト(LinkText)
タグ名(TagName)
などの指定でも検索可能です。
クリック
あっさりしています。
element.Click
キー入力
入力フィールドへの入力や書き換えは、対象の要素にキー入力を送ることで実現します。
element.SendKeys "<入力文字列>"
キー入力は 1 度にまとめて渡す 必要があります。(複数回に分けて渡すと 毎回上書き され、最後の文字列だけが残ります)
また、Enter キー
を入力したい場合4は、vbCrLf
を末尾に付与します。
ちなみに、要素の属性(value
や text
など)を変更しても、そのままでは画面には反映されません。(属性の状態を監視して変更を画面に反映させるフレームワークを利用した Web サイトであれば、画面にも反映されると思います)
リスト選択
リストの選択は インデックス
値
表示テキスト
のいずれかの指定によって行います。
element.SelectByIndex <index>
リストの先頭のインデックス番号は 1
です。
element.SelectByValue "<value>"
element.SelectByVisibleText "<表示文字列>"
フレーム切替
フレームが入れ子になった html を操作する場合は、操作対象を含んだ <iframe>
の要素を指定してフレームを切り替える必要があります。
Set element = driver.FindElementByID("<iframe_id>")
driver.SwitchToFrame element
ウェイト
WebDriver はブラウザと同期しているわけではないので、適宜ウェイトを挟んで操作タイミングを調整する必要があります。
driver.Wait 3000
スクリーンショット
簡単にスクリーンショットを取ることができます。
driver.SaveScreenshot "<保存ファイル名>"
スクリーンショット以外にも、HTML 保存
や PDF 出力
も可能です。
ただし、PDF 出力
は ヘッドレスモード
でしか利用できないようです。
まとめ(サンプル)
Edge を自動操作して Yahoo! JAPAN の乗換案内 で 「東京」から「新宿」へ「最安」の「終電」で移動する場合 の乗換の検索を行うサンプルはこんな感じになります。
Option Explicit
Public Sub Main()
Dim driver As SeleniumVBA.WebDriver
Dim element As WebElement
Set driver = SeleniumVBA.New_WebDriver
'ブラウザ(Edge)起動
driver.StartEdge ThisWorkbook.Path & "\msedgedriver.exe"
driver.OpenBrowser
'Yahoo! JAPAN 路線情報
driver.NavigateTo "https://transit.yahoo.co.jp/"
'表示待ち(適宜調整)
driver.Wait 1000
'出発:東京
Set element = driver.FindElementByName("from")
element.SendKeys "東京"
'到着:新宿
Set element = driver.FindElementByName("to")
element.SendKeys "新宿"
'日時:終電
Set element = driver.FindElementByID("tsLas")
element.Click
'表示順序:料金が安い順
Set element = driver.FindElementByID("s")
element.SelectByVisibleText "料金が安い順"
'検索ボタンクリック
Set element = driver.FindElementByID("searchModuleSubmit")
element.Click
'表示待ち、兼、一時停止(適宜調整)
driver.Wait 5000
'結果保存
driver.SaveScreenshot ThisWorkbook.Path & "\ルート、運賃検索結果.png"
driver.SaveHTMLToFile driver.GetPageSource, ThisWorkbook.Path & "\ルート、運賃検索結果.html"
'ブラウザ終了
driver.CloseBrowser
driver.Shutdown
End
End Sub
補足説明
Excel アドインではなくソースをインポートした場合の差異
T.B.D.
あとがき
もともと まえがき として書いたものですが、読み手にとっては 時間の無駄でしかない内容 だと気づいたので途中で移動させました。
興味のあるかただけお読みください。
とあるヘルプデスク業務の支援で、ブラウザを自動操作して定型作業を効率化するツール を作ってほしい、という要望に対応することになりました。
このご時世なら Web API を叩くなり、Power Automate あたりでちゃちゃっと(?)作れたりするはずですが、環境上の制約(お約束?) でまさかの Excel VBA で作ることに。
ターゲットのブラウザが IE ならサンプルはいくらでも見つかるのですが、今回のターゲットは Edge(Chromium)でした。
ググってみても 直接制御は実質不可能という結論ばかり5が見つかり、どうしたものかと途方に暮れかけていたところ、 SeleniumBasic という VB.NET / VBA / VBScript から Selenium の WebDriver を扱えるようにしたフレームワークを見つけました。
コレならいけそうと飛びついてみたものの、原因不明のエラーが出て Edge が起動できないうえ、そもそも ヘルプデスク用の端末に SeleniumBasic をインストールできないかもしれない(手続きのハードルが高く、即時性に欠ける)、という問題にブチ当たり早くも頓挫しかけます。
そこで今度は SeleniumBasic の前身である Excel アドイン(およびソース)形式で提供されている SeleniumVBA に目を付けました。
こちらだと Edge の起動はあっさりできたのですが、目的の Web サービスに接続する手前の認証サービス(SSO)をパスするところから 躓きの連続 で、ひとつひとつ手探り6で解決していくことになりました。
といった紆余曲折を経て、なんとかツールの完成にこぎつけました(が、納期7はまったく守れませんでした)。
以上をふまえて、需要はほとんどなさそう8 ですが、自身の備忘も兼ねて SeleniumVBA の使い方をざっくりまとめてみることにしました。
-
Excel アドインのデフォルトの参照先である
%USER_PROFILE%\AppData\Roaming\Microsoft\AddIns
に SeleniumVBA.xlam を配置してしまうのもアリです ↩ -
Submit に相当するボタンがなく、Enter キー押下のイベントハンドラで Post 送信を行うような UI 設計の場合に必要になります ↩
-
“ウィンドウハンドルを指定してHTMLDocumentを捕まえる方法”で頑張ればできなくはない、という 記事 は見つけたのですが、これはこれでなかなか泥臭くもあり。。。 ↩
-
そもそも Excel VBA から WebDriver を介してブラウザ操作というのがニッチなのか、ネットでもほとんど情報が見つからず。。。 ↩
-
当初は「シフト勤務で 21:00 に着手して 6:00 までに完成してほしい」と言われましたが、結局ほぼ 3 日かかりました。。。 ↩
-
もしかすると誰か 1 人くらいの役には立てるかもしれない、と思いたい。。。 ↩