在 CefSharp 中等待 javascript-渲染页面加载

Waiting for javascript-rendered page loading in CefSharp

我开始学习 CefSharp。它是一种方便的网页抓取工具。但我有一个问题。 我想等待页面加载。但是页面加载是由ajax完成的。我正在等待一些 html 标签。 我是这样写的

public ChromiumWebBrowser brser;
Thread main_thread;
public Form1()
{
    brser = new ChromiumWebBrowser("some_url_here");
    panelBrowser.Controls.Add(brser);
    brser.Dock = DockStyle.Fill;
    main_thread = new Thread(mainStart);
    main_thread.Start();
}
private void mainStart()
{
    brser.LoadingStateChanged += LoadingStateChanged;
    brser.Load("other_url_here");
}
private async void LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
//... Omitted Code ...
    Context.LogInfo("[LOG]\t----");
    frame = brser.GetBrowser().GetFrame("iframe1");
    if(frame == null)
    {
        Context.LogInfo("[LOG]\tiframe1 is null. return");
        return;
    }
    int nretry = 100;
    try
    {
        while (nretry > 0)
        {
            html = await Task.Run(frame.GetSourceAsync);
            if (html.Contains("<ul class=\"some_class_to_be_loaded\">"))
            {
                break;
            }
            nretry--;
            Thread.Sleep(100);
        }
        if (nretry == 0)
        {
            MessageBox.Show("Connection Error");
            try
            {
                main_thread.Abort();
                return;
            }
            catch (Exception ex)
            {
                return;
            }
        }
    }
    catch
    {
        return;
    }
}

但是不行。我调试了它。但是当线程休眠时,页面加载也会休眠。结果等待'loading complete event'失败。请帮助我。

您可以通过委托包装等待的部分。 像这样。

Invoke(new Action(async delegate ()
{
//waiting code
    int nretry = 100;
    while (nretry > 0){
//...
        Thread.Sleep(100);
    }
}