2017-02-01 160 views
9

我試圖自動化我們的一些流程的按鈕的網頁,一個包括登錄到外部網頁,點擊一個鏈接,擴大細節,然後抓住顯示所有細節。屏幕抓取含有AJAX

我已經得到了處理登錄,並能抓住所有的細節一旦被擴大。

問題在於點擊鏈接。該鏈接被定義如下圖所示(我已刪除什麼Submit方法是確實的代碼很長,大概不相干顯然img是佔位符只是作爲一個例子。):

<a id="form:SummarySubView:closedToggleControl" onclick="A4J.AJAX.Submit(...); return false;" href="#"> 
    <img ... /> 
</a> 

下面我用這個數據:

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = (WebBrowser)sender; 

    HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl"); 
    //When open ID for element is "form:SummarySubView:openToggleControl" 

    if(expandDetails == null) //If already expanded 
    { 
     //Stuff 
    } 
    else 
    { 
     expandDetails.InvokeMember("click"); //Click on element to run AJAX 
    } 
} 

在運行expandDetails.InvokeMember("click");browser_DocumentCompleted被再次稱爲預期,但該文件是像以前一樣和expandDetails與「封閉」 ID再次發現。這意味着我所查找的細節從不顯示。

如何獲得訪問文檔後的AJAX腳本可以正常運行?

添加Timer推遲檢查文檔似乎並沒有工作過。

回答

6

所以一個非常簡單的解決方案似乎工作。我的代碼現在看起來像:

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = (WebBrowser)sender; 

    HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl"); 
    //When open ID for element is "form:SummarySubView:openToggleControl" 

    if(expandDetails == null) //If already expanded 
    { 
     //Stuff 
    } 
    else 
    { 
     expandDetails.InvokeMember("click"); //Click on element to run AJAX 

     while (expandDetails != null) 
     { 
      expandDetails = browser.Document.GetElementById("form:SummarySubView0:closedToggleControl"); 

      Application.DoEvents(); 
      System.Threading.Thread.Sleep(200); 
     } 

     //Stuff 
    } 
} 

所以運行while循環工作正常,我的情況。

+0

太棒了!我很高興你能把它工作。 –

1

好吧,首先,在document.complete事件將觸發對頁面中所有幀。因此,如果您有5個Iframe,您將獲得6個文檔完整事件。

所以,你需要檢查,看看是否你實際上是頂層窗口或沒有。 這樣做可以解決您的問題。

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser wb = sender as WebBrowser; 
     //check to make sure we are on the TOP-level page. 
     if (wb.Document.Window.Parent == null) 
     { 
      //do whatever else you need to here 
     } 
    } 

如果不這樣做,您可以使用計時器在文檔完成後等待幾秒鐘。

public partial class Form1 : Form 
{ 
    Timer t; 
    public Form1() 
    { 
     InitializeComponent(); 
     webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted; 
    } 
    private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser wb = sender as WebBrowser; 

     //check to make sure we are on the TOP-level page. 
     if (wb.Document.Window.Parent == null) 
     { 
      t = new Timer(); 
      t.Tick += (Timersender, eventargs) => 
      { 
       //do whatever else you need to here 
       t.Stop(); 
      }; 
      t.Interval = 2000; //wait 2 seconds for the document to complete 
      t.Start(); 
     } 
    } 
} 

您可以根據需要調整計時器的長度或更短。但是這應該讓你得到你需要的東西。

+0

因此,在應用AJAX函數之前文檔是完整的?我會給它一個去... – anothershrubery

+0

我不知道你正在查看什麼網站。他們可以以任何他們想要的方式編碼。但是,對於一個網站來說,它非常有可能在document.complete觸發後調用ajax方法,方法是掛載到javascript中的window.onload或jQuery中的$(document).ready中。我所說的是,至少你應該檢查正在觸發的document.complete事件是否來自頂層窗口。如果這樣做還不夠,你可以添加一個定時器來等待幾秒鐘,而其他Ajax完成。 –

+0

所以我添加了一個'Timer',它似乎不工作。無論我設置「定時器」多久,它仍顯示「預先點擊」文檔。 – anothershrubery