Как в WebView2 дождаться окончания загрузки страницы?
От: Passerby  
Дата: 01.05.25 22:56
Оценка:
В Form использую WebView2, работает coreWebView2.Navigate(url)и Reload();
Но иногда страница не успевает загрузиться, как начинается ее обработка.
https://hatchjs.com/webview2-wait-for-page-to-load/ написано:
"Дождаться загрузки веб — страницы в Webview2 можно двумя способами:
***Использование метода `WebView2.WaitForLoadAsync`**
***Использование события `WebView2.NavigationCompleted`**"

Написал
await WebView2.WaitForLoadAsync("https://www.microsoft.com");

Ошибка: WebView2 не содержит определения WaitForLoadAsync.
await Microsoft.Web.WebView2.WinForms.WaitForLoadAsync("https://www.microsoft.com");

то же самое. Возможно отсутствует ссылка на сборку. Какую сборку?
Аналогично с попыткой использования события NavigationCompleted.
Может все работает только в WPF? Но почитал документацию, там сказано, что события должны работать и в Form.
В чем ошибка, как исправить?
Re: Как в WebView2 дождаться окончания загрузки страницы?
От: BlackEric http://black-eric.lj.ru
Дата: 03.05.25 15:53
Оценка: 1 (1)
Здравствуйте, Passerby, Вы писали:

Как дождаться окончания загрузки страницы в WebView2?

Если будет совсем плохо, то переделайте одну форму на WPF. Они нормально живут в WinForms приложении.
https://github.com/BlackEric001
Re[2]: Как в WebView2 дождаться окончания загрузки страницы?
От: Passerby  
Дата: 03.05.25 18:33
Оценка:
Здравствуйте, BlackEric, Вы писали:
BE>Если будет совсем плохо, то переделайте одну форму на WPF. Они нормально живут в WinForms приложении.

Какую форму WPF добавить в в WinForms приложение? Или имеется в виду сделать новый проект WPF и и в него добавить WebView2?
Re[3]: Как в WebView2 дождаться окончания загрузки страницы?
От: BlackEric http://black-eric.lj.ru
Дата: 04.05.25 08:15
Оценка: 1 (1)
Здравствуйте, Passerby, Вы писали:

P>Здравствуйте, BlackEric, Вы писали:

BE>>Если будет совсем плохо, то переделайте одну форму на WPF. Они нормально живут в WinForms приложении.

P>Какую форму WPF добавить в в WinForms приложение? Или имеется в виду сделать новый проект WPF и и в него добавить WebView2?


У вас же WebView2 отображается на какой-то форме? Можно взять ее не из WinFroms, а из WPF.
Или если так не получается, то можно сделать отдельное WPF приложение и работать с ним.
https://github.com/BlackEric001
Re[4]: Как в WebView2 дождаться окончания загрузки страницы?
От: Passerby  
Дата: 13.05.25 23:38
Оценка:
Здравствуйте, BlackEric, Вы писали:
BE>можно сделать отдельное WPF приложение и работать с ним.
Сделал WPF.
await Microsoft.Web.WebView2.Wpf.WebView2.WaitForLoadAsync("https://www.microsoft.com");
await webView.WaitForLoadAsync("https://www.microsoft.com");
В обоих случаях ошибка: нет такого метода.
Re[5]: Как в WebView2 дождаться окончания загрузки страницы?
От: BlackEric http://black-eric.lj.ru
Дата: 18.05.25 16:29
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>Здравствуйте, BlackEric, Вы писали:

BE>>можно сделать отдельное WPF приложение и работать с ним.
P>Сделал WPF.
P>await Microsoft.Web.WebView2.Wpf.WebView2.WaitForLoadAsync("https://www.microsoft.com");
P>await webView.WaitForLoadAsync("https://www.microsoft.com");
P>В обоих случаях ошибка: нет такого метода.

У WebView2 есть свойство webView21_NavigationCompleted. Можно подписаться на него.
Но я не уверен, что если на странице используются WebSocket (SignalR) оно будет всегда корректно отрабатывать. Так же могут быть проблемы, если html как-то генерится на самом клиенте через JavaScript.
Поэтому возможно имеет смысл сделать ручное ожидание проверяя наличие каких-либо html элементов на странице или же просто по таймеру. Здесь нужно подбирать решение под конкретную страницу.
Вот есть не плохой пример: WV2.VividBroker.Sample.Solution.
https://github.com/BlackEric001
Re[6]: Как в WebView2 дождаться окончания загрузки страницы?
От: Passerby  
Дата: 19.05.25 12:39
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>У WebView2 есть свойство webView21_NavigationCompleted. Можно подписаться на него.

Еще раз попробовал NavigationCompleted. Все ОК. В первом сообщении написал, что система пишет, что такого свойства нет, неверно его вызывал. Правильно:
webView.CoreWebView2.NavigationCompleted +=(sender, args) =>{}

Только сейчас непонятно, если загрузка страницы зависнет, этого события NavigationCompleted надо будет ждать вечность?
BE>Вот есть не плохой пример: WV2.VividBroker.Sample.Solution.
Спасибо. Посмотрю. А пока реализовал проверку на наполнение страницы. WPF работает хуже, чем Form. Парсю содержимое по ключевым словам и затем сначала отображаю строку в RichTextBox, а затем озвучиваю эту строку. В Forn все нормально. А в WPF сначала происходит озвучка. Поставил на метод атрибут [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)], ничего не изменилось. Поставил задержку:
richTextBox1.AppendText(Environment.NewLine + DateTime.Now + " " + text);
await Task.Delay(50);
speek.Speak(text);

Порядок. Но при меньших задержках иногда нарушается порядок инструкций.
И текст в RichTextBox в Form масштабируется при CTRL + колесико мыши, а в WPF нет.

Жаль, что нет асинхронности: хотел несколько контролов WebView2 поместить и запустить их асинхронно, оказывается, нельзя.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.