使用AJAX屏幕抓取包含按钮的网页

ano*_*ery 9 c# ajax screen-scraping webbrowser-control

我正在尝试自动化我们的一些流程,一个包括登录外部网页,单击链接以展开详细信息,然后获取显示的所有详细信息.

我已经登录了该进程,并且可以在扩展后获取所有详细信息.

问题在于点击链接.链接定义如下(我删除了该Submit方法实际执行的操作,因为代码很长并且可能无关紧要.显然,img占位符就是一个例子):

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

我使用以下数据:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在运行时,expandDetails.InvokeMember("click"); browser_DocumentCompleted会按预期再次调用,但文档与之前相同,并expandDetails再次使用"已关闭"ID进行查找.这意味着我所寻找的细节从未显示过.

在AJAX脚本正确运行后如何访问文档?

添加Timer延迟检查文档似乎没有奏效.

ano*_*ery 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
    }
}
Run Code Online (Sandbox Code Playgroud)

所以运行while循环对我的情况很好.