VBのコードでブラウザ画面を操作するためのコンポーネント。Visual Studioでテストプロジェクトを記述し、Webアプリを自動テスト。
powered by Insider.NET
WatiN(“what-in”と発音)は、Rubyで記述されたオープンソース・フレームワークである「Watir」をヒントにして作成されたという.NET用のライブラリで、Webアプリケーションをテストするためのものです。WatiNもまたオープンソースであり、WatiNのサイトから入手できます。
WatiNを利用すると、Webアプリケーションでユーザーが行う操作を、VBなどで記述したアプリケーションから疑似的に行うことができ、Webアプリケーションの動作テストの自動化が実現できます。今回はこのWatiNを使ったWebアプリケーションのテストについて紹介します。
■WatiNのインストール
WatiNは、本稿執筆時点で、安定版であるバージョン「1.3.0」と、次バージョンとなる「2.0 beta1」が公開されています。1.3.0で対応するWebブラウザはIEのみですが、2.0 beta1では、IEに加えて、Firefox、Chromeが利用できます。本稿では2.0 beta1を使用します。
動作環境の制限は特に見当たりませんが、2.0 beta1については、Visual Studio 2005および2008で利用できることを確認しています(1.3.0は、.NET Framework 1.1用と、.NET Framework 2.0用の2種類のバイナリが用意されています)。本稿では、Windows XP上のVisual Studio 2008(以下、VS 2008)を使用しています。
インストールに関しては、2.0 beta1はZIPファイルで提供されており、これを適当なフォルダに展開するだけで利用できます(1.3.0はMSI形式のインストーラで配布されています)。今回は1.3.0のインストーラの動作に従って、「C:\Program Files\WatiN」にZIPファイルを展開しました。「bin」フォルダに含まれる「WatiN.Core.dll」がWatiNのメインとなるライブラリです。
[注意]Windows Vista、Windows Server 2008を利用する場合
Windows Vistaもしくは、Windows Server 2008上でWatiNを使用してWebアプリケーションのテストを行う場合、サイトごとにIEの保護モードを無効にし、ユーザー・アカウント制御(UAC)もオフにしておく必要があります。
筆者のWindows Vista環境では、WatiNに含まれる特定のメソッドを実行すると、Windowsエラー・レポート(WER)サービスが実行されることが何度かありました(1.3.0、2.0beta1のいずれでも発生)。Windows XPでは特に問題はありませんでした。
まず、コンソール・アプリケーション・プロジェクトを作成して、IEを自動実行してみます。
■プロジェクトの作成と参照の追加
新規プロジェクトの作成で、[コンソール アプリケーション]を選択し、プロジェクトを新規作成したら、最初にWatiNの参照を追加します。これには、メニューから[プロジェクト]−[参照の追加]を選択し、[開く]ダイアログボックスの[参照]タブを選択します。そして先ほど展開したフォルダから、「WatiN.Core.dll」を選択して[OK]ボタンをクリックします。
■STAThread属性の指定
次に、自動生成されたソース・ファイルのMainメソッドにSTAThread属性(<STAThread()>)の記述を追加します。ドキュメントによると、WatiNがIEをCOM経由でコントロールする際に、スレッディング・モデルをSTA(single-thread apartment)にしておく必要があるためです。
スレッディング・モデルについてはここでは説明しませんが、コンソール・アプリケーションやWindowsフォーム・アプリケーションでWatiNを利用する場合は、STAThread属性の設定が必要になります。なお、後述のテスト・プロジェクトではSTAの指定は不要です(テストの実行自体がSTAで実行されるため)。
■既存のサイトにアクセスしてみる
IEをオープンしてURLを指定し、リンクをクリックするようなコードを記述してみます。
ここでは@ITのトップページから「Insider.NET」のリンクをクリックして、Insider.NETのトップページを表示します。さらにページのタイトルを取得してそれをコンソールに表示し、ページに含まれるすべてのリンク(<a>タグ)もコンソールに表示します。
Imports WatiN.Core
Module Module1
' スレッディング・モデルを指定する
<STAThread()> _
Sub Main()
Dim ie As New IE("http://www.atmarkit.co.jp")
' ページ左側のメニューから「Insider.NET」のリンクをクリック
ie.Link(Find.ByUrl( _
"http://www.atmarkit.co.jp/fdotnet/")).Click()
' Insider.NETのトップページの<title>タグの内容を取得
Dim title As String = ie.Title
Console.WriteLine(title)
' ページに含まれるリンク(<a>タグ)を表示
For Each a As Link In ie.Links
Console.WriteLine(a.Text+":"+a.Url)
Next
' IEを終了する
ie.Close()
End Sub
End Module
リストに示すように、最初にIEクラス(WatiN.Core名前空間)のオブジェクトを生成します。これにより、オブジェクトの生成と同時にIEが起動し、コンストラクタで指定したURLがアクセスされます。
次に、このページに含まれるInside.NETのページのリンク(<a>タグ)を(疑似的に)クリックします(ページの左側のメニュー部分)。特定のタグを取得するにはFindクラスを使用します。
Findクラスには、ページに含まれるタグを見つけるための多数の静的な検索メソッドが用意されています。例えばタグに付けられたid属性で検索したり(Find.ByIdメソッド)、name属性で検索したり(Finde.ByNameメソッド)といったことができます。
最後にCloseメソッドを呼び出しているので、ページのロードが完了すると、IEが自動的にクローズします。
■HTMLタグとWatiNのクラス
WatiNにはHTMLタグに対応した各種クラスが用意されており、おのおののHTMLタグに応じたアクションが実行できます。上記のコードでは、href属性に設定されているURLを手掛かりにLinkオブジェクトを見つけ出し、そのClickメソッドを実行しています。
また例えば、テキストボックス(<input>タグ)に文字列を入力したいなら、<input>タグに対応するTextFieldクラスのTypeTextメソッドを使うことで、テキストボックスに文字列を入力できます。
WatiNで用意されているHTMLタグに対応したクラスを次の表に示します。それぞれのクラスには、対応するコレクション・クラスが用意されており、上記のコードのようにIEオブジェクトからは、プロパティによりコレクション・オブジェクトを取得できます。
HTMLタグ | クラス | コレクション・クラス |
---|---|---|
<a /> | Link | LinkCollection |
<area /> | Area | AreaCollection |
<button /> | Button | ButtonCollection |
<div /> | Div | DivCollection |
<form /> | Form | FormCollection |
<frame /> | Frame | FrameCollection |
<frameset /> | - | FrameCollection |
<iframe /> | Frame | FrameCollection |
<img /> | Image | ImageCollection |
<input type=button/> | Button | ButtonCollection |
<input type=checkbox/> | CheckBox | CheckBoxCollection |
<input type=file/> | FileUpload | FileUploadCollection |
<input type=hidden/> | TextField | TextFieldCollection |
<input type=image/> | Button | ButtonCollection |
<input type=image/> | Image | ImageCollection |
<input type=password/> | TextField | TextFieldCollection |
<input type=radio/> | RadioButton | RadioButtonCollection |
<input type=reset/> | Button | ButtonCollection |
<input type=submit/> | Button | ButtonCollection |
<input type=text/> | TextField | TextFieldCollection |
<label /> | Label | LabelCollection |
<option /> | Option | OptionCollection |
<p /> | Para | ParaCollection |
<select /> | Select | SelectCollection |
<span /> | Span | SpanCollection |
<table /> | Table | TableCollection |
<tbody /> | TableBody | TableBodyCollection |
<td /> | TableCell | TableCellCollection |
<textarea /> | TextField | TextFieldCollection |
<tr /> | TableRow | TableRows |
一覧にないHTMLタグ | Element ElementsContainer |
ElementCollection |
HTMLタグとWatiNのクラス/コレクション・クラスの対応 |
これらのクラスでは、上述したように、LinkクラスやButtonクラスならClickメソッド、TextFieldクラスならTypeTextメソッド、という具合にそれぞれのコントロール操作に応じたメソッドが提供されています。これらを用いることで、ユーザーの操作をWatiNで再現できるわけです。
また上記のコンソール・アプリケーションでは、ページに含まれるリンクの一覧を画面に表示しましたが、これらのクラスを使ってページの内容を解析することも可能になります。
Copyright© Digital Advantage Corp. All Rights Reserved.