Internet explorer WatiN间歇性故障

Internet explorer WatiN间歇性故障,internet-explorer,testing,64-bit,watin,Internet Explorer,Testing,64 Bit,Watin,我的团队有一系列WatiN测试套件,由我们的TeamCity服务器自动运行。我们最近将所有构建代理都切换到64位,我还将WatiN测试切换到在x64模式下使用NUnit。由于对IE浏览器的互操作调用失败或其他原因,Watin总是给我们提供很少的测试失败,但这些总是非常罕见的。由于将所有内容都切换到64位,我们的任何测试套件几乎每次运行都会失败,但以下情况除外: Test(s) failed. System.InvalidCastException : Specified cast is not

我的团队有一系列WatiN测试套件,由我们的TeamCity服务器自动运行。我们最近将所有构建代理都切换到64位,我还将WatiN测试切换到在x64模式下使用NUnit。由于对IE浏览器的互操作调用失败或其他原因,Watin总是给我们提供很少的测试失败,但这些总是非常罕见的。由于将所有内容都切换到64位,我们的任何测试套件几乎每次运行都会失败,但以下情况除外:

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)
    ...
我发现一个WatiN用户看到了相同的异常,但这是因为她正在尝试多线程。我们没有做任何这样的事情,实际上我们使用的是WatiN文档中建议的正确的线程状态单元。我确实注意到有人评论说这可能是因为x86和x64模式

如何避免此错误导致测试经常失败

如果只是切换回32位模式的问题,我可以处理,但我想确定没有更好的解决方案。谢谢

更新:

在将作业保留为使用64位NUnit runner运行大约5次以上的测试套件后,它们每次都失败,只有一次出现相同的错误。我们将它们切换回32位,从那以后已经成功运行了10多次。我想现在的临时解决方案是使用32位NUnit runner,尽管我仍在寻找发生这种情况的原因或允许我们切换回x64的解决方案。

我在x64上使用Watin,这给我带来了一些麻烦。我最近查看了Watin的源代码,似乎PInvoke调用有缺陷(仅适用于32b系统)。如果执行某些方法,它们会覆盖内存的某些部分(因为32b是为64b结果保留的),从而产生奇怪的错误

这只是一个例子: WatiN-2.1.0.1196/source/src/Core/Native/Windows/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);
进行全面更改检查 当然,它需要重建Watin.Core dll,并且不提供任何保修