簡體   English   中英

使用Watin的ASP.NET Web應用程序

[英]ASP.NET Web Application using Watin

我正在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。 這通常是一個壞主意。 本文介紹了使用Office進行此操作的含義,同樣的問題也適用於Internet Explorer。

就是說,要成功完成您要執行的操作,您需要在服務器端運行STA線程,然后在該線程中運行Watin代碼。 在您的ASP.NET Page_Load處理程序中放置[STAThread]不會自動做到這一點。

這是可以完成的方法,但是再次建議不要在服務器上這樣做

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM