2011-11-03 103 views
1

我的團隊有一大堆由我們的TeamCity服務器自動運行的WatiN測試套件。我們最近將所有構建代理切換到64位,並且還將我們的WatiN測試切換爲在x64模式下使用NUnit。 Watin一直給我們很少的測試失敗,因爲Interop調用IE瀏覽器的失敗或其他原因,但這些一直都很少見。由於開關都爲64位,幾乎每一個我們的任何測試套件運行失敗,出現以下異常:WatiN間歇性故障

Test(s) failed. System.InvalidCastException : Specified cast is not valid. 
    at SHDocVw.IWebBrowser2.get_HWND() 
    at WatiN.Core.Native.InternetExplorer.IEBrowser.get_hWnd() 
    at WatiN.Core.DomContainer.StartDialogWatcher() 
    at WatiN.Core.IE.CreateNewIEAndGoToUri(Uri uri, IDialogHandler logonDialogHandler, Boolean createInNewProcess) 
    ... 

我發現了一個related question其中華廷用戶看到了同樣的異常,但正是因爲她試圖多-threading。我們沒有做這樣的事情,事實上我們正在使用WatiN文檔建議的正確的線程狀態公寓。儘管有人評論說這可能是因爲x86與x64模式,但我注意到了這個問題。

如何避免此錯誤導致我的測試頻繁失敗?

如果它只是切換回32位模式的問題,我可以處理,但我想知道沒有更好的解決方案。謝謝。

UPDATE:
離開工作崗位爲使用64位NUnit的亞軍約5+的測試套件運行後,他們每次都失敗,除了與此相同的錯誤一次。我們將它們切換回32位,並且自此以後已經有10次以上的成功運行。我想現在的臨時修復是使用一個32位的NUnit跑步者,儘管我仍然在尋找這種情況發生的原因,或者一個可以讓我們切換回到64位的解決方案。

回答

2

我在x64上使用Watin,它給我帶來了一些麻煩。我最近回顧了Watin的源代碼,看起來PInvoke調用存在缺陷(只能在32b系統上正常工作)。如果你執行某些方法,它們會覆蓋內存的某些部分(因爲32b被保留爲64b結果),從而造成奇怪的錯誤。

這只是一個例子之一: 華廷-2.1.0.1196 /源/ SRC /核心/本地/窗/ Win32.cs

public static extern Int32 SendMessageTimeout(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam, Int32 fuFlags, Int32 uTimeout, ref Int32 lpdwResult); 

VS正確

public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam, uint fuFlags, uint uTimeout, out IntPtr lResult); 

對於富於變化檢查http://pastebin.com/KaVpM6wT 它需要重建的Watin.Core DLL當然,並沒有保修。