Вопрос

Я экспериментирую с WatiN для тестирования пользовательского интерфейса, я могу заставить тесты работать, но не могу потом закрыть IE.

Я пытаюсь закрыть IE в коде очистки моего класса, используя пример WatiN. Метод IStaticInstanceHelper.

Кажется, проблема связана с потоком 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 Timeout, Boolean 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

Исправил это сам, сбросив mstest и вместо этого использовав mbunit.Я также обнаружил, что мне не нужно использовать какие-либо элементы IEStaticInstanceHelper, они просто работают.

Другие советы

Проблема в том, что когда 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();
}

Сайт Уотина кратко упоминает, что Уэтин не будет работать с нитями, а не в старе здесь Но это не очевидно, что [TestMethod]пробег в старе, в то время как способы, как [ClassCleanup] и [AssemblyCleanupAttribute] не.

По умолчанию, когда объект IE разрушен, они автотлозы браузера.

Ваш код очистки может попытаться найти браузер, который уже закрывается, который, почему у вас есть ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top