C# 嵌套浏览器与网页交互(Cefsharp,webkit,ie)

一 使用c#的WebBroswer控件

1   在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类可以com组件的形式供外包调用

   [ComVisible(true)]
    public partial class WebBrowserForm{
}

2 使用pubilc公开方法提供js调用

  public void xmpf(string name)
        {

            messageBox.Show(name);

        }

在类的构造函数里加载页面代码

(1)调用对象类是本身类

  public WebBrowserForm()
        {
            InitializeComponent();      
            string pathName = Application.StartupPath + "\\" + "test.html";
            this.webBrowser2.ObjectForScripting = this;
            webBrowser2.Navigate(pathName);
        }

(2)调用对象类是其他类

[System.Runtime.InteropServices.ComVisibleAttribute(true)]  
class myClass  
{  
   public void xmpf()  
   {  
        System.Windows.Forms.MessageBox.Show("alert:Test");  
   }  
}  

  public WebBrowserForm()
        { 
            this.webBrowser2.ObjectForScripting = new myClass(); 
        }

(3)使用将具体属性加入 Reflection 物件。直接把扩展js属性加入

     private void jsExtension(mshtml.HTMLDocument doc)
        {
            IExpando windowEx = (IExpando)doc.parentWindow;
            PropertyInfo MyExtension = windowEx.GetProperty("myExtension", BindingFlags.Default);
            if (MyExtension == null)
            {
                MyExtension = windowEx.AddProperty("myExtension");
                MyExtension.SetValue(windowEx, this, null);
            }
        }

4 使用js调用

  window.external.xmpf(obj.name,obj.value, obj.checked);

或者

window.top.myExtension.Submit();

总结: 1 使用[ComVisible(true)]标记类对com组件可见

           2  使用WebBrowser的ObjectForScripting类引用此类

在c#WebBroswer调用网页本身js

webBrowser1.Document.InvokeScript("jsAlert ", new string[] {‘ssss’}); 

在c#WebBroswer调用添加本身js 

IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
win.execScript(strScript, "Javascript")

2 在 WebKit(Cefsharp)使用

1暴露的.NET类为Javascript

public class BoundObject  
{  
    public void MyMethod()  {   }  
}  
//browser表示你的CefSharp对象使用它的RegisterJsObject来绑定你的.net类  
browser.RegisterJsObject("bound", new BoundObject());  
//在实际的JS代码中,你将使用这样的对象:
bound.myMethod(); // 使用此调用方法。
 

1.基本的同(异)步js操作

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

2.其他Frame操作

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);  
}  

3.如何调用Javascript方法返回的结果呢?
如果您需要评估代码,返回一个值,使用Task EvaluateScriptAsync(string script, TimeSpan? timeout)方法。 JavaScript代码是异步执行的,因此使用.NET Task类返回一个响应,其中包含错误消息,结果和一个成功(布尔)标志。

// Get Document Height  
var task = frame.EvaluateScriptAsync("(function() { var body = document.body, html = document.documentElement;
 return  Math.max( body.scrollHeight, body.offsetHeight,
 html.clientHeight, html.scrollHeight, html.offsetHeight ); })();", null);
task.ContinueWith(t =>  
{  
    if (!t.IsFaulted)  
    {  
        var response = t.Result;  
        EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;  
    }  
}, TaskScheduler.FromCurrentSynchronizationContext());  

总结:

1 保留.net类为js,把需要暴露的对象传入ChromiumWebBrowser类的RegisterJsObject方法即可。

2  使用异步,把字符串传入GetBrowser().MainFrame.ExecuteJavaScriptAsync()方法;

3 frame操作,GetFrameNames获取所有frame,获取单个GetFrame,ExecuteJavaScriptAsync()执行异步

4 获取结果 ,先用task接收EvaluateScriptAsync(str,null)返回结果,然后执行ContinueWith方法获取结果,传入t参数,Result就是返回值

可以在页面加载完之后执行所需方法绑定js

LoadingStateChanged页面加载完执行方法

 webBrowser.LoadingStateChanged += WebBrowser_LoadingStateChanged; 
    private void WebBrowser_LoadingStateChanged(object sender, CefSharp.LoadingStateChangedEventArgs e){
e.Browser.MainFrame.EvaluateScriptAsync(@"");
} 
 

1 把谷歌内核浏览器插件添加到当前控件集

            webBrowser = new ChromiumWebBrowser(url);
            webBrowser.Dock = DockStyle.Fill;//填充方式
            this.Controls.Add(webBrowser);

ie控件浏览器与网页交互(csExWB)

 

doucument操作

5 没有id,name,可以直接通过标签获取元素

  var bxtxtable = document.getElementById('query').getElementsByTagName('table')[1];
        var trs = bxtxtable.rows;
            var l = trs.length;
            if (l < 1) {
                return;
            }
            for (var i = 0; i < l; i++) {
                var tr = trs[i];
                var td = tr.cells[0] 
        
                }  
        } 

扩展:

SynchronizationContextTaskScheduler

这是一个同步上下文的taskscheduler,原理就是把繁重的耗时工作丢给ThreadPool,然后将更新UI的操作丢给 UI线程的队列中,由UIThread来执行

 

TWebBrowser 与 MSHTML(5): document 对象的属性、方法、事件纵览

{IHTMLDocument2 方法:}
write                 //写入
writeln               //写入并换行
open                  //打开一个流,以收集 document.write 或 document.writeln 的输出
close                 //关闭并输出用 document.open 方法打开的流
clear                 //清空文档中所有元素, 可能暂时不支持
queryCommandSupported //是否支持指定命令
queryCommandEnabled   //指定命令是否有效
queryCommandState     //是否设置了指定命令
queryCommandIndeterm  //指定命令是否处于不确定状态
queryCommandText      //命令
queryCommandValue     //命令值
execCommand           //执行命令
execCommandShowHelp   //命令帮助信息
createElement         //建立元素
elementFromPoint      //指定坐标下的元素
createStyleSheet      //创建一个样式表
 
{IHTMLDocument2 属性:}
all                   //所有 HTML 元素的集合
images                //所有 image 对象的集合
applets               //所有 applet 对象的集合
links                 //所有 link 对象的集合
forms                 //所有 form 对象的集合
anchors               //所有 anchor 对象的集合
scripts               //所有 script 对象的集合
frames                //所有 frame 对象的集合, 这应该和 window.frames 是一样的
embeds                //所有 embed 对象的集合
plugins               //所有 plugin 对象的集合
styleSheets           //样式表集合
title                 //网页标题
body                  //body 对象
activeElement         //当前具有输入焦点的元素
designMode            //设计模式, 可选值: Inherit On Off
selection             //当前选择
readyState            //页面读取状态: uninitialized、loading、loaded、interactive、completed
linkColor             //链接的颜色
alinkColor            //活动链接的颜色
vlinkColor            //已访问过的链接的颜色
bgColor               //背景颜色
fgColor               //文本颜色
referrer              //返回载入当前页面的页面的 URL
location              //同 window.location
lastModified          //返回文档最后修改的日期和时间
url                   //返回当前文档的 URL
domain                //返回域名
cookie                //返回文档相关的 cookie
expando               //可设置与获取的布尔值, 是否允许扩展
charset               //获取文档的字符集名称
defaultCharset        //获取浏览器默认的字符集名称
mimeType              //文档类型
fileSize              //文档大小, 单位字节, 用字符串表示
fileCreatedDate       //文档建立时间 ???
fileModifiedDate      //文档修改时间 ???
fileUpdatedDate       //文档更新时间 ???
security              //文档安全
protocol              //传输协议
nameProp              //文件标题, 好像同 Title
parentWindow          //父窗口
Script                //
 
{IHTMLDocument2 事件:}
onhelp                //用 F1 获取帮助时
onclick               //单击时
ondblclick            //双击时
onmousedown           //鼠标点下时
onmouseup             //鼠标抬起时
onmousemove           //鼠标移动时
onmouseover           //鼠标进入时
onmouseout            //鼠标离开时
onkeypress            //按键时
onkeyup               //键按住时
onkeydown             //键抬起时
onreadystatechange    //状态改变时
onrowexit             //当前数据源的数据将要发生变化时
onrowenter            //当前数据源的数据发生变化并且有新的数据时
ondragstart           //开始拖动时
onselectstart         //开始选择时
onbeforeupdate        //更新前
onafterupdate         //更新后
onerrorupdate         //更新错误时
 
 
{IHTMLDocument3 方法:}
recalc                //重新获取文档中的全部动态属性
releaseCapture        //释放文档中对象的鼠标捕捉
 
{IHTMLDocument3 属性:}
createTextNode        //建立文本
attachEvent           //绑定事件
detachEvent           //取消事件绑定
createDocumentFragment//创建新文档
getElementsByName     //返回带有指定 name 的对象集合
getElementById        //返回指定 id 的第一个对象的引用
getElementsByTagName  //返回指定标签的对象集合
documentElement       //获取文档根部节点, 也就是 HTML 节点
uniqueID              //获取对象的唯一标识符
dir                   //
parentDocument        //
enableDownload
baseUrl               //基础地址
 
{IHTMLDocument3 事件:}
onrowsdelete          //当前数据记录被删除时
onrowsinserted        //当前数据源将要插入新数据时
oncellchange          //当数据来源发生变化时
ondatasetchanged      //数据源发生变化时
ondataavailable       //当数据接收完成时
ondatasetcomplete     //当数据源的全部有效数据读取完毕时
onpropertychange      //改变属性时
oncontextmenu         //当按下鼠标右键出现菜单或通过键盘触发页面菜单时
onstop                //停止或离开时
 
 
{IHTMLDocument4 方法:}
focus                 //获得输入焦点
hasFocus              //是否拥有输入焦点
createDocumentFromUrl //下载指定网页并返回其 IHTMLDocument2 接口
CreateEventObject     //生成当使用 fireEvent 方法时用于传递事件相关信息的 event 对象 ???
FireEvent
 
{IHTMLDocument4 属性:}
createRenderStyle     //建立 IHTMLRenderStyle 接口
namespaces            //
media                 //
URLUnencoded          //获取去除字符编码的 URL
 
{IHTMLDocument4 事件:}
onselectionchange     //改变选择时
oncontrolselect       //好像是框选时
 
 
{IHTMLDocument5 方法:}
createAttribute       //建立指定 name 的属性
createComment         //建立注释
 
{IHTMLDocument5 属性:}
doctype               //文档类型
implementation_       //获取 IHTMLDOMImplementation 接口
compatMode            //兼容模式, 返回 BackCompat、CSS1Compat 等
 
{IHTMLDocument5 事件:}
onmousewheel          //旋转鼠标滚动轮时
onfocusin             //获取输入焦点时
onfocusout            //失去输入焦点时
onactivate            //激活时
ondeactivate          //当前对象变为父文档的其他对象时
onbeforeactivate      //onactivate 前
onbeforedeactivate    //ondeactivate 前

参考文献:

https://blog.csdn.net/u010085423/article/details/72765971 

https://www.cnblogs.com/huangxincheng/p/6781581.html

https://blog.csdn.net/wwm402654282/article/details/46344709

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CefSharp是一个使用C#编写的基于Google Chromium项目的开源项目,用于在.NET应用程序中集成浏览器功能。它提供了一个简单易用的方式来创建和定制一个功能强大的浏览器应用。 通过使用CefSharp,我们可以轻松地创建一个具备浏览器功能的自定义应用程序。可以将它集成到Windows桌面应用、ASP.NET网页、WPF应用等各种.NET项目中。 使用CefSharp制作浏览器有许多好处。首先,它可以为我们提供一个更强大的浏览器功能,包括支持HTML5、CSS3、JavaScript以及许多其他现代网络技术。这使得我们能够为用户提供一个与主流浏览器相似的体验。 其次,CefSharp具有强大的自定义能力。我们可以根据自己的需求进行修改和定制,包括更改浏览器外观、添加或删除功能等。这为我们提供了很大的灵活性,可以根据不同的项目需求进行个性化的定制。 此外,CefSharp提供了一系列的API和事件,使得我们能够与浏览器进行交互。我们可以通过代码控制浏览器的导航、加载特定的网页内容、执行JavaScript代码等。这让我们能够更好地控制和管理浏览器行为,实现更复杂的功能。 最后,CefSharp是一个活跃的开源项目,拥有一个庞大的社区支持。我们可以从社区中获取到许多有用的资源、文档和代码示例,以便更好地使用和了解CefSharp。 总之,使用CefSharp制作浏览器可以为我们提供强大的浏览器功能、灵活的定制能力、丰富的交互方式以及活跃的社区支持。这使得我们能够创建出功能丰富、用户友好的浏览器应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值