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