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

问题描述 投票:0回答:1

我如何在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(); 
}
c# click element invoke
1个回答
0
投票

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 ;-)

© www.soinside.com 2019 - 2024. All rights reserved.