2013-03-21 46 views
1

所以我正在做一些網絡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; 
} 

有關如何安排此代碼以使線程工具可以很好地發揮作用的任何想法都將非常感激。

+0

請添加拋出異常的詳細信息。 – 2013-03-21 22:38:29

回答

2

不,你正在做這個根本錯誤的。它炸彈是因爲你開始了一個新的線程,從來不這樣做。您應該檢查DocumentCompleted事件中的狀態。因此,大致爲:

var th = new Thread(() => 
    { 
     state = 0; 
     br.Navigate(new Uri("http://en.wikipedia.org/wiki/Main_Page")); 
     Application.Run(); 
    } 

而且

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    var br = sender as WebBrowser; 
    if (state == 0) { 
     // You are now on the main page, set the searchInput and submit click 
     //... 
     state = 1; 
    } 
    else if (state == 1) { 
     // You are now on the searched page, do whatever you need to do 
     //... 
     // And if you are done: 
     Application.ExitThread(); 
    } 
} 

如果你瀏覽的網頁添加額外的狀態。

+0

這是我嘗試的第一種方式,我一定會搞砸的。我會再試一次。謝謝一堆! – NathanTempelman 2013-03-22 12:34:39