2014年2月20日木曜日

Selenium VBA: ブラウザをVBAから自動操作するだた1つの冴えた方法

【まえがき】

現状、VBAでInternetExplorer(IE)を自動制御(自動操作)するという話となると、Microsoft Internet Controlsを参照する、もしくは、CreateObjectを使うことで、IEオブジェクトを直接操作するのが定番かと思います。

自分自身、今までは、Excel VBAのマクロで,IEを自動操作しよう (DOMセレクタ関数をVBAで自作)というblog記事を参考に、IEの制御部分をラップしたクラス(VAMIE)を自作して使っていたのですが…。

自動制御の対象とする IEのバージョンが変わるごとに、細々とした修正の手間が生じる&バージョン間の差異を吸収するような不毛な処理を実装し続ける(※)ことに発狂しかけたので、このたび制御方法を見直し、決別することにしました。

※ ご存知の方も多いと思いますが、IEはバージョンによって挙動(DOM操作など)に差異があったりなかったりします。まともに複数バージョンのIEに対応したVBAコードを書こうとすると…(以下略

【IEを操作するただ1つの冴えた方法】

IEを直接操作することをやめ、Selenium VBAを利用することにしました。Selenium VBAは、Seleniumというブラウザ操作を仲介してくれるツールキットを、VBAから利用するためのラッパーです。

イメージ図を下に示すと、従来の操作方法が左、Selenium VBAを用いた方法が右になります。


Seleniumは、Webアプリの機能テストを自動化するためのツールキットで、Webアプリの自動テストを実現するために、各種ブラウザを制御する機能に加え、動作結果を確認するための機能が含まれています。今回は、Selenium が持つ機能のうち、ブラウザを制御する機能のみを用います。

Seleniumについては、下記blog記事の解説が大変分かり易いのでおススメです。

なお、Seleniumのブラウザの制御機能は強力で、IEに限らず、FirefoxやChrome、Phantom.js(GUIを備えないWebkitエンジンのブラウザ)の操作も可能です。また、ブラウザのバージョン間の挙動の差異も、Selenium側である程度吸収してくれます。

このSeleniumの強力なブラウザ制御機能を使うことで、VBA側では、Seleniumを操作するコード(ブラウザを直接操作する場合とほとんど同じです。)を書くだけで、どのブラウザ、どのバージョンであっても、だいたい同じように動作させることが可能になります。

要するに、Seleniumを介することで、ブラウザ間・バージョン間の挙動の差異に頭を悩まされることがなくなります。

ほんともう、使わない理由がないですね!

【インストール方法】

  • お好みでFirefoxをインストールしてください。
    • 下記理由から、インストールをお薦めします。
      • Firefox専用のプラグイン Selenium IDEを使うことで、Selenium操作用のコードを半自動で作成できます
      • Firefoxのインスペクタを使うとCSSセレクタが手軽に使えます。
  • Selenium VBAの公式サイト(Downloadsのページ) から、
    SeleniumWrapperSetup-*.*.*.*.exeというインストーラをダウンロードし、実行してください。
以上です。
別途Selenium公式のバイナリや、コンポーネントをダウンロードする必要はありません。(本来なら。)
Selenium VBAのインストーラに、必要なものがすべて含まれています。

なお、2014/2現在、Firefox 27をインストールした環境に、SeleniumWrapperSetup-1.0.17.0をインストールしたところ、下図のようにSelenium IDEのアイコンが表示されませんでした。

Selenium IDEのアイコンが表示されていない状態
Seleinum の公式サイト(Downloadsのページ)から、Selenium IDEをインストールし直すことで、正常に表示されるようになります。
(おそらく、Selenium VBAのインストーラに含まれるIDEのバージョンが古く、最新のFirefoxに対応していないのではないかと思うのですが…。未確認です。)

Selenium IDEのダウンロードリンクの場所
正常にアイコンが表示された状態

【サンプルコード】

インストール方法を書くだけで長くなってしまったので、今回は、いきなりサンプルコードになりますが、Selenium VBAを使うと、Googleを開いて検索するコードは、例えば、以下のような感じで書けます。


【使い方】

ざっくり書くと、Selenium VBAでのブラウザの制御方法は、

  • 制御するブラウザと、初期ページ(ベースとなるURL)の指定
  • 必要に応じて、ブラウザの設定
    • 上記サンプルコードでは省略
  • ページの取得
  • ページ内の各要素の操作

といった流れになります。
次回以降、複数回に分けてSelenium VBAを用いたブラウザの自動制御方法を解説したいと思います。

【ひとこと】

  • 何はともあれ、CreateObjectを使ったコードは窓から投げ捨てて、Selenium VBAを使えばいいと思うよ!