Проблема с подключением WatiN к IE
-
26-09-2019 - |
Вопрос
Я экспериментирую с 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 разрушен, они автотлозы браузера.
Ваш код очистки может попытаться найти браузер, который уже закрывается, который, почему у вас есть ошибка.