c# - 使用 Watin 的 ASP.NET Web 应用程序

标签 c# asp.net multithreading watin ui-automation

我正在 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/

相关文章:

c# - 调用 ToString() 时对结构进行装箱

asp.net - 雪碧图像CSS

Python:从 `threading.local` 中获取所有项目

mysql - 我如何修复 "Specified key was too long; max key length is 1000 bytes"

php - 单引号而不是双引号?

android - 如何使用处理程序线程进行多线程

Java并发-synchronized方法不起作用

c# - 启动进程时出现错误 C0000142

c# - Unity 使用 IENumerator 设置另一个对象将使用的类

c# - 这是 dotnet Regex-Parser 中的错误吗?