我正在 Visual Studio 2012 (C#) 中试验 Watin,但我似乎无法使任何东西正常工作。目前我在 aspx 页面中有两个文本框(txtbox1 和 txtbox2)。我试图让 Watin 自动将数字输入到这两个文本框中,然后单击“计算”按钮,这会将两个数字加在一起。我安装了 Watin 框架并添加了 Watin.Core dll 作为引用。 到目前为止,这是我的 .aspx 页面中的代码:
using WatiN.Core;
[STAThread]
protected void Page_Load(object sender, EventArgs e)
{
IE ie = new IE("http://localhost:5243/Addition.aspx");
ie.TextField(Find.ByName("txtbox1")).TypeText("1");
ie.TextField(Find.ByName("txtbox2")).TypeText("2");
ie.Button(Find.ByValue("Calculate")).Click();
}
我不断收到错误消息:“CurrentThread 需要将其 ApartmentState 设置为 ApartmentState.STA 才能使 Internet Explorer 自动化”。你知道什么会导致这个吗? 提前感谢您的帮助!
最佳答案
首先,您要尝试从服务器端 ASP.NET 代码自动化 Internet Explorer。 这通常是个坏主意。 This article描述了使用 Office 执行此操作的含义,同样的问题也适用于 Internet Explorer。
就是说,要成功完成您尝试做的事情,您需要在服务器端运行一个 STA 线程,并在该线程内运行您的 Watin 代码。将 [STAThread]
放在您的 ASP.NET Page_Load
处理程序上不会自动实现这一点。
这是如何完成的,但是同样,不推荐在服务器上这样做:
protected void Page_Load(object sender, EventArgs e)
{
RunOnStaThread<object>(() =>
{
IE ie = new IE("http://localhost:5243/Addition.aspx");
ie.TextField(Find.ByName("txtbox1")).TypeText("1");
ie.TextField(Find.ByName("txtbox2")).TypeText("2");
ie.Button(Find.ByValue("Calculate")).Click();
return null;
});
}
static T RunOnStaThread<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
var thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception ex)
{
tcs.SetException(ex);
}
});
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
try
{
return tcs.Task.Result;
}
finally
{
thread.Join();
}
}
关于c# - 使用 Watin 的 ASP.NET Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21589833/