c# - 等待 CefSharp 中的 javascript 渲染页面加载
问题描述
我开始学习 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;
}
}
但它不起作用。我调试了它。但是当线程休眠时,页面加载也会休眠。结果,等待“加载完成事件”失败。请帮我。
解决方案
您可以通过委托包装您的等待部分。像这样。
Invoke(new Action(async delegate ()
{
//waiting code
int nretry = 100;
while (nretry > 0){
//...
Thread.Sleep(100);
}
}
推荐阅读
- python - 如何使用熊猫忽略具有特定值的文件
- graphql - 需要澄清 GraphQL 全局对象识别规范中描述的根查询类型上的“节点”字段
- c++ - 如何知道符号来自的确切文件
- node.js - 从带有附件的 Gmail 中读取邮件 - Node.js
- python - 有没有人尝试在 Apache Superset 中实现多租户
- c# - 使用 C# 处理 Microsoft Excel 电子表格部署问题
- javascript - 检查元素是否存在而无需添加暂停
- python - Pytorch:将两个高维张量 (2, 5, 3) * (2, 5) 乘以 (2, 5, 3)
- r - R purrr::partial -- 它如何处理部分化的参数?
- axios - axios 帖子上的 net::ERR_EMPTY_RESPONSE