我的团队有一堆WatiN测试套件,由我们的TeamCity服务器自动运行。我们最近将所有构建代理切换到64位,并且我还将我们的WatiN测试切换为在x64模式下使用NUnit。由于Interop对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)
...
我找到了一个related question,其中WatiN用户看到了相同的异常,但这是因为她正在尝试多线程。我们没有做任何这样的事情,事实上我们正在使用WatiN文档建议的正确的线程状态公寓。我在问题中注意到,虽然有人评论说这可能是因为x86与x64模式。
如何避免此错误导致我的测试经常失败?
如果仅仅是切换回32位模式,我可以处理,但我想确定没有更好的解决方案。感谢。
更新:
在使用64位NUnit运行程序离开作业大约5个以上的测试套件运行后,它们每次都失败,除了一次出现同样的错误。我们将它们切换回32位,并且自那以后已经成功运行了10次。我想现在的临时修复是使用32位NUnit跑步者,虽然我仍然在寻找这种情况发生的原因或者我们可以切换回x64的解决方案。
答案 0 :(得分: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当然并没有保修。