[英]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.