关于cef的几个知识点(遇到了再补充)

执行JS(JavaScript)代码,无返回值

browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid').click();");  
browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid2').value='123'");  

在其它IFrame中执行JS(JavaScript)代码

string script = "if(document.getElementById('img_out_10000')){ document.getElementById('img_out_10000').click(); }";  
var list = browser.GetBrowser().GetFrameNames();  
if (list.Count > 1)  
{  
 browser.GetBrowser().GetFrame(list[1]).ExecuteJavaScriptAsync(script);  
}  

获取指定的Iframe的代码

this.browser.GetBrowser().GetFrame("tabs_portal_5_iframe").EvaluateScriptAsync("document.getElementById(\"block_3\").click()").Result;

获取包含JS方法的网页的返回值

复制代码
1 Task<CefSharp.JavascriptResponse> t = mychrome.GetBrowser().MainFrame.EvaluateScriptAsync("callTest2()");
2 // 等待js 方法执行完后,获取返回值
3 t.Wait();
4 // t.Result 是 CefSharp.JavascriptResponse 对象
5 // t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
6 if(t.Result.Result != null)
7 {
8    MessageBox.Show(t.Result.Result.ToString());
9 }
复制代码

执行单条document语句是获取不到返回值的,像下面的代码是获取不到返回值的

1 //这样是获取不到返回值的
2 Task<CefSharp.JavascriptResponse> t = chromeBrowser.GetBrowser().MainFrame.EvaluateScriptAsync("document.getElementsByClassName('ico-goldMedal url-ctrip')[0]");
3             t.Wait();
4             if (t.Result.Result != null)
5             {
6                 MessageBox.Show(t.Result.Result.ToString());
7             }

正确的方法是下面这样 (将单条JS语句放到一个function 内来执行,具体原理我还没有去查相关文档,暂时这样用吧,等闲了再来好好研究一下原因)

复制代码
 1 object EvaluateJavaScriptResult;
 2 var frame = chromeBrowser.GetMainFrame();
 3 var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByClassName('class名称')[0].innerHTML; })();", null);
 4  task.ContinueWith(t =>
 5  {
 6        if (!t.IsFaulted)
 7                 {
 8                     var response = t.Result;
 9                     EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
10                     MessageBox.Show(EvaluateJavaScriptResult.ToString());
11                 }
12             });
复制代码
posted @   boenotuch  阅读(333)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示