2

我正在尝试使用 WatiN 进行 UI 测试,我可以让测试正常工作,但之后我无法让 IE 关闭。

我正在尝试使用 WatiN 的示例IEStaticInstanceHelper 技术在我的班级清理代码中关闭 IE 。

问题似乎与 IE 线程有关,该线程超时:

_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));

(_ieHwnd 是 IE 首次启动时存储的 IE 句柄。)

这给出了错误:

类清理方法 Class1.MyClassCleanup 失败。错误消息:WatiN.Core.Exceptions.BrowserNotFoundException:找不到 IE 窗口匹配约束:属性“hwnd”等于“1576084”。搜索在“30”秒后过期。堆栈跟踪:在 WatiN.Core.Native.InternetExplorer.AttachToIeHelper.Find(约束 findBy,Int32 超时,布尔 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;
}
4

3 回答 3

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 不会在这里[TestMethod]与不在 STA 中的线程一起使用,但在方法喜欢[ClassCleanup][AssemblyCleanupAttribute]不喜欢的情况下,它在 STA 中运行并不明显。

于 2012-01-07T20:15:27.807 回答
0

默认情况下,当 IE 对象被销毁时,它们会自动关闭浏览器。

您的清理代码可能会尝试查找已经关闭的浏览器,这就是您出错的原因。

于 2010-11-19T21:20:51.383 回答
0

通过转储 mstest 并改用 mbunit 自己解决了这个问题。我还发现我也不需要使用任何 IEStaticInstanceHelper 的东西,它就可以了。

于 2010-11-23T14:33:11.610 回答