Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wait for a page to load with CefSharp

first and foremost I am a novice at C# and learning Cefsharp + javascript as I go so please attempt to comment any solution you feel are necessary, will save me asking stupid questions.

I'm attempting to wait until the page has finished loading with Cefsharp to execute my code, I have tried several solutions found on other stackoverflow questions / github but no go.

I thought the solution was "NavStateChanged" but I'm getting a C# error of: "ChromiumWebBrowser does not contain a definition for 'NavStateChanged'"

Could anyone point me in the right direction or throw me a snippet ? I'm not asking you to write the entire thing for me but I'm genuinely lost here, im learning C#, Cefsharp & javascript all at once and well... its overwhelming.

This is the code I found while looking for a solution online, it also matches a lot of the github references but doesn't seem to work :/

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
    }
like image 972
James D Avatar asked Apr 18 '17 00:04

James D


People also ask

How do I use CefSharp chromium?

To add CefSharp, go to the Solution Explorer on the Top Right of Visual Studio, then right click on your app (under the solution) and select Manage NuGet Packages. When the search menu appears, type cefsharp , select the WinForms distributtion and install it. Follow the installation setup (accept therms and install).

What is CefSharp chromium?

CefSharp is an open source . NET wrapper around the fantastic Chromium Embedded Framework. And we provide full source code in C# and C++/CLI. You can use the code to hack, improve, fork or simply debug your applications better.

What is a CefSharp application?

What is a CefSharp? CefSharp is a way to embed the standard web browser into the . NET application. It is often found as a process along with software such as Razer Cortex and Razer Synapse.


1 Answers

For anyone else wondering the same thing I did: Yes they are outdated, thank you for the link amaitland!

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

These appear to be all 3 correct loading states which were relevant to me:

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');");
  }
};
like image 80
James D Avatar answered Sep 28 '22 02:09

James D