当前位置:   article > 正文

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

c# 网页交互

一 使用c#的WebBroswer控件

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

  1. [ComVisible(true)]
  2. public partial class WebBrowserForm{
  3. }

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

  1. public void xmpf(string name)
  2. {
  3. messageBox.Show(name);
  4. }

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

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

  1.   public WebBrowserForm()
  2.         {
  3.             InitializeComponent();      
  4.             string pathName = Application.StartupPath + "\\" + "test.html";
  5.             this.webBrowser2.ObjectForScripting = this;
  6.             webBrowser2.Navigate(pathName);
  7.         }

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

  1. [System.Runtime.InteropServices.ComVisibleAttribute(true)]
  2. class myClass
  3. {
  4. public void xmpf()
  5. {
  6. System.Windows.Forms.MessageBox.Show("alert:Test");
  7. }
  8. }
  9.   public WebBrowserForm()
  10.         {
  11.             this.webBrowser2.ObjectForScripting = new myClass();
  12.         }

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

  1. private void jsExtension(mshtml.HTMLDocument doc)
  2. {
  3. IExpando windowEx = (IExpando)doc.parentWindow;
  4. PropertyInfo MyExtension = windowEx.GetProperty("myExtension", BindingFlags.Default);
  5. if (MyExtension == null)
  6. {
  7. MyExtension = windowEx.AddProperty("myExtension");
  8. MyExtension.SetValue(windowEx, this, null);
  9. }
  10. }

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 

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

2 在 WebKit(Cefsharp)使用

1暴露的.NET类为Javascript

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

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

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

2.其他Frame操作

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

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

  1. // Get Document Height
  2. var task = frame.EvaluateScriptAsync("(function() { var body = document.body, html = document.documentElement;
  3. return Math.max( body.scrollHeight, body.offsetHeight,
  4. html.clientHeight, html.scrollHeight, html.offsetHeight ); })();", null);
  5. task.ContinueWith(t =>
  6. {
  7. if (!t.IsFaulted)
  8. {
  9. var response = t.Result;
  10. EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
  11. }
  12. }, 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页面加载完执行方法

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

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

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

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

 

doucument操作

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

  1. var bxtxtable = document.getElementById('query').getElementsByTagName('table')[1];
  2. var trs = bxtxtable.rows;
  3. var l = trs.length;
  4. if (l < 1) {
  5. return;
  6. }
  7. for (var i = 0; i < l; i++) {
  8. var tr = trs[i];
  9. var td = tr.cells[0]
  10. }
  11. }

扩展:

SynchronizationContextTaskScheduler

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

 

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

  1. {IHTMLDocument2 方法:}
  2. write //写入
  3. writeln //写入并换行
  4. open //打开一个流,以收集 document.write 或 document.writeln 的输出
  5. close //关闭并输出用 document.open 方法打开的流
  6. clear //清空文档中所有元素, 可能暂时不支持
  7. queryCommandSupported //是否支持指定命令
  8. queryCommandEnabled //指定命令是否有效
  9. queryCommandState //是否设置了指定命令
  10. queryCommandIndeterm //指定命令是否处于不确定状态
  11. queryCommandText //命令
  12. queryCommandValue //命令值
  13. execCommand //执行命令
  14. execCommandShowHelp //命令帮助信息
  15. createElement //建立元素
  16. elementFromPoint //指定坐标下的元素
  17. createStyleSheet //创建一个样式表
  18. {IHTMLDocument2 属性:}
  19. all //所有 HTML 元素的集合
  20. images //所有 image 对象的集合
  21. applets //所有 applet 对象的集合
  22. links //所有 link 对象的集合
  23. forms //所有 form 对象的集合
  24. anchors //所有 anchor 对象的集合
  25. scripts //所有 script 对象的集合
  26. frames //所有 frame 对象的集合, 这应该和 window.frames 是一样的
  27. embeds //所有 embed 对象的集合
  28. plugins //所有 plugin 对象的集合
  29. styleSheets //样式表集合
  30. title //网页标题
  31. body //body 对象
  32. activeElement //当前具有输入焦点的元素
  33. designMode //设计模式, 可选值: Inherit On Off
  34. selection //当前选择
  35. readyState //页面读取状态: uninitialized、loading、loaded、interactive、completed
  36. linkColor //链接的颜色
  37. alinkColor //活动链接的颜色
  38. vlinkColor //已访问过的链接的颜色
  39. bgColor //背景颜色
  40. fgColor //文本颜色
  41. referrer //返回载入当前页面的页面的 URL
  42. location //同 window.location
  43. lastModified //返回文档最后修改的日期和时间
  44. url //返回当前文档的 URL
  45. domain //返回域名
  46. cookie //返回文档相关的 cookie
  47. expando //可设置与获取的布尔值, 是否允许扩展
  48. charset //获取文档的字符集名称
  49. defaultCharset //获取浏览器默认的字符集名称
  50. mimeType //文档类型
  51. fileSize //文档大小, 单位字节, 用字符串表示
  52. fileCreatedDate //文档建立时间 ???
  53. fileModifiedDate //文档修改时间 ???
  54. fileUpdatedDate //文档更新时间 ???
  55. security //文档安全
  56. protocol //传输协议
  57. nameProp //文件标题, 好像同 Title
  58. parentWindow //父窗口
  59. Script //
  60. {IHTMLDocument2 事件:}
  61. onhelp //用 F1 获取帮助时
  62. onclick //单击时
  63. ondblclick //双击时
  64. onmousedown //鼠标点下时
  65. onmouseup //鼠标抬起时
  66. onmousemove //鼠标移动时
  67. onmouseover //鼠标进入时
  68. onmouseout //鼠标离开时
  69. onkeypress //按键时
  70. onkeyup //键按住时
  71. onkeydown //键抬起时
  72. onreadystatechange //状态改变时
  73. onrowexit //当前数据源的数据将要发生变化时
  74. onrowenter //当前数据源的数据发生变化并且有新的数据时
  75. ondragstart //开始拖动时
  76. onselectstart //开始选择时
  77. onbeforeupdate //更新前
  78. onafterupdate //更新后
  79. onerrorupdate //更新错误时
  80. {IHTMLDocument3 方法:}
  81. recalc //重新获取文档中的全部动态属性
  82. releaseCapture //释放文档中对象的鼠标捕捉
  83. {IHTMLDocument3 属性:}
  84. createTextNode //建立文本
  85. attachEvent //绑定事件
  86. detachEvent //取消事件绑定
  87. createDocumentFragment//创建新文档
  88. getElementsByName //返回带有指定 name 的对象集合
  89. getElementById //返回指定 id 的第一个对象的引用
  90. getElementsByTagName //返回指定标签的对象集合
  91. documentElement //获取文档根部节点, 也就是 HTML 节点
  92. uniqueID //获取对象的唯一标识符
  93. dir //
  94. parentDocument //
  95. enableDownload
  96. baseUrl //基础地址
  97. {IHTMLDocument3 事件:}
  98. onrowsdelete //当前数据记录被删除时
  99. onrowsinserted //当前数据源将要插入新数据时
  100. oncellchange //当数据来源发生变化时
  101. ondatasetchanged //数据源发生变化时
  102. ondataavailable //当数据接收完成时
  103. ondatasetcomplete //当数据源的全部有效数据读取完毕时
  104. onpropertychange //改变属性时
  105. oncontextmenu //当按下鼠标右键出现菜单或通过键盘触发页面菜单时
  106. onstop //停止或离开时
  107. {IHTMLDocument4 方法:}
  108. focus //获得输入焦点
  109. hasFocus //是否拥有输入焦点
  110. createDocumentFromUrl //下载指定网页并返回其 IHTMLDocument2 接口
  111. CreateEventObject //生成当使用 fireEvent 方法时用于传递事件相关信息的 event 对象 ???
  112. FireEvent
  113. {IHTMLDocument4 属性:}
  114. createRenderStyle //建立 IHTMLRenderStyle 接口
  115. namespaces //
  116. media //
  117. URLUnencoded //获取去除字符编码的 URL
  118. {IHTMLDocument4 事件:}
  119. onselectionchange //改变选择时
  120. oncontrolselect //好像是框选时
  121. {IHTMLDocument5 方法:}
  122. createAttribute //建立指定 name 的属性
  123. createComment //建立注释
  124. {IHTMLDocument5 属性:}
  125. doctype //文档类型
  126. implementation_ //获取 IHTMLDOMImplementation 接口
  127. compatMode //兼容模式, 返回 BackCompat、CSS1Compat 等
  128. {IHTMLDocument5 事件:}
  129. onmousewheel //旋转鼠标滚动轮时
  130. onfocusin //获取输入焦点时
  131. onfocusout //失去输入焦点时
  132. onactivate //激活时
  133. ondeactivate //当前对象变为父文档的其他对象时
  134. onbeforeactivate //onactivate 前
  135. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/257768
推荐阅读
相关标签
  

闽ICP备14008679号