Подтвердить что ты не робот

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

Любые идеи?

4b9b3361

Ответ 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.