我正在尝试使用WatiN进行UI测试,我可以让测试工作,但之后我无法让IE关闭。
我正在尝试使用WatiN的示例IEStaticInstanceHelper technique在我的班级清理代码中关闭IE。
这个问题似乎附加在IE线程上,超时了:
_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
(_ ieHwnd是IE首次启动时存储的IE句柄。)
这给出了错误:
类清理方法 Class1.MyClassCleanup失败。错误 信息: WatiN.Core.Exceptions.BrowserNotFoundException: 找不到IE窗口匹配 约束:属性'hwnd'等于 '1576084'。搜索在“30”后过期 秒..堆栈跟踪:at WatiN.Core.Native.InternetExplorer.AttachToIeHelper.Find(约束 findBy,Int32 timeout,布尔值 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 :(得分:1)
问题在于,当MSTEST执行具有[ClassCleanup]
属性的方法时,它将在不属于STA的线程上运行。
如果您运行以下代码,它应该可以工作:
[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]
在STA中运行并不明显[ClassCleanup]
等方法}和[AssemblyCleanupAttribute]
没有。
答案 1 :(得分:0)
默认情况下,当IE对象被销毁时,它们会自动关闭浏览器。
您的CleanUp代码可能会尝试查找已关闭的浏览器,这就是您出错的原因。
答案 2 :(得分:0)
通过转储mstest并使用mbunit来解决这个问题。我还发现我不需要使用任何IEStaticInstanceHelper的东西,它只是起作用。