CefSharp.WinForms.ChromiumWebBrowser wb
...
方式1. ExecuteScriptAsync 方法使用方式与 js 的 eval方法一样,异步执行,无返回值。
// xxx为js的方法名称
wb.ExecuteScriptAsync("xxx()")
// 为 js 的 变量jsVar赋值 'abc'
wb.ExecuteScriptAsync("jsVar='abc'")
方式2. EvaluateScriptAsync 方法使用方式与 js 的 eval方法一样,异步执行,有返回值。
Task<CefSharp.JavascriptResponse>t = wb.EvaluateScriptAsync("callTest2()")
// 等待js 方法执行完后,获取返回值
t.Wait()
// t.Result 是 CefSharp.JavascriptResponse 对象
// t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
if(t.Result.Result != null)
{
MessageBox.Show(t.Result.Result.ToString())
}
具体调用:IBrowser browser = this._browser.GetBrowser()
if (browser.HasDocument)
{
IFrame mainFrame = browser.MainFrame
var js = "var f= function A(){ return $('img',$('#"+id+"'))} f()"
var task = mainFrame.EvaluateScriptAsync(js, null)// "(function() { var body = document.body, html = document.documentElementreturn Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight )})()", null)
//执行脚本
//browser.MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid').click()")
//browser.MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid2').value='123'")
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{//返回结果
var response = t.Result
var result = response.Success ? (response.Result ?? "null") : response.Message
//html = result.ToString()
}
}, TaskScheduler.FromCurrentSynchronizationContext())
}
cefsharp新手慎用,用的是js代码,可以获取元素修改元素,但是使用js。
var frame = cb.GetMainFrame()var task = frame.EvaluateScriptAsync("(function() { return document.getElementsByTagName('input')[0].value })()", null)
这段代码你要充分利用py抓取到可靠信息,知道第一个input是什么,而且有value属性,不然就会报错。
frame.EvaluateScriptAsync()允许你写入js片段。
网页抓捕当中我觉得这个还是靠谱的,现在C#有很多,webbrowser、webkitbrowser、geckofx、webkitsharp......都是些噱头,一般的网页都无法搞定。
py的webdriver和android的webview同出一辙,跟webkit一样。
但是获取信息是不行的,比如我要抓取哪个元素值,你老老实实先把decument对象获取到,再抓。