2014-02-05 108 views
2

我正在使用Visual Studio 2012(C#)中的Watin進行試驗,但似乎無法獲得任何工作。目前,我在aspx頁面(txtbox1和txtbox2)中有兩個文本框。我試圖讓Watin自動將數字輸入到這兩個文本框中,然後單擊將兩個數字加在一起的「計算」按鈕。我安裝了Watin框架並添加了Watin.Core dll作爲參考。 這裏是我迄今爲止在我的.aspx頁面代碼:使用Watin的ASP.NET Web應用程序

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」 。你知道什麼會導致這種情況? 感謝您提前提供任何幫助!

回答

1

首先,您嘗試從服務器端ASP.NET代碼自動化Internet Explorer。 這通常是一個壞主意。This article描述了使用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(); 
    } 
} 
+0

謝謝您的答覆。如果你不應該在服務器端做到這一點,它應該在哪裏完成?在客戶端?再次感謝您的回答 – user3277259

+0

@ user3277259,如果不知道更多關於項目目標的信息,我無法回答。爲什麼你首先將它作爲一個ASP.NET應用程序來執行,而不是以WinForms應用程序或控制檯應用程序爲例? – Noseratio

+0

我正在做這個作爲一個Web應用程序。我的最終目標是將其發佈到服務器上供其他人通過網絡使用。 – user3277259