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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4 浏览器网络编程(共两周) 4.1 浏览器工作原理(老师讲解1学时,学生理解1学时) 浏览器工作原理如图4-1所示。 图4-1 浏览器工作原理 (1) 浏览器分析超链指向页面的 URL。 (2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。 (3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。 (4) 浏览器与服务器建立 TCP 连接 (5) 浏览器发出取文件命令: GET /chn/yxsz/index.htm。 (6) 服务器 给出响应,把文件 index.htm 发给浏览器。 (7) TCP 连接释放。 (8) 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本 4.2 浏览器功能结构(老师讲解1学时,学生理解1学时) 浏览器程序功能结构如图4-2所示。 图4-2 浏览器功能结构 1) 浏览器有一组客户、一组解释程序,以及管理这些客户和解释程序的控制程序。 2) 控制程序是其中的核心部件,它解释鼠标的点击和键盘的输入,并调用有关的组件来执行用户指定的操作。 3) 例如,当用户用鼠标点击一个超链的起点时,控制程序就调用一个客户从所需文档所在的远地服务器上取回该文档,并调用解释程序向用户显示该文档 4) HTML 解释程序是必不可少的,而其他的解释程序则是可选的。 5) 解释程序把 HTML 规格转换为适合用户显示硬件的命令来处理版面的细节。 6) 许多浏览器还包含 FTP 客户,用来获取文件传送服务。 7) 一些浏览器也包含电子邮件客户,使浏览器能够发送和接收电子邮件 8) 浏览器将它取回的每一个页面副本都放入本地磁盘的缓存中。 9) 当用户用鼠标点击某个选项时,浏览器首先检查磁盘的缓存。若缓存中保存了该项,浏览器就直接从缓存中得到该项副本而不必从网络获取,这样就明显地改善浏览器的运行特性。 10) 但缓存要占用磁盘大量的空间,而浏览器性能的改善只有在用户再次查看缓存中的页面时才有帮助。 11) 许多浏览器允许用户调整缓存策略。 4.3 浏览器设计(老师讲解2学时,学生设计2学时) (1)浏览器功能设计 浏览器功能设计主要确定设计好的浏览器需要具备哪些功能,以及这些功能是以什么方式进行实现,这个步骤相当于软件设计中的“需求分析”,其中必须保证基本功能的具备,即浏览器必须能够浏览Web页面。 (2)浏览器界面设计 浏览器界面设计主要确定浏览器的页面布局,设定浏览器窗口上设置哪些功能菜单项、设置哪些功能按钮、设置哪些状态栏,它们各自的位置如何、属性如何、对应的变量如何等等。 (3)浏览器代码设计 浏览器代码设计主要是确定对上述的设计的功能在代码上怎样实现,包括选用的程序语言和编程平台选择、程序代码的编写、程序代码的调试、程序功能的测试等等。 4.4 浏览器编程设计平台(老师讲解2学时,学生理解4学时) (1)VS2005编程平台 (2)WebBrowser类及其使用 (3)一些浏览器程序的代码分析 4.5 浏览器开发步骤(8天) (1)熟悉VS2005平台,建立项目(半天) 打开VS2005选择“创建项目”,进入“新建项目”对话框,如图4-1所示。 图4-1 “新建项目”对话框 在“新建项目”对话框的项目类型窗口中选中“Visual C#”作为项目开发语言,在模板窗口中选中“Windows 应用程序”作为项目开发模板,在“名称”、“位置”编辑框中输入自己设定的项目名字和项目存储位置,本讲义使用“CSharp浏览器”作为项目名称,如图4-2所示。 图4-2 输入新建项目的属性 完成输入内容后,单击“确定”按钮,进入项目VC#开发窗口“Form.cs[设计]”,如图4-3所示。 图4-3 VC#开发窗口“Form.cs[设计]” (2)界面设计(1天) ○1设计菜单栏如图4-4所示。(半天) 图4-4 设计菜单栏 设计“文件”菜单如4-5所示。 图4-5 设计“文件”菜单 设计“编辑”菜单如图4-6所示。 图4-6 设计“编辑”菜单 设计“查看”菜单如图4-7所示。 图4-7 设计“查看”菜单 设计“收藏”菜单如图4-8所示。 图4-8 设计“收藏”菜单 设计“工具”菜单如图4-9所示。 图4-9 设计“工具”菜单 ○2设计工具栏、用户区和状态栏如图4-10所示(半天) 图4-10 工具栏和状态栏 (3)功能代码编辑 ○1初始化代码(半天) 双击“Form”设计页面进入代码编写页面,如图4-11所示。 图4-11 代码编写页面 初始化页面代码如下: ////////////////////////////////////////////////////////

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值