将WatiN附加到IE的问题

时间:2010-11-19 17:02:19

标签: testing watin ui-testing

我正在尝试使用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;
}

3 个答案:

答案 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的东西,它只是起作用。