2011-06-12 21 views
12

我想用它來調用網頁上的一些JS腳本。我有這樣的:在控制檯應用程序中使用WebBrowser

static void Stuff() 
    { 
     WebBrowser browser = new WebBrowser(); 
     browser.Navigate("http://www.iana.org/domains/example/"); 
     HtmlDocument doc = browser.Document; 
     //doc.InvokeScript("someScript"); 
     Console.WriteLine(doc.ToString()); 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("hi"); 
     var t = new Thread(Stuff); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

問題1:我得到一個「對象引用未設置」異常,當我試圖讓doc.ToString()。爲什麼?

問題2:如何從HTML文檔獲取一些數據到主程序中? WebBrowser需要一個單獨的線程,這需要一個靜態方法,它不能返回任何值。如何將doc返回到Main(),以便我可以使用它做些什麼?

+0

靜態方法實際上可以返回一個值。這是線程不能。此外,線程*可以使用非靜態方法。 – icktoofay 2011-06-12 21:44:56

+0

爲什麼這是downvoted? – Amy 2011-06-12 22:39:01

回答

10

正確的想法,錯誤的執行。 WebBrowser.Navigate()僅告訴瀏覽器開始導航到您要求的網頁。這通常需要數百毫秒的時間。 Internet Explorer在內部啓動線程以完成工作。它會通過引發DocumentCompleted事件來告訴您何時完成它。你不要等待,所以這是首先崩潰的城市。

接下來的問題是DocumentCompleted事件不會在您的代碼中引發。您必須遵守STA合同,它需要您抽取消息循環。這是一種後臺線程,就像IE用來檢索網頁的後臺線程一樣,告訴你的線程完成了工作。

您需要的樣板代碼可在this answer中找到。

+0

你將如何去進行鏈接活動?您要導航到某個頁面,然後在文本框中輸入一些文本,然後單擊搜索,或者轉到。您是否需要將WebBrowser對象設爲全局,然後將4個方法鏈接在一起,導航,瀏覽完成的文檔,輸入文本並打開,entertextandhitgo的文檔完成事件? – NathanTempelman 2013-03-21 15:42:47

+1

狀態機是異步編程問題的簡單解決方案。只需跟蹤整數或枚舉的狀態。 – 2013-03-21 15:52:26

+1

只是一個側面提示:當試圖在沒有用戶交互的情況下自動化WebBrowser控件時,除非設置了'webBrowser.ScriptErrorsSuppressed = true' *,否則將會遇到彈出對話框的嚴重問題(儘管名稱會禁止所有對話框,而不僅僅是腳本錯誤)*。 [另見](http://stackoverflow.com/a/20612526/238419)。 – 2013-12-16 14:06:12