高東ソフトウェアサービス

最終更新日: 2010/04/17

メモ: IeUnit を使った Web アプリケーションのテスト (Internet Explorer 限定) (その2)

概要

メモ: IeUnit を使った Web アプリケーションのテスト (Internet Explorer 限定) の続きです。 画面をキャプチャする機能を作ってみました。
キャプチャ機能は Visual Studio 2008 で C# で作成し、COM 経由で公開して IeUnit 側から利用しています。

キャプチャ機能の作成

Visual Studio 2008 の新規プロジェクトで、[プロジェクトの種類] に「Visual C#」、[テンプレート] で「クラス ライブラリ」を選び、 [プロジェクト名] は「IeUnitTool」としました。

新規プロジェクトの作成

プロジェクトを作成したら、プロジェクトの [参照設定] で [参照の追加] を行い、[System.Drawing] と [System.Windows.Forms] を追加します。

参照の追加(System.Drawing) 参照の追加(System.Windows.Forms)

Class1.cs のソースを以下のように変更します。
※Guid("...") の部分は guidgen.exe を使って各自生成し、ソースを変更して下さい。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;

namespace IeUnitTool {

    // 公開用のインタフェース
    [
    ComVisible(true),
    Guid("ADA41754-500C-42a1-8BDE-A5A8C4C4939A"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)
    ]
    public interface IScreenCapture {
        [DispId(0x1)]
        void Save(string filepath);
    }

    // インタフェースの実装クラス
    [
    ComVisible(true),
    Guid("D4DD3E12-B938-47f4-AEF4-B7BBCD80BDDD"),
    ComSourceInterfaces(typeof(IScreenCapture)),
    ClassInterface(ClassInterfaceType.None)
    ]
    public class ScreenCapture : IScreenCapture {

        public void Save(string filepath) {

            // 画面をキャプチャする
            Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            using (Graphics g = Graphics.FromImage(bmp)) {
                g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bmp.Size);
            }

            // 保存するフォーマットと拡張子を決める
            ImageFormat imgformat = ImageFormat.Png;
            if (filepath.EndsWith(".bmp", StringComparison.CurrentCultureIgnoreCase)) {
                imgformat = ImageFormat.Bmp;
            } else {
                imgformat = ImageFormat.Png;
                if (!filepath.EndsWith(".png", StringComparison.CurrentCultureIgnoreCase)) {
                    filepath += ".png";
                }
            }

            // ファイルの保存先ディレクトリを作成する
            string dirname = Path.GetDirectoryName(filepath);
            if (0 < dirname.Length) {
                try {
                    Directory.CreateDirectory(dirname);
                } catch {
                }
            }

            // 保存する
            bmp.Save(filepath, imgformat);
        }
    }
}

ソースを変更したら、プロジェクトをビルドします。
ビルドが済んだら、アセンブリを COM 経由で利用できるよう regasm.exe (※1) を使って登録します。 コマンドプロンプトを開き、作成した IeUnitTool.dll が存在するディレクトリへ移動し、以下のコマンドを実行します。

regasm /codebase IeUnitTool.dll

※1 Visual Studio 2008 がインストールされた環境であれば、[Microsoft Visual Studio 2008] - [Visual Studio Tools] - [Visual Studio 2008 コマンド プロンプト] を開けば、 regasm.exe が利用できるよう、パスが設定されています(はず。。。)。
また、.NET Framework SDK がインストールされた環境であれば、「\WINDOWS\Microsoft.NET\Framework\」下の SDK のバージョン毎のディレクトリの下に配置されています(はず。。。)。
ちなみに、私の環境では Visual Studio 2008 がインストールされているにもかかわらず、[Visual Studio 2008 コマンド プロンプト] を開いただけでは regasm.exe へのパスが登録されておらず、利用できませんでした。
探し回った結果、「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727」下に regasm.exe を見つけたので、パスに追加してから使用しました。

regasm.exe に「/codebase」オプションを付けて登録した場合、レジストリには、登録したアセンブリのパスが「Codebase」の値として登録されます。 アセンブリが COM 経由でロードされる際には、この「Codebase」値の場所のアセンブリが使われるため、登録に使用した元のファイルを削除しないで下さい。

codebase オプション付きでのレジストリの情報
グローバルアセンブリキャッシュに登録して使う場合

もしも、どうしてもグローバルアセンブリキャッシュに登録して使いたい場合は、以下の手順を踏みます。
グローバルアセンブリキャッシュに登録する必要はありません。グローバルアセンブリキャッシュなるものに登録して使ってみたい!、という方だけ(私が試してみたかったのですが。。。)、ここの手順を行って下さい。

プロジェクトのプロパティを開き、[署名] の [アセンブリの署名] にチェックを入れ、[厳密な名前のキーファイルを選択してください] で 「新規作成」を選びます。

署名の設定

[厳密な名前キーの作成] で [キーファイル] に「IeUnitTool.snk」と入力し、[キーファイルをパスワードで保護する] のチェックは外し、 [OK] をクリックします。

キーの作成

設定後は、以下のようになります。

署名の設定(設定後)

設定後、プロジェクトを再ビルドし、再び regasm.exe を使い登録します (今度は /codebase オプションは付けません)。

regasm IeUnitTool.dll

次に、gacutil.exe (※1) を使ってアセンブリをグローバルアセンブリキャッシュに登録します。

gacutil /i IeUnitTool.dll

※1 Visual Studio 2008 がインストールされた環境であれば、[Microsoft Visual Studio 2008] - [Visual Studio Tools] - [Visual Studio 2008 コマンド プロンプト] を開けば、 gacutil.exe が利用できるよう、パスが設定されています(はず。。。)。

regasm.exe に「/codebase」オプションを付けずに登録した場合、レジストリには、「Codebase」値(としてアセンブリのパス)が登録されません。
そのため、アセンブリが COM 経由でロードされるには、グローバルアセンブリキャッシュに登録しておく必要があります。
逆に、アセンブリがグローバルアセンブリキャッシュに登録されていれば、登録に使用した元のファイルは削除しても構いません。
※グローバルアセンブリキャッシュに登録しなくても、アセンブリを利用するプログラムと同じ場所に配置しておくことでも、ロードされるようです。

codebase オプション無しでのレジストリの情報
IeUnit のテストケースから途中経過の画面をキャプチャする

テストケースは メモ: IeUnit を使った Web アプリケーションのテスト (Internet Explorer 限定) で使ったものを流用します。
まず、キャプチャを行うための関数を作成し、配置します。
以下の JavaScript のコードを「IeUnitTool.js」というファイル名で保存し、IeUnit のインストールディレクトリの「local」ディレクトリ下に配置します。
※ちなみにファイル名は、拡張子が「.jst」または「.js」であれば、何でも構いません。

// 画面をキャプチャして保存する
function CaptureScreen(filename) {
    var sc = new ActiveXObject("IeUnitTool.ScreenCapture");
    sc.Save(filename);
    sc = null;
}

次に前回使ったテストケース「Hoge1.jst」に画面をキャプチャするコードを追加します。
※CaptureScreen() 呼び出しを追加しました。

function Hoge1() {
    assimilate(this, new IeUnit());
    this.setUp = function() {
        _.openWindow("http://www.koutou-software.net/junk/mynote-ieunit-webapp-test/test.cgi");
    };
    this.tearDown = function() {
        _.closeWindow();
    };

    this.testCaseOne = function(){
CaptureScreen("Hoge1_1"); // 画面をキャプチャする
_.assertNotNull(_.findObjById("username"));
_.setField("username", "hoge");
_.assertNotNull(_.findObjById("password"));
_.setField("password", "hoge");
CaptureScreen("Hoge1_2");
_.assertNotNull(_.findButton("ログイン"));
_.clickButton("ログイン");
_.assertTagHasText("BODY",0,"ログイン成功");
CaptureScreen("Hoge1_3");
    };
}

変更したら、テストケースを実行します。テストケースの実行が終わると、workspace 下に途中経過の画面をキャプチャしたファイルが作成されます。

画面をキャプチャしたファイル
サンプルソースなど

作成したプロジェクト、スクリプト等

IeUnitSample.zip (9.71 KB)