在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 脚本在新窗口中下载
按下按钮后在 MS Access 中导入 .DBF 文件,使用 VBA