c# - 包含 AJAX 按钮的屏幕抓取网页

标签 c# ajax webbrowser-control screen-scraping

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

我已经登录了进程,展开后可以抓取所有详细信息。

问题在于单击链接。链接定义如下(我已经删除了 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 脚本正确运行后访问文档?

添加一个定时器来延迟检查文档似乎没有用。

最佳答案

所以一个非常简单的解决方案似乎奏效了。我的代码现在看起来像:

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 循环对我来说效果很好。

关于c# - 包含 AJAX 按钮的屏幕抓取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983037/

相关文章:

c# - 使用 DataGrid 时 ScrollViewer 性能下降

c# - 清除由 TagBuilder AddCssClass MVC4 添加的 CSS

c# - 从表达式创建动态 Linq select 子句

ajax - Vue.js 资源 : http request with api key (Asana)

c# - 如何在 webbrowser 控件中获取链接样式表的地址

c# - 比较 2 个整数时无法转换 lambda 表达式

javascript - 如何使用jquery计算一个文本框的值并将其设置到另一个文本框

javascript - jQuery 中变量的 riptscope

.net - 如何在 WinForms WebBrowser 控件中引用生成的 HTML 中的本地资源?

javascript - 脚本在 Web 浏览器控件中不起作用