Я использую компонент WebBrowser в System.Windows.Forms.Код загружает контент с веб-сайта и возвращает его правильно.Существует JavaScript, который выполняется и загружает некоторые DOM после полной загрузки страницы.
JavaScript не завершает загрузку к тому времени, когда метод .Navigate завершил выполнение.Если я установлю точку останова на .Navigate в режиме отладки, то, очевидно, потому что .Navigate является асинхронным, будет проходить процесс загрузки страницы, включая сценарии.
void LoadPageWithScripts() {
Browser.Navigate("mypagewithscriptsurl");
// whatever comes next prevents the DOM generated by the script from beeing loaded
// ... e.g.:
Console.WriteLine("whatever");
// use Browser.Document later
}
Я знаю, этот вопросаналогично приведенному здесь: JavaScript работает только ...
К сожалению, у меня нет влияния на загруженную страницу, поэтому подходы, которые я там видел, не подходят длямои потребности.
Я пытался просто работать с Thread.Sleep, как предлагали многие форумы.Но даже это не сработает.Как только код продолжает выполняться после метода .Navigate, JavaScript теряется.В настоящее время будет работать только установка точки останова.
Browser.Navigate ("pageUrl");
Browser.Navigate("pageurl");
// Very bad solution
Thread.Sleep(2000);
while (true)
{
if (Browser.ReadyState == WebBrowserReadyState.Complete)
{
// do something
break;
}
else
{
Application.DoEvents();
}
}
Использование события DocumentCompleted не будет работать, так как сценарий не загружается ранеедокумент в завершенном состоянии.
Browser.Navigate("pageUrl");
Browser.DocumentCompleted += (o, e) =>
{
var text = Browser.DocumentText;
Console.WriteLine(text);
};
Надеюсь найти помощь.