所以我正在做一些網絡API的自動化測試。我試圖看看是否可以使用System.Windows.Forms.WebBrowser類導航到頁面,輸入一些文本,然後按下按鈕,全部從控制檯。我決定使用維基百科進行我的測試,因爲在搜索欄中輸入文本並進行搜索與我正在嘗試做的事情幾乎完全相同。在C中的WebBrowser上鍊多個事件#
我使用this question的代碼開始。
我遇到的問題是,我不能將兩個操作鏈接在一起,1)導航到維基百科,2)在搜索框中輸入文本並打開。 它導航到維基百科好吧。我被告知嘗試使用狀態機,但我不太清楚應該看起來如何。實際上,當它第二次回到runBrowser方法時,br.Document.GetElementByID(「searchInput」)行將引發InvalidCastException。所以我沒有模糊的發生在那裏。我假設在創建一個新線程的時候創建一個新線程,但是當我殺死舊線程時,它似乎也會殺掉WebBrowser並拋出一個錯誤,提示「Disconnected Context」
這是我的代碼:
static WebBrowser br = new WebBrowser();
static void runBrowserThread()
{
var th = new Thread(() =>
{
br.DocumentCompleted += browser_DocumentCompleted;
if (state == 0)
{
br.Navigate(new Uri("http://en.wikipedia.org/wiki/Main_Page"));
state++;
}
else if (state == 1)
{
if (br.Document.GetElementById("searchInput") != null)
{
HtmlElement search = br.Document.GetElementById("searchInput");
search.SetAttribute("value", searchterm);
foreach (HtmlElement ele in search.Parent.Children)
{
if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go")
{
ele.InvokeMember("click");
break;
}
}
}
else
Console.WriteLine("Meep");
state++;
}
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// var br = sender as WebBrowser;
if (br.Url == e.Url)
{
Console.WriteLine("Natigated to {0}", e.Url);
}
HtmlElement search = br.Document.GetElementById("searchInput");
Console.WriteLine(search.InnerHtml);
Console.ReadLine();
// Application.ExitThread(); // Stops the thread
runBrowserThread();
return;
}
有關如何安排此代碼以使線程工具可以很好地發揮作用的任何想法都將非常感激。
請添加拋出異常的詳細信息。 – 2013-03-21 22:38:29