在webBrowser中使用c#调用单击后在表中收集元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在webBrowser中使用c#调用单击后在表中收集元素相关的知识,希望对你有一定的参考价值。

我如何在webBrowser中使用C#调用click事件后收集表中的元素。

我调用click的语法命令是:

webBrowser1.Document.GetElementById("addressSearchButton").InvokeMember("Click");

他们将结果放在具有ID:address-details的表中

在这里,片段化的html,在搜索之前点击:

<div id="search-result-outer" style="width: 100%">
<div id="search-result">
</div>

并在搜索后点击:

<div id="search-result-outer" style="width: 100%">

<div id="search-result">
        <div id="search-header">
            <h2>Search results</h2>
        </div>
        <div id="manage-addresses">
                <div id="address-details_wrapper" class="dataTables_wrapper" role="grid">
                    <div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix">...</div>
                    <table id="address-details" class="address-details dataTable" aria-describedby="address-details_info">...</table>
                    <div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix">...</div>                      
                </div>
            </div>
        </div>
</div>

问题是:如何等到结果出来,并开始收集结果元素?

调用点击后我无法直接获得结果,因为表尚未出现。

我试着等待使用ReadyState.Complete,但不是希望。

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }

我还尝试使用循环检查结果元素,但它使webBrowser卡住了。

while (webBrowser1.Document.GetElementById("address-details") == null)
{ 
Application.DoEvents(); 
}
答案

UI线程可能会被调用的数量所淹没

 Application.DoEvents(); 

因为它们发生在while循环中,并且没有时间将新元素放入DOM中,因为线程忙于DoEvent()。您可以使用其中任何一个来限制(减慢)调用

 window.setInterval()

要么

 window.setTimeout()

您可以检查回调函数并给出一个可以非常小但不是0的时间量。

一旦线程退出回调,就有时间做一些不同的事情,比如再次处理dom。

使用window.setTimeout(),您可以检查并安排从前一个回调的下一个回调。

另一种可能性是使用

 Thread.Sleep()

但这可能会导致不必要的副作用。

最干净,最现代的解决方案是使用Mutation Observer API,它获得了浏览器的更多支持。

如果你不介意使用框架,我建议使用jQuery,它具有你需要的功能,并使用Mutation Observer API(如果可用)和一些polyfill用于浏览器下载器,如IE ;-)

以上是关于在webBrowser中使用c#调用单击后在表中收集元素的主要内容,如果未能解决你的问题,请参考以下文章

C# WebBrowser 控件拦截从 PHP 脚本在新窗口中下载

使用AngularJS单击添加按钮时如何在表中插入新数据行

按下按钮后在 MS Access 中导入 .DBF 文件,使用 VBA

单击功能后在表格中切换复选框

正文 onload 事件执行后在 WinForms WebBrowser 中获取 HTML 正文内容

Jquery datatable 在从简单的 Web 服务调用 Web 方法时未在表中显示任何数据