C#之WinForm WebBrowser实用技巧汇总

本文实例汇总了C#中WinForm WebBrowser常见的实用技巧,对于C#程序开发来说有不错的借鉴价值。分别叙述如下:

方法1:获取状态栏信息

void webBrowser1_StatusTextChanged(object sender, EventArgs e)
{
  label1.Text = webBrowser1.StatusText;
}

方法2:页面跳转后改变地址栏地址

//在Navigated事件处理函数中改变地址栏地址是最恰当的:
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
  textBox1.Text = webBrowser1.Url.ToString();
}

方法3:设置单选框

//建议使用执行单击事件的方式来设置单选框,而不是修改属性:
webBrowser1.Document.GetElementById("RBT_A").InvokeMember("click");

方法4:设置联动型下拉列表

//比较常见的联动型多级下拉列表就是省/市县选择了,这种情况下直接设置选择项的属性不会触发联动,需要在最后执行触发事件函数才能正常工作:

foreach (HtmlElement f in s.GetElementsByTagName("option"))
{
  if (f.InnerText == "北京")
  {
    f.SetAttribute("selected", "selected");
  }
  else
  {
    f.SetAttribute("selected", "");
  }
}
s.RaiseEvent("onchange");

方法5:在WinForm中响应Web事件

假设HTML源代码如下:

<html>
<body>
<input type="button" id="btnClose" value="关闭" />
</body>
</html>
HtmlDocument htmlDoc = webBrowser.Document;
HtmlElement btnElement = htmlDoc.All["btnClose"];
if (btnElement != null)
{
  btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);
}

很简单吧?那么稍稍高级一点的——我们都知道一个HTML元素可能有很多各种各样的事件,而HtmlElement这个类只给出最常用、共通的几个。那么,如何响应其他事件呢?这也很简单,只需要调用HtmlElement的AttachEventHandler就可以了:

btnElement.AttachEventHandler("onclick", new EventHandler(HtmlBtnClose_Click));

这一句等价于上面的btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);

对于其他事件,把"onclick"换成该事件的名字就可以了。例如:

formElement.AttachEventHandler("onsubmit", new EventHandler(HtmlForm_Submit));

方法6:模拟表单自动填写和提交

假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入框的id(或Name,下同)是username,密码输入框的id是password,“登录”按钮的id是submitbutton,那么我们只需要在webBrowser的DocumentCompleted事件中使用下面的代码即可:

HtmlElement btnSubmit = webBrowser.Document.All["submitbutton"];
HtmlElement tbUserid = webBrowser.Document.All["username"];
HtmlElement tbPasswd = webBrowser.Document.All["password"]; 

if (tbUserid == null || tbPasswd == null || btnSubmit == null)
  return; 

tbUserid.SetAttribute("value", "smalldust");
tbPasswd.SetAttribute("value", "12345678"); 

btnSubmit.InvokeMember("click");

关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:

HtmlElement formLogin = webBrowser.Document.Forms["loginForm"];
//……
formLogin.InvokeMember("submit");

本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这些验证代码就得不到执行,有可能会引起错误。

方法7:调用脚本

首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:

function DoAdd(a, b) {
  return a + b;
}

那么,我们要在WinForm调用它,只需如下代码即可:

object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 });
int sum = Convert.ToInt32(oSum);

其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTMLWindow2可以将任意的字符串作为脚本代码来执行。

string scriptline01 = @"function ShowPageInfo() {";
string scriptline02 = @"   var numLinks = document.links.length; ";
string scriptline03 = @"   var numForms = document.forms.length; ";
string scriptline04 = @"   var numImages = document.images.length; ";
string scriptline05 = @"   var numScripts = document.scripts.length; ";
string scriptline06 = @"   alert('网页的统计结果:\r\n链接数:' + numLinks + ";
string scriptline07 = @"    '\r\n表单数:' + numForms + ";
string scriptline08 = @"    '\r\n图像数:' + numImages + ";
string scriptline09 = @"    '\r\n脚本数:' + numScripts);}";
string scriptline10 = @"ShowPageInfo();";

string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
          scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;

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

最后:在脚本中调用WinForm里的代码,这个可能吗? 呵呵,当然是可能的。
下面的代码示例演示如何使用 ObjectForScripting 属性。在该示例中,ObjectForScripting 属性被设置为当前窗体。

using System;
using System.Windows.Forms;
using System.Security.Permissions;

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Form1 : Form
{
  private WebBrowser webBrowser1 = new WebBrowser();
  private Button button1 = new Button();

  [STAThread]
  public static void Main()
  {
    Application.EnableVisualStyles();
    Application.Run(new Form1());
  }

  public Form1()
  {
    button1.Text = "call script code from client code";
    button1.Dock = DockStyle.Top;
    button1.Click += new EventHandler(button1_Click);
    webBrowser1.Dock = DockStyle.Fill;
    Controls.Add(webBrowser1);
    Controls.Add(button1);
    Load += new EventHandler(Form1_Load);
  }

  private void Form1_Load(object sender, EventArgs e)
  {
    webBrowser1.AllowWebBrowserDrop = false;
    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    webBrowser1.WebBrowserShortcutsEnabled = false;
    webBrowser1.ObjectForScripting = this;
    // Uncomment the following line when you are finished debugging.
    //webBrowser1.ScriptErrorsSuppressed = true;

    webBrowser1.DocumentText =
      "<html><head><script>" +
      "function test(message) { alert(message); }" +
      "</script></head><body><button " +
      "onclick=\"window.external.Test('called from script code')\">" +
      "call client code from script code</button>" +
      "</body></html>";
  }

  public void Test(String message)
  {
    MessageBox.Show(message, "client code");
  }

  private void button1_Click(object sender, EventArgs e)
  {
    webBrowser1.Document.InvokeScript("test",
      new String[] { "called from client code" });
  }

}
//该代码实例源于:MSDN

相信本文所述实例对大家的C#程序设计有一定的借鉴价值。

(0)

相关推荐

  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法

    解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法 :使用WebBrowser的ProgressChanged事件,在时间中判断((WebBrowser)sender).ReadyState == WebBrowserReadyState.Complete是否成立,若成立则执行DocumentCompleted的处理. 复制代码 代码如下: void WebBrowser_ProgressChangedForSomething(object sender, W

  • 使用C#处理WebBrowser控件在不同域名中的跨域问题

    我们在做web测试时,经常会使用WebBrowser来进行一些自动化的任务.而有些网页上面会用IFrame去嵌套别的页面,这些页面可能不是在相同域名下的,这时就会出现跨域问题,无法直接在WebBrowser中获取到IFrame中的元素.下面来做个试验,自己写个页面嵌套一个百度的首页,然后在我们自己的页面上输入要查询的词,最后在百度上自动完成搜索. 复制代码 代码如下: <!DOCTYPE html> <html lang="en" xmlns="http:/

  • webBrowser代理设置c#代码

    为webBrowser设置代理: 复制代码 代码如下: public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntPtr proxyBypass; }; [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPt

  • 浅析c#中WebBrowser控件的使用方法

    首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第一步只要在form_load中输入 复制代码 代码如下: webBrowser1.Navigate(Application.StartupPath + " /map.html");//引号中为网页代码存放地址,注意要用相对地址不用绝对地址,这样才有可移植性,把网页放到程序的debug目录下

  • C#的WebBrowser操作frame实例解析

    本文实例讲述了用WebBrowser操作frame和iframe的方法,比较适合C#初学者参考学习.示例浅显易懂,具体方法如下:   1.获取frame的源文件 MessageBox.Show(webBrowser1.Document.Window.Frames["main"].Document.Body.InnerHtml); 2.获取frame的HTMLDocument接口 HTMLDocument doc = (HTMLDocument)webBrowser1.Document.

  • 在C#中 webbrowser的使用心得

    1.首先是屏蔽浏览器右键菜单的问题,用以下代码可以让浏览器用自己的右键菜单:tempBrowser.ContextMenuStrip = this.contextMenuStrip1;tempBrowser.IsWebBrowserContextMenuEnabled = false; 但是很不幸,上面的代码在有的机器上不起作用,开始以为是环境或者流氓插件的问题,折磨了很久无果,后来把.net升级到4.0竟然解决了这个问题,估计就是微软webbrowser控件的问题 2.屏蔽拷贝快捷键和截屏快捷

  • 使用C# 的webBrowser写模拟器时的javascript脚本调用问题

    感觉很久不写模拟器代码了,昨天调试的时候碰了点壁,记录下来,避免大家再跟我犯同样的错误. 加入Javascript脚本的地方: HtmlElement jsElement = webBrowser1.Document.CreateElement("script"); jsElement.SetAttribute("type", "text/javascript"); jsElement.SetAttribute("text",

  • c# 在WebBrowser中用SendMessage模拟鼠标点击

    复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace BrowserMouseClick { public

  • C#的WebBrowser的操作与注意事项介绍

    1.在Winform里使用WebBrowser,要对Form1.cs添加一些东西:    1.1 在"public partial class Form1 : Form"上方,添加: 复制代码 代码如下: [PermissionSet(SecurityAction.Demand, Name = "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)] 1.2 在Form1的Show

  • C#之WinForm WebBrowser实用技巧汇总

    本文实例汇总了C#中WinForm WebBrowser常见的实用技巧,对于C#程序开发来说有不错的借鉴价值.分别叙述如下: 方法1:获取状态栏信息 void webBrowser1_StatusTextChanged(object sender, EventArgs e) { label1.Text = webBrowser1.StatusText; } 方法2:页面跳转后改变地址栏地址 //在Navigated事件处理函数中改变地址栏地址是最恰当的: private void webBrow

  • Vue项目中常用的实用技巧汇总

    目录 前言 1. 使用 $attrs 和 $listeners 进行多层级的数据和事件传递 2. 实现数据的双向绑定,方便维护数据 使用 .sync 实现 Prop 的"双向绑定" 使用 model 选项 3. 使用 Mixins 4. 使用动态组件去懒加载组件 5. 在组件作用域内的 CSS 中使用 ::v-deep  修改组件样式 6. 使用装饰器优化代码 7. 利用 require.context 去获取项目目录信息 总结 引用 前言 在 Vue 项目开发中,很容易产生一些问题,

  • WinForm中的几个实用技巧汇总

    本文汇总了几个WinForm中常见的实用技巧,对于C#程序开发有着很好的参考借鉴价值.具体分析如下: 一.屏蔽窗体右上角关闭按钮 1.重写OnClosing protected override void OnClosing(CancelEventArgs e) { if(this.Visible) { e.Cancel=true; // // WHATE TODO // } } 2.重写WndProc protected override void WndProc(ref Message m)

  • Git 的基本操作、开发流程、实用技巧总结(陈彦贝)

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂,就不围绕这块展开了,有兴趣的可以去了解下. 开门见山,我们直接来说说 Git 有哪些常见的操作. Git 有哪些常规操作? 我们简单说说Git有哪些常规操作,能够让我们应付简单的开发需求. 克隆代码 ✦ 克隆远端代码 git clone http://git.code.oa.com/QCFE/sql

  • JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)

    本文实例讲述了JS实用技巧.分享给大家供大家参考,具体如下: js屏蔽错误 把下面的代码放在JS脚本中 <script type="text/javascript"> window.onerror = function(){ alert("出现脚本错误"); return true; } alert(b); </script> 注意:定义onerror事件应该在出错之前,否则任然会出现脚本错误 如何防止设置DIV出现滚动条? style=&q

  • 软件测试业务梳理的实用技巧

    目录 测试业务梳理 一.为什么要梳理业务? 二.梳理框架 1. 测试场景 2. 业务 3. 系统 4. 数据 5. 安全 6. 性能 7. 数据分析 8. 监控报警 9. 应急预案 测试业务梳理 在日常的测试工作中,不知道大家是否会有梳理自己测试业务的习惯.我个人觉得这个事情是值得做的,最好还可以培养成一个习惯. 一.为什么要梳理业务? 因为在业务测试中,作为测试人员,熟悉负责的业务是非常重要的,而通过阶段性的梳理总结,可以让你的业务知识系统化的沉淀下来. 当被问起这个业务系统的测试重点在哪里?

  • 提高JavaScript执行效率的23个实用技巧

    本文向大家分享23种JavaScript提高执行效率的小技巧.最佳实践等非常实用的内容.当然JavaScript的实用技巧不止这些,还有很多即好玩又能提高程序运行效率的技巧,以后我们会继续分享给大家. 文中所提供的代码片段都已经过最新版的Chrome 30测试,该浏览器使用V8 JavaScript引擎(V8 3.20.17.15). 1.使用逻辑符号&&或者||进行条件判断 var foo = 10; foo == 10 && doSomething(); // 如果 f

  • 全面介绍javascript实用技巧及单竖杠

    JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新手开发者被各种强大的 JavaScript 框架吸引进来,但他们却忽略了框架身后浩如星海的 JavaScript 实用技巧.本文将为你全面的介绍其中的知识点. 一.js整数的操作 使用|0和~~可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快,在处理像素及动画位移等

  • ASP.NET的实用技巧详细介绍

    关于ASP.NET的实用技巧,其实我们已经接触到很多了.下面为大家总结一下,供大家参考. 1.跟踪页面执行 设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化.ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="True"属性即可: <%@ Page Language="C#" Trace="true"> 跟踪信息可以分为两类: a.页面执行详细情况 其中主要包括

  • PHP 文件上传后端处理实用技巧方法

    PHP 文件上传后端处理实用技巧方法 引语:在上一篇文章中说到,在页面中可以用隐藏的方式让你的上传页面看起来漂亮.但是这对于性能来说,并没有什么卵用,那么在后台的处理中,难道就没有一些处理技巧么?所谓后台的技巧,应该要包括上传得快一点,上传的文件大一点!那么,本文就来说说,后端处理都有些什么技巧吧! 业务场景一.我们只会选择一个单个的文件上传,而且不需要做一些即时的验证工作.那么,也许并没有什么优化可言了,因为,最后你要做的,只是将这个文件放在表单里最后一起提交,直接处理即可! 业务场景二.需要

随机推荐