Сбор элемента в таблице после вызова клика, используя c # в webBrowser - PullRequest
0 голосов
/ 02 сентября 2018

Как я собираю элемент в таблице после вызова события click с использованием C # в webBrowser.

Моя синтаксическая команда для вызова клика:

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

Они помещают результат в таблицу с идентификатором: 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();
        }

Я также пытался проверить элемент результата с помощью цикла, но это застряло в веб-браузере.

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

1 Ответ

0 голосов
/ 13 сентября 2018

Поток пользовательского интерфейса может быть перегружен количеством вызовов на

 Application.DoEvents(); 

, поскольку они происходят в цикле while, и нет времени помещать новый элемент в DOM, так как поток занят DoEvent(). Вы можете регулировать (замедлять) вызовы, используя

 window.setInterval()

или

 window.setTimeout()

Вы должны выполнить проверку в функции обратного вызова и указать количество времени, которое может быть довольно маленьким, но не равным 0.

Как только поток выходит из обратного вызова, у него есть время, чтобы заняться другими делами, например, снова позаботиться о dom.

С помощью window.setTimeout () вы можете выполнить проверку и запланировать следующий обратный вызов прямо из предыдущего.

Другой возможностью может быть использование

 Thread.Sleep()

но это может привести к нежелательным побочным эффектам.

Самым чистым и современным решением было бы использование Mutation Observer API , который получил большую поддержку браузеров.

Если вы не возражаете против использования фреймворков, я предлагаю jQuery, который имеет функции именно для того, что вам нужно, и использует Mutation Observer API, если он доступен, и несколько полифилов для браузерных загрузчиков, таких как IE; -)

...