WatiN: для CurrentThread необходимо установить для ApartmentState значение ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer. - PullRequest
25 голосов
/ 23 декабря 2009

Я звоню WatiN из службы C # Windows. Когда я вызываю WatiN, он выдает следующее исключение. Для CurrentThread необходимо установить для ApartmentState значение ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer

Я попытался запустить поток и установить состояние квартиры с помощью

mythread.SetApartmentState(ApartmentState.STA)

но это привело к другой ошибке

Невозможно оценить выражение, поскольку код оптимизирован или собственный кадр находится над стеком вызовов.

Я также попытался добавить атрибут в точку входа службы.

static class Program
{
      [STAThread]
      static void Main()
      {
          ...

Есть идеи?

Ответы [ 3 ]

18 голосов
/ 17 марта 2011

Я знаю, что Бенджамин уже опубликовал «рабочий» ответ, но я решил добавить пару вещей, которые я испытал, когда у меня возникла эта ошибка при попытке выполнить тесты WatiN: Для NUnit вы должны добавить что-то подобное в ваш app.config для тестов:

  <configSections>
    <sectionGroup name="NUnit">
      <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
    </sectionGroup>
  </configSections>
  <NUnit>
    <TestRunner>
      <!-- WatiN can only host IE in STA mode -->
      <add key="ApartmentState" value="STA"/>
    </TestRunner>
  </NUnit>

В MbUnit измените атрибут TestFixture следующим образом:

[TestFixture(ApartmentState = ApartmentState.STA)] 

НТН, Пит.

Ха - это на самом деле в документации. Doh! http://watin.org/documentation/sta-apartmentstate/

8 голосов
/ 23 декабря 2009

Это не ошибка, это просто диагностика отладчика. Он говорит вам, что не может дать вам отладочную информацию о том, что вы положили в окно просмотра. Это характерно для кода, скомпилированного в конфигурации Release, JIT-компилятор оптимизирует машинный код и обычно помещает локальные переменные в регистры CPU. Делая их значение недоступным для отладчика, он недостаточно умен, чтобы выяснить, какой регистр использовался. Это иногда случается и в выпуске Debug, когда в стеке вызовов есть неуправляемый код. Что не редкость для WebBrowser, есть очень большой кусок неуправляемого кода, который заставляет его работать.

FWIW, просто переключение состояния квартиры потока в STA недостаточно. Поток должен также прокачать цикл сообщений Windows, чтобы однопоточная квартира работала правильно. Если вы этого не сделаете, вы увидите, что операции с объектами STA, такими как WebBrowser, будут тупиковыми. Например, вы никогда не получите событие DocumentCompleted при переходе на сайт. Для запуска цикла сообщений требуется вызвать Application.Run () или Form.ShowDialog () в приложении WF.

3 голосов
/ 25 марта 2014

Атрибут, который я использовал, чтобы увидеть эту ошибку: [TestFixture, требует STA]

В соответствии с adrianbanks ответ на: Как запустить модульные тесты в режиме STAThread?

...