web-dev-qa-db-fra.com

Attendez qu'une page se charge avec CefSharp

avant tout, je suis novice en C # et j'apprends Cefsharp + javascript au fur et à mesure, alors essayez de commenter toute solution que vous jugez nécessaire, cela m'évitera de poser des questions stupides.

J'essaie d'attendre la fin du chargement de la page avec Cefsharp pour exécuter mon code, j'ai essayé plusieurs solutions trouvées sur d'autres questions stackoverflow/github, mais non.

Je pensais que la solution était "NavStateChanged" mais je reçois une erreur C # de: "ChromiumWebBrowser ne contient pas de définition pour 'NavStateChanged'"

Quelqu'un pourrait-il me pointer dans la bonne direction ou me lancer un extrait de code? Je ne vous demande pas d'écrire le tout pour moi mais je suis vraiment perdu ici, j'apprends C #, Cefsharp & javascript tout à la fois et bien ... c'est écrasant.

C'est le code que j'ai trouvé en cherchant une solution en ligne, il correspond aussi à beaucoup de références github mais ne semble pas fonctionner: /

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
    }
9
Royals HF

Pour tous ceux qui se demandent la même chose que moi: oui ils sont dépassés, merci pour le lien amaitland!

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

Ceux-ci semblent être les trois états de chargement corrects qui m'intéressaient:

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');");
  }
};
7
Royals HF