自動でブラウザを操作するためには、何を知り何をすればいいのか、その方法を以下。
Selenium WebDriverとは
プログラム言語(Java/C#/Ruby/Python/Javascript)からブラウザを操作するためのフレームワークのことです。(厳密には定義が違うかもしれませんが。)
操作できるブラウザは?
Chrome, FireFox, IEなど、有名どころはもちろん、そのほかのブラウザも色々と操作できます。
原理としては、Selenium WebDriverから直接ブラウザを操作するのではなく、IEを操作したいのならIE用のドライバを、FireFoxを操作したいのならFireFox用のドライバにプログラム言語から命令を投げ、間接的にブラウザを操作する形となるので、
ブラウザに依存しない操作用のスクリプトを作成可能です。
つまり・・・
Selenium WebDriver → 各ブラウザ用ドライバ → ブラウザ
といった操作の委譲がなされるわけですね。
実際にC#で操作してみる
Visual Studioでの導入はすごく楽なので、C#選んでみました。
何も知らない人用にプロジェクトの作成から。
ファイル→新規作成→プロジェクトをクリック
今回は、簡易的なアプリケーションにするために、コンソールアプリケーションを選択。
ソリューションを作成する場所、プロジェクト名を決めて、"ソリューションのディレクトリを作成"にチェックを入れてください。
ソリューション、プロジェクトの作成が完了しました。
さて、まずはブラウザの操作に必須の、Selenium WebDriverをnuget経由でインストールしましょう。
上部ナビゲーションから、表示→その他のウィンドウ→パッケージマネージャーコンソールを選択。
下にパッケージマネージャーコンソールが現れたので、以下の通り入力し、エンターを押してください。
Install-Package Selenium.WebDriver
これで無事Selenium WebDriverの導入が完了しました。プロジェクトの参照に、WebDriverがあることが確認できます。
コンソールにも正常にインストールされましたの文字が確認できますね。
さてさて、今回はIEを操作してみたいと思います。
Seleniumのサイトから、IE用ドライバをダウンロードします。64bitのIEを操作したいなら、64bit版をダウンロードしてください。
さて、実際にドライバをプログラムから使うためには、ドライバの存在するディレクトリのフルパスを与えてやる必要があります。
適当な場所において、その場所の絶対パスを与えてやってもいいんですが、今回は常に操作するプログラムがある場所ならどこでも操作できるようにしておきます。
そこで、ダウンロードしたIE用ドライバ( .exe ) をプロジェクトに追加するので、プロジェクト上で右クリック→追加→既存の項目を選択します。
プログラムの種類を全てのファイルにして、IE用ドライバを選択して追加をクリック。
これでIE用ドライバをプロジェクトに認識させることができましたが、このexeを常に実行用ディレクトリに置くために、IE用ドライバ上で右クリック→プロパティを選択。
プロパティウィンドウの"出力ディレクトリにコピー"を、"常にコピーする"に設定します。
これで、ビルド先のexeと同ディレクトリにIE用ドライバのexeも配置されることになります。
準備完了、あとはプログラムを書いていくだけ。
まずは、以下の通りIWebDriver型の変数を宣言し、IE用ドライバのインスタンスを与えてやります。この際、コンストラクタにIE用ドライバがあるディレクトリのパスを与えてやることで動くようになります。
今回は、実行用ディレクトリにIE用ドライバがあることとしているので、カレントディレクトリのパスを与えています。
さて、なぜIWebDriver型の変数を宣言しているかというと、インターフェースの型なので、これにクロームのドライバを与えてやれば型宣言を書き換えずにクロームの操作もできるように、といった感じです。
ブラウザの操作は、すべてこのIWebDriver型の変数を用いて行います。
次に、google.comに遷移させてみましょう。Navigate().GoToUrlメソッドに、遷移先URLを与えてやります。実行してください。
Windows Firewallを起動している場合、権限をきいてきますのでアクセスを許可させてください。
あれ失敗・・・どうやら、保護モードをすべてのゾーンで外すように、とのことです。
IEを開き、インターネットオプションから、セキュリティタブの保護モードを有効にする、のチェックを外してください。
さて、これで実行すれば以下の画面が立ち上がるはずです。めでたい。
では、実際に検索テキストボックスに値を入力させてみましょう。
F12キーを押し、開発者モードを起動してください。DOMExplorerから、左端のアイコンをクリックした後、テキストボックスをクリック。
そうすると、テキストボックスのidが分かるので、これをコピー。
先ほど取得したid値の要素(Selenium上では、element)を取得するために、
IWebElement型の変数に、ドライバー.FindElement(By.Id("id値"))とした要素を代入。
ここでも、IWebElement型の変数を用いて、様々なwebの要素を一括して操作できるようにしています。
その後、ドライバー.Clear()としてテキストボックスをいったんクリアして、
SendKeys("入力値")でキーボードからの値入力をシミュレートします。
そうすると・・・無事テキストボックスに値が入力できましたので、
次に横の検索ボタンを押させてみます。
ボタンには、nameしかなかったので、By.Name("name値")として、elementを取得して、
そのelement.Click()で、クリックをシミュレートします。
これで無事検索ができました。
IEとかのドライバを終了させるためには、Quit()を呼び出す必要があるので、finallyで処理させればよいです。
さて、単純でしたがいかがでしたでしょうか。
簡単ですよね?
以前、外貨レート取得の操作もしてみたので、よかったらそちらも参考にしてください。
Visual Studioでのブラウザ操作は本当に楽です。導入が簡単で。
もちろんVB.netからもできるのでVB.netプログラマの方もご安心を。
以上、ご査収ください。