2

UI テストのために WatiN を試しています。テストを実行できますが、後で IE を閉じることができません。

WatiN のサンプルIEStaticInstanceHelper 手法を使用して、クラスのクリーンアップ コードで IE を閉じようとしています。

問題は IE スレッドに関連しているようで、タイムアウトします。

_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));

(_ieHwnd は、IE が最初に起動されたときに格納される IE へのハンドルです。)

これにより、次のエラーが発生します。

クラスのクリーンアップ メソッド Class1.MyClassCleanup が失敗しました。エラー メッセージ:WatiN.Core.Exceptions.BrowserNotFoundException: 制約に一致する IE ウィンドウが見つかりませんでした: 属性 'hwnd' は '1576084' に等しいです。検索は '30' 秒後に期限切れになりました.. スタック トレース: WatiN.Core.Native.InternetExplorer.AttachToIeHelper.Find (制約 findBy、Int32 タイムアウト、ブール値の waitForComplete) で

明らかな何かが欠けているに違いないと確信していますが、これについて何か考えがある人はいますか? ありがとう

完全を期すために、静的ヘルパーは次のようになります。

public class StaticBrowser
{
    private IE _instance;
    private int _ieThread;
    private string _ieHwnd;

    public IE Instance
    {
        get
        {
            var currentThreadId = GetCurrentThreadId();
            if (currentThreadId != _ieThread)
            {
                _instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
                _ieThread = currentThreadId;
            }
            return _instance;
        }
        set
        {
            _instance = value;
            _ieHwnd = _instance.hWnd.ToString();
            _ieThread = GetCurrentThreadId();
        }
    }

private int GetCurrentThreadId()
{
    return Thread.CurrentThread.GetHashCode();
}
    }

クリーンアップ コードは次のようになります。

private static StaticBrowser _staticBrowser;

[ClassCleanup]
public static void MyClassCleanup()
{
    _staticBrowser.Instance.Close();
    _staticBrowser = null;
}
4

3 に答える 3

1

問題は、MSTESTが属性を使用してメソッドを実行すると、 STA[ClassCleanup]の一部ではないスレッドで実行されることです。

次のコードを実行すると、機能するはずです。

[ClassCleanup]
public static void MyClassCleanup()
{
    var thread = new Thread(() =>
    {
        _staticBrowser.Instance.Close();
        _staticBrowser = null;
     });

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

WatiNのWebサイトでは、WatiNはここでSTAにないスレッドでは機能しないと簡単に述べていますが[TestMethod]、メソッドが好きで、そうでないときにSTAで実行されることは明らかでは[ClassCleanup]あり[AssemblyCleanupAttribute]ません。

于 2012-01-07T20:15:27.807 に答える
0

mstestをダンプし、代わりにmbunitを使用して、これを自分で修正しました。また、IEStaticInstanceHelperのものも使用する必要がなく、機能することもわかりました。

于 2010-11-23T14:33:11.610 に答える
0

デフォルトでは、IE オブジェクトが破棄されると、ブラウザが自動的に閉じます。

CleanUp コードは、ブラウザーが既に閉じていることを検出しようとする場合があり、これがエラーの原因です。

于 2010-11-19T21:20:51.383 に答える