WatiN Dispose() очень медленный
Мои тесты WatiN неожиданно стали ДЕЙСТВИТЕЛЬНО медленными, когда я удаляю объект Internet Explorer.
Здесь моя настройка...
* Windows 7 (Evaluation Build 7100)
* Internet Explorer 8 (Version 8.0.7100.0)
* WatiN (Version 2.0.10.928)
Это странно, потому что тесты работали нормально неделю назад. Я думаю, что это последние обновления MS или что-то в этом роде.
Любые идеи?
Ответы
Ответ 1
У меня возникали проблемы с медленным (или никогда) закрытием IE, но после выполнения следующих вопросов у меня были проблемы с нулем:
My setup:
*IE 9
*Windows 7
*Watin 2.1
*Visual Studio 10 SP1, using Microsoft.VisualStudio.TestTools.UnitTesting
- Вместо шаблона, описанного в Mikecito's
ссылки, я использую версию BrowserStaticInstanceHelper, описанную
Jeroen van Menen, герой Watin, здесь. Это дает возможность
прикрепляться к определенному окну браузера.
- Использование этой стратегии имеет бонус только за запуск одного IE для нескольких методов тестирования и нескольких тестовых классов. И, когда все тесты завершатся, IE закрывается в течение 1 или 2 секунд.
Последняя проблема:
Поскольку у меня есть несколько TestMethods и TestClasses, я хотел бы поместить метод IE.Close() в метод AssemblyCleanup(). Из-за проблем с потоками MSTest мне тогда пришлось называть close() следующим образом:
[AssemblyCleanup()]
public static void CleanupAllTests()
{
var thread = new Thread(() =>
{
IE.Close();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
* Опять же, IE в этом фрагменте ссылается на свойство, которое будет проверять и присоединяться к моему экземпляру IE, используя стратегию из приведенной выше ссылки. Этот фрагмент, вероятно, не решит ваши проблемы без остальной части шаблона, с которым я связан.
Перед этой установкой IE иногда занимает около 30 секунд, теперь я могу открывать и закрывать другие окна IE, которые мне нужны во время тестирования, и браузер всегда надежно закрывается.
Ответ 2
У меня была такая же неустойчивая проблема с IE9. У моих коллег по обе стороны от меня нет таких же проблем. Мы только что поняли, что мой браузер по умолчанию - IE, и я имею тенденцию открывать его с несколькими вкладками.
Я работаю без открытия IE на рабочем столе, пока мои тесты WatIn работают, и у меня не было этой проблемы, так как я принял эту практику.
Возможно совпадение или, возможно, ответ?!
Ответ 3
Что вам нужно сделать, это установить поток, в котором выполняется тест в режиме STA, и IE закроется быстро.
[CodedUITest]
public class DoSomeAutomatedTesting
{
public DoSomeAutomatedTesting()
{
// Hey! Hey! Hey! We can't do no MTA!
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
[TestMethod]
public void MyTestMethod()
{
using(var ie = new IE())
{
ie.AutoClose = true;
ie.GoTo("http://www.google.com");
}
}
}
Для тех из вас, кто не является старым перцем, который программировал COM, это описывает STA http://msdn.microsoft.com/en-us/library/windows/desktop/ms680112(v=vs.85).aspx. Краткая история, STA - это методика старой школы, используемая COM для сохранения жизнеспособности существующего, проверенного, работающего, однопоточного кода, оставшегося от Windows 95 дней в страшном, новообретенном мире превентивной многопоточности.
Теперь CLR живет в том, что COM вызывает MTA. Для тех из нас, кто не живет в 1998 году, вы можете думать о MTA как о реальном мире, где все работает так, как должно. http://msdn.microsoft.com/en-us/library/windows/desktop/ms693421(v=vs.85).aspx
Когда какой-то поток в супер-страшной MTA хочет получить доступ к чему-то в STA, потоку MTA говорят, что он сидит на скамейке и ждет своей очереди, если STA в настоящее время обращается к другому потоку из MTA. Это в основном означает, что иногда, когда погода не правильная, вы можете получить эти wierd-o lags.