cefsharp ожидает загрузки страницы, winforms C#

Прежде всего, я новичок в C# и изучаю Cefsharp + javascript на ходу, поэтому, пожалуйста, попытайтесь прокомментировать любое решение, которое, по вашему мнению, необходимо, избавит меня от глупых вопросов.

Я пытаюсь дождаться завершения загрузки страницы с помощью Cefsharp для выполнения моего кода. Я попытался найти несколько решений, найденных в других вопросах / github stackru, но ничего не получилось...

Я думал, что решение было "NavStateChanged", но я получаю ошибку C#: "ChromiumWebBrowser не содержит определения для" NavStateChanged ""

Кто-нибудь может указать мне правильное направление или бросить мне фрагмент? Я не прошу вас написать все это для меня, но я действительно потерян здесь, я изучаю C#, Cefsharp и javascript все сразу и хорошо... это потрясающе.

Это код, который я нашел при поиске решения в Интернете, он также соответствует многим ссылкам на github, но, похоже, не работает:/

EventHandler<NavStateChangedEventArgs> handler = null;
        handler = (sender, args) = > {

            //TODO : show a loading gif until the page load completes

            //Wait for while page to finish loading not just the first frame
            if (!args.IsLoading)
            {
                chromeBrowser.NavStateChanged -= handler;

                MessageBox.Show("The page has completed loading", "Load completed", MessageBoxButtons.OK);
                //TODO : once load complete show the actual page
            }

3 ответа

Для всех, кто интересуется тем же, что и я: Да, они устарели, спасибо за ссылку amaitland!

https://github.com/cefsharp/CefSharp/wiki/General-Usage

Похоже, что это все 3 правильных состояния загрузки, которые были важны для меня:

browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();

public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
  // Wait for the underlying `Javascript Context` to be created, this is only called for the main frame.
  // If the page has no javascript, no context will be created.
  void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
  {
    const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";

    frame.ExecuteJavaScriptAsync(script);
  }
}

//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) =>
{
  //Wait for the Page to finish loading
  if (args.IsLoading == false)
  {
    browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
  }
}

//Wait for the MainFrame to finish loading
browser.FrameLoadEnd += (sender, args) =>
{
  //Wait for the MainFrame to finish loading
  if(args.Frame.IsMain)
  {
    args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");
  }
};

я использовал функцию LoadingStateChanged , как показано ниже:

      browser.LoadingStateChanged += Browser_LoadingStateChanged;

private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
    if (e.IsLoading == false)
     {
        //All Resources Have Loaded
     }
}

В некоторых случаях я буду ждать появления определенного элемента вместо ожидания полной загрузки браузера. Так что если вы все еще хотите дождаться полной загрузки страницы, попробуйте @Royals

Другие вопросы по тегам