使用环境: vs2010, 项目类型: Console Application 引用程序集:Watin.Core
测试代码:
1 //[STAThread]
2 static void Main(
string[] args)
3 {
4 // 实例化IE类,可以把实例化的ie看成是页面,以后的操作基本都是它打交道 5 6 IE ie =
new IE(
" http://www.baidu.com/ ");
7 8 // 找到搜索输入框,并输入“Watin” 9 10 ie.TextField(Find.ById(
" kw ")).TypeText(
" Watin ");
11 12 // 找到搜索按钮并点击 13 14 ie.Button(Find.ById(
" su ")).Click();
15 }
遇到问题:
编译代码不通过,错误提示:
Warning
1 The referenced assembly
" WatiN.Core " could not be resolved because it has a dependency on
" System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " which
is not
in the currently targeted framework
" .NETFramework,Version=v4.0,Profile=Client ". Please remove references to assemblies not
in the targeted framework or consider retargeting your project. ConsoleAppWatin
解决:
上面提示大概意思是:Watin.Core有个依赖不在当前的NetFramework中,经检查发现项目中使用的 Target framework 版本为:.NET Framework 4 Clinet Profile,改为 NET Framework 即可通过编译正常使用.
这里顺便说说 .NET Framework 4.0 和.NET Framework 4.0 Client Profile 区别:Net Framework 4.0毫无疑问就像是.Net Framework 2.0一样是.Net Framework 的 4.0版本;而.Net Framework 4.0 Client Profile是.Net Framework 3.5 sp1的子集,是.Net Framework 4.0 简化版,是面向客户端应用程序的(估计这也是为什么不能够使用IIS7 API的原因)。
启动项目,报出异常:
Unhandled Exception: System.Threading.ThreadStateException: The CurrentThread ne
eds to have it
' s ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.
at WatiN.Core.IE.CheckThreadApartmentStateIsSTA()
at WatiN.Core.IE.CreateNewIEAndGoToUri(Uri uri, IDialogHandler logonDialogHan
dler, Boolean createInNewProcess)
at WatiN.Core.IE..ctor(String url)
at ConsoleAppWatin.Program.Main(String[] args)
in D:\vs2010\ConsoleAppWatin\C
onsoleAppWatin\Program.cs:line
15 //IE ie = new IE("http://www.baidu.com/"); 15行的代码
解决办法:
在 Main方法上加属性:[STAThread]
[STAThread]是Single Thread Apartment单线程套间的意思,是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。单线程套间,简单来说所有对于单线程套间中对象的访问都是通过消息来传递的,所以同一时间只有一个线程能够访问单线程套间中的对象。