2010-11-19 16 views
2

私はUIテストのためにWatiNを試していますが、動作するようにテストを受けることはできますが、後でIEを閉じることはできません。WatiNをIEに接続する際の問題

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

問題IEスレッド、時間外にアタッチしているようだ:

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

(。_ieHwndは、IEが最初に起動したときに保存されたIEのハンドルです)

これはエラーを与えます:

Class Cleanup method Class1.MyClassCleanup failed. Error Message: WatiN.Core.Exceptions.BrowserNotFoundException: Could not find an IE window matching constraint: Attribute 'hwnd' equals '1576084'. Search expired after '30' seconds.. Stack Trace: at WatiN.Core.Native.InternetExplorer.AttachToIeHelper.Find(Constraint findBy, Int32 timeout, Boolean 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; 
} 

答えて

0

mstestをダンプして代わりにmbunitを使用してこの問題を解決しました。また、IEStaticInstanceHelperのいずれかを使用する必要もなくなったことがわかりました。

+0

同じ問題が発生していますが、MSTestもMbUnitも使用していません。 これを解決した可能性のある環境が変更されましたか? –

+0

私は、テストがスレッディングを行う方法には、これはさまざまな設定について説明していると思います。 http://watin.sourceforge.net/apartmentstateinfo.html 私が設定したやり方は、FixtureSetUpを介してページのperformeアクションなどにナビゲートし、FixtureTearDownでブラウザを閉じました。 WatiNは他の設定ではうまくいきませんでした。 –

0

デフォルトでIEのオブジェクトが破壊されたとき、彼らはAUTOCLOSEブラウザ。

あなたのCleanUpコードは、既に閉じているブラウザを見つけようとするかもしれません。そのため、エラーが発生します。

+0

答えていただきありがとうございますが、残念ながら私の問題はブラウザが開いたままであることです。 –

1

MSTESTが[ClassCleanup]属性でメソッドを実行すると、STAの一部ではないスレッドでMSTESTが実行されるという問題があります。

あなたはそれが動作するはず次のコードを実行した場合:

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

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

をWatiNのウェブサイトが簡単にWatiNはSTA here内のスレッドでないと動作しないことに言及したが、それは[TestMethod]のrunことは明らかではありませんSTAでは[ClassCleanup][AssemblyCleanupAttribute]のようなメソッドはありません。

関連する問題