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

问题描述 投票:1回答:1

我开始学习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;
    }
}

但是它不起作用。我调试了但是,当线程休眠时,页面加载也会休眠。结果,等待“加载完成事件”失败。请帮助我。

c# chromium cefsharp
1个回答
0
投票

您可以由代表来包装您的等待部分。像这样。

Invoke(new Action(async delegate ()
{
//waiting code
    int nretry = 100;
    while (nretry > 0){
//...
        Thread.Sleep(100);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.