Проблема с подключением WatiN к IE - PullRequest
2 голосов
/ 19 ноября 2010

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

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

Кажется, проблема в подключении к потоку 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 (Constraint 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;
}

Ответы [ 3 ]

1 голос
/ 08 января 2012

Проблема в том, что когда 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 здесь , но не очевидно, что [TestMethod] работает в STA, в то время как методы типа [ClassCleanup] [AssemblyCleanupAttribute] нет.

0 голосов
/ 23 ноября 2010

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

0 голосов
/ 20 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...