2013-03-08 71 views
0

後,我需要得到web瀏覽器的更新HTML它被用AJAX功能更新web瀏覽器的HTML阿賈克斯

例如更新後,我瀏覽到「Page1.asp的」,但「Page1.asp的」包括一個iframe從另一個頁面加載內容。它還有一個jQoery功能,在xx秒後顯示一個提交按鈕。

我的問題是如何從webBrowser獲取最新的html?

我嘗試更新,但沒有運氣,

webBrowser.Update(); 

回答

0

使用WebBrowser.DocumentText()

From MSDN

此屬性包含當前文檔的文本,即使另一個文件已請求。如果您設置此屬性的值,然後立即再次檢索它,則檢索到的值可能與WebBrowser控件沒有時間加載新內容的值集不同。您可以在DocumentCompleted事件處理程序中檢索新值。或者,您可以通過在循環中調用Thread.Sleep方法來阻止該線程,直到DocumentText屬性返回最初設置爲的值。

嘗試在DocumentCompleted()事件處理函數內運行調用DocumentText()。如果你不能這樣做,因爲iFrame不會拋出這個事件,只需設置一個計時器並每隔幾秒就檢索一次文本。

1

好吧,它有點棘手的問題,你需要按照以下準則正確地實現你的目標。

  1. 您需要在窗體上創建一個計時器。用勾號將其綁定並給出大約500毫秒的時間間隔。
  2. 寫這段代碼在timer_tick事件:

    如果(browser.ReadyState == WebBrowserReadyState.Complete)

  3. 一旦你找到了,然後完成了準備狀態您要查找的HTML元素,你認爲會在完成ajax請求後更新。

你可以做到這一點的方法來檢查任何元素:

 HtmlElementCollection forms = browser.Document.GetElementsByTagName("form"); 
     HtmlElement form = null; 
     foreach (HtmlElement el in forms) 
     { 
      string name = el.GetAttribute("name"); 
      if (name == "DATA") 
      { 
       form = el; 
       break; 
      } 
     } 

4)一旦你得到了你的元素你可能對你的工作開展。

更新:這裏是計時器滴答代碼,你可以按照你的需要擴展 確保您已設置您的Timer1.Inverval = 100(100毫秒)

private void Timer1_Tick(sender, args) 
    { 
     Application.DoEvents(); 

// make sure your are pulling right element id 
     HtmlElement cTag = webBrowser.Document.GetElementById("myelement");   

     if(cTag != null) // if elemnt is found than its fine. 
     { 
      cTag.SetAttribute("value", "Eugene"); 
      Timer1.Enabled = false; 
     } 
     else 
     { 
// dont worry, the ajax request is still in progress... just wait on it and move on for the next tick. 
     } 
     Application.DoEvents(); // you can call it at the end too. 
    } 
+0

,但這並沒有解決框架問題? documentText仍未填充? – EGN 2013-03-09 05:06:12

+1

不可能!您必須啓用計時器,並且在執行ajax瀏覽器仍然繁忙時查找瀏覽器狀態爲「完成」。您需要在計時器滴答聲內調用App.DoEvents()函數,以便獲得最新的Web瀏覽器聲明。多德。我寫了很多很多的刮板,我知道它的工作原理。 – KMX 2013-03-11 17:23:33

+0

讓我告訴你一件事,documentText永遠不會給你寫最近的內容。您必須手動查找元素,然後選擇其html,然後圍繞它完成工作。 – KMX 2013-03-11 17:24:41