使用CefSharp等待页面加载

12

首先,我是一个C#的新手,并在学习Cefsharp + javascript的过程中逐步实践,因此请尝试评论您认为必要的任何解决方案,这将避免我提出愚蠢的问题。

我正在尝试使用Cefsharp等待页面完成加载后执行我的代码,我尝试了其他stackoverflow问题/ github上找到的几个解决方案,但没有用。

我认为解决方案是"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
    }

2
这些示例已经过时了。请阅读https://github.com/cefsharp/CefSharp/wiki/General-Usage#handlers - amaitland
3个回答

20

对于其他想知道与我相同问题的人:是的,它们已过时,感谢amaitland提供的链接!

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

这些似乎是与我相关的所有三种正确的加载状态:

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

2

i've used LoadingStateChanged function as below:

browser.LoadingStateChanged += Browser_LoadingStateChanged;

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

0
在某些情况下,我会等待特定元素出现,而不是等待浏览器完全加载。因此,如果您仍然想等待页面完全加载,可以尝试@Royals的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接