2017-02-01 108 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