C#使用WebBrowser获取网页验证码图片实例
这里很简单,我们只要到src属性为“RandomImage.aspx”结尾的图片,就到我们所需的这个元素了。
到这个元素之后,为了方便确定其位置,并确保其不会超出WebBrowser可视范围,我们要为它赋予一个内联样式,使之处于页面的绝对左上角,并设置z-index为9999,以避免被其他元素覆盖,这个样式即为:
"position: absolute; z-index: 9999; top: 0px; left: 0px"
这之后就可以通过WebBrowser的DrawToBitmap方法截图了,截图的宽和高可通过上述元素的ClientRectangle属性取得。
实现截图实例
那么现在建立一个WinForm项目来做测试,设计如下界面:
private void button1_Click(object sender, EventArgs e)
{
var wb = new WebBrowser();
wb.Navigate("www.jcard/Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CV");
//等待加载完毕
while (wb.ReadyState < WebBrowserReadyState.Complete) Application.DoEvents();
//遍历寻验证图像所在元素
foreach (HtmlElement f in wb.Document.Images)
{
if (f.GetAttribute("src").ToLower().EndsWith("randomimage.aspx"))
{
//将元素绝对定位到页面左上角
f.Style = "position: absolute; z-index: 9999; top: 0px; left: 0px";
//抓图
var b = new Bitmap(f.ClientRectangle.Width, f.ClientRectangle.Height);
wb.DrawToBitmap(b, new Rectangle(new Point(), f.ClientRectangle.Size));
pictureBox1.Image = b;
script在html中的用法
break;
}
}
}
提示
WebBrowser的DrawToBitmap方法是隐藏的,不受智能感知提示支持,我不知道为什么会这样,但我知道DrawToBitmap方法确实存在问题,就是截图出来全白现象,据我观察,发生这种现象和是否显示WebBrowser控件有关,只要在窗体上显示了WebBrowser控件,截图出来就是全白,而如果不将WebBrowser加载到窗体,截图就是正常的,具体原因不明,只能再次感叹WebBrowser这个强大的控件编写的也太粗滥了。
WebBrowser具有自动填表、甚至自动提交的功能
假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入
框的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");
这里我们用SetAttribute来设置文本框的“value”属性,用InvokeMember来调用了按钮的“click”方法。因为不同的Html元素,其拥有的属性和方法也不尽相同,所以.Net 2.0提供了统一的HtmlElement来概括各种Html元素的同时,提供了这两个方法以调用元素特有的功能。关于各种Html元素的属性和方法一览,可以查阅MSDN的DHTML Reference。
※关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:
HtmlElement formLogin = webBrowser.Document.Forms["loginForm"];
//……
formLogin.InvokeMember("submit");
本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这些验证代码就得不到执行,有可能会引起错误。
与脚本的互操作
Web页面的HTML元素的事件,可以由Windows Form端来响应,可以在某种程度上看作是Web页面调用WinForm;那么反过来,WinForm除了可以直接访问Web页面的HTML元素之外,能否调用Web页面里的各种Script呢?
首先是调用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;
Script(strScript, "Javascript");
C#用WebBrowser时如何判断网页加载完毕
主要有两种方法
1、用计数器count=0,通过事件webBrowser_Navigated和webBrowser_DocumentCompleted对count分别自增和自减
2、在DocumentCompleted事件中判断e.Url和WebBrowser.Document.Url是否一致,如一致则表示初始页面加载完毕
以下代码可以确保你不会在未加载完毕时执行操作:
Private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompleted
EventArgs e)
{
if(webBrowser1.ReadyState<WebBrowserReadyState.Complete)return;
//执行正常流程代码…………
}
如果需要严格控制每页只能执行一次代码,那么需要附加一个属性或变量来记录上次访问的网址,并据此进行判断:
Private void webBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompleted
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论