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 или что-то в этом роде.

Любые идеи?


person Garth    schedule 03.08.2009    source источник
comment
Я знаю, что это старо, но кто-нибудь еще испытывает подобные проблемы?   -  person Ian P    schedule 05.05.2010
comment
Не могли бы вы опубликовать репрезентативный образец функций Watin, которые вы вызываете, а также их частоту?   -  person Zian Choy    schedule 02.04.2011


Ответы (3)


У меня были проблемы с медленным закрытием IE (или никогда), но после следующих действий у меня не было проблем:

My setup:
*IE 9
*Windows 7
*Watin 2.1
*Visual Studio 10 SP1, using Microsoft.VisualStudio.TestTools.UnitTesting
  1. Вместо шаблона, подобного описанному в ссылках Mikecito, я использую версию BrowserStaticInstanceHelper, описанную Jeroen van Menen, героем Watin, здесь. Он предоставляет способ обнуления и привязки к определенному окну браузера.
  2. Преимуществом этой стратегии является запуск только одного 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 сколько угодно, пока выполняются тесты, и браузер всегда надежно закрывается.

person gregshap    schedule 28.02.2012
comment
Это единственный метод, который разрешил медленное закрытие для меня. - person Aidan Ryan; 20.10.2012

У меня была такая же прерывистая проблема с IE9. У моих коллег по обе стороны от меня таких проблем нет. Мы только что поняли, что моим браузером по умолчанию является IE, и я, как правило, открываю его с несколькими запущенными вкладками.

Я работал без открытого IE на рабочем столе, пока выполнялись мои тесты WatIn, и у меня не было проблем с тех пор, как я принял эту практику.

Возможно совпадение, а возможно и ответ?!

person MrBlueSky    schedule 03.11.2011

Что вам нужно сделать, так это перевести поток, в котором выполняется тест, в режим 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. В основном это означает, что иногда, когда погода неподходящая, вы можете получить эти странные задержки.

person ntcolonel    schedule 06.08.2013