WatiN:CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer

Jon*_*han 25 c# service watin

我从C#windows服务调用WatiN.当我调用WatiN时,它会抛出以下异常.CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer

我尝试启动一个线程并通过设置公寓状态

mythread.SetApartmentState(ApartmentState.STA)
Run Code Online (Sandbox Code Playgroud)

但这导致了另一个错误

无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上.

我还尝试在Service入口点添加一个属性.

static class Program
{
      [STAThread]
      static void Main()
      {
          ...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Pet*_*gan 18

我知道Benjamin已经发布了一个"工作"的答案,但是当我尝试执行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>
Run Code Online (Sandbox Code Playgroud)

在MbUnit中,修改您的TestFixture属性,如下所示:

[TestFixture(ApartmentState = ApartmentState.STA)] 
Run Code Online (Sandbox Code Playgroud)

HTH,皮特.

哈 - 它实际上在文档中.卫生署! http://watin.org/documentation/sta-apartmentstate/

  • 当你想让IE中的WatiN在你的测试项目中工作时,这是最有用的答案.谢谢,皮特! (3认同)

Han*_*ant 8

这不是错误,它只是来自调试器的诊断.它告诉你它不能给你关于你在观察窗口放置的任何内容的调试信息.这与在Release配置中编译的代码相同,JIT编译器优化机器代码并且通常将局部变量放入CPU寄存器中.使调试器无法使用它们的值,它不够聪明,无法确定使用了哪个寄存器.当调用堆栈中存在非托管代码时,它偶尔也会出现在Debug版本中.对于WebBrowser而言,这种情况并不罕见,有一大块非托管代码可以使其工作.

FWIW,只是将线程的公寓状态切换到STA是不够的.该线程还必须泵送Windows消息循环,以使单线程单元正常运行.如果不这样做,您将看到对像WebBrowser这样的STA对象的操作将会死锁.例如,导航到站点时,您永远不会获得DocumentCompleted事件.运行消息循环需要在WF应用程序中调用Application.Run()或Form.ShowDialog().