Прежде чем начинать писать этот вопрос, я пытался решить следующие
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
Проблема заключалась в том, что если iframe существует на веб-странице, событие DocumentCompleted будет запускаться более одного раза (после завершения каждого документа). Очень вероятно, что программа попыталась бы прочитать данные из DOM, которые не были завершены и, естественно, потерпели неудачу.
Но неожиданно при написании этого вопроса "Что, если" монстр вдохновил меня, и я исправил проблему, которую я пытался решить. Поскольку я не смог выполнить Google, я подумал, что было бы неплохо опубликовать его здесь.
private int iframe_counter = 1; // needs to be 1, to pass DCF test
public bool isLazyMan = default(bool);
/// <summary>
/// LOCK to stop inspecting DOM before DCF
/// </summary>
public void waitPolice() {
while (isLazyMan) Application.DoEvents();
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
if(!e.TargetFrameName.Equals(""))
iframe_counter --;
isLazyMan = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if (!((WebBrowser)sender).Document.Url.Equals(e.Url))
iframe_counter++;
if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test
DocumentCompletedFully((WebBrowser)sender,e);
isLazyMan = false;
}
}
private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){
//code here
}
На данный момент, по крайней мере, мой 5-метровый хак, похоже, работает нормально.
Возможно, я действительно терпеть неудачу при запросе Google или MSDN, но я не могу найти: "Как использовать управление веб-браузером Событие DocumentCompleted в С#?"
Примечание: Узнав много о webcontrol, я обнаружил, что это материал FuNKY.
Даже если вы обнаружите, что документ завершен, в большинстве случаев он не останется таким навсегда. Обновление страницы может быть выполнено несколькими способами: обновление фреймов, ajax, например, запрос или передача на стороне сервера (вам нужно иметь некоторый элемент управления, который поддерживает асинхронную связь и имеет html или JavaScript-интерфейс). Кроме того, некоторые фреймы никогда не будут загружаться, поэтому не стоит долго ждать их.
В итоге я использовал:
if (e.Url != wb.Url)