C# 自动填表 & 关于WebBrowser submit

来源:互联网 发布:数控龙门铣编程 编辑:程序博客网 时间:2024/05/22 14:15
公司上网首先需要安全认证,我嫌每次输入用户名、密码太麻烦,而我又使用IE7、Maxthon、firefox2等多种浏览器,所以决定自己写个自动填表的小程序让它开机运行。
 
用C#写这个东东非常简单,只需要用一个WebBrowser控件打开要自动填表的网页,然后找到特定的页面成员,赋值和触发事件就ok了。
首先分析目标页面:
  1. <form name="LoginForm" method=get action="http://10.245.×.×/login" onSubmit ='return CheckSubmit()' >
  2.            <br>
  3.           <br>
  4.           <table width="253" border="0" cellspacing="0" cellpadding="0">
  5.             <tr> 
  6.               <td colspan="2"><img src="image/login/login.gif" width="227" height="45"></td>
  7.             </tr>
  8.             <tr> 
  9.               <td colspan="2"> 
  10.                 <table width="100%" border="0" cellspacing="0" cellpadding="0">
  11.                   <tr> 
  12.                     <td colspan="3"> </td>
  13.                   </tr>
  14.                   <tr> 
  15.                     <td width="26"><img src="image/login/useraccount.gif" width="21" height="25"></td>
  16.                     <td>用户账号</td>
  17.                     <td width="158"> <input type="text" name="username" size="20" maxlength="66"> 
  18.                     </td>
  19.                   </tr>
  20.                   <tr> 
  21.                     <td width="26"><img src="image/login/password.gif" width="21" height="25"></td>
  22.                     <td>用户密码</td>
  23.                     <td width="158"> <input name="password" type="password" id="password" size="20" maxlength="23"> 
  24.                     </td>
  25.                   </tr>
  26.      <INPUT type="hidden"  name="RecordPassword" value=on >
  27.      <input type="hidden"  name="authmode"  value="CHAP">
  28.      <input type="hidden"  name="websuserip"  value="10.245.113.32">
  29.      <input type="hidden"  name="challenge" size=50 value="dhefbmmihpnfgmei">
  30.      <input type="hidden"  name="submittime"  value="0">
  31.                 </table>
  32.               </td>
  33.             </tr>
  34.    <tr> 
  35.     <br>
  36.        <td height="17"> <div align="center"><br>
  37.               <input name="clear" type=button  value="清 除"  style="BACKGROUND-COLOR: #D6EFFF; CURSOR: HAND; BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; WIDTH:50; HEIGHT: 20px; COLOR: #000000" onMouseOut="this.style.backgroundColor='#D6EFFF'" onMouseOver="this.style.backgroundColor='#94D8FF'" onClick ='return onReset()'></div></td>
  38.        <td height="27"> <div align="center"><br>
  39.               <input name="submit" type=submit height="27" value="登 录"  style="BACKGROUND-COLOR: #D6EFFF; CURSOR: HAND; BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; WIDTH:50; HEIGHT: 20px; COLOR: #000000" onMouseOut="this.style.backgroundColor='#D6EFFF'" onMouseOver="this.style.backgroundColor='#94D8FF'" ></div></td>
  40.              </tr>
  41.           </table>
  42.         </form>
可以知道,要做的就是给input成员username和password赋值,然后触发form的submit事件就可以。
不过,我在触发submit时遇到了一些问题,因为submit不是C#提供的常用的已注册事件,所以不能够通过RaiseEvent直接调用。
上穷碧落下黄泉,最后还是在一个国内的网站上找到了答案,可以通过AttachEventHandler("submit",new EventHandler(fun))给form添加事件处理函数fun,然后在fun中用InvokeMember方法调用页面中的响应函数,不过这样可能就不能submit页面到form的action定义的url了(偶没试)。
所以,用了改网站上提供的另外一种方法--使用InvokeMember调用input按钮submit的click事件,也可以达到触发form的submit的目的,虽然比较曲折,不过代码反而更简洁。
最后的C#代码如下:
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             webBrowser1.Navigate("http://10.245.*.*/"); //打开目标URL
  4.         }
  5.         private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  6.         {   //webBrowser完成页面加载:
  7.             if (webBrowser1.Url.ToString() == "http://10.245.*.*/") //submit后还会加载一次,而所加载的页面“注销”按钮的name也是submit,汗,所以这要判断下
  8.             {
  9.                 HtmlDocument doc = webBrowser1.Document; //获取document对象
  10.                 HtmlElement btn = null;
  11.                 foreach (HtmlElement em in doc.All) //轮循
  12.                 {
  13.                     string str = em.Name;
  14.                     if ((str == "username") || (str == "password") || (str == "submit")) //减少处理
  15.                     {
  16.                         switch (str)
  17.                         {
  18.                             case "username": em.SetAttribute("value""****"); break//赋用户名
  19.                             case "password": em.SetAttribute("value""****"); break//赋密码
  20.                             case "submit": btn = em; break//获取submit按钮
  21.                             defaultbreak;
  22.                         }
  23.                     }
  24.                 }
  25.                 btn.InvokeMember("click"); //触发submit事件
  26.                 //doc.Forms["LoginForm"].InvokeMember("submit");
  27.             }
  28.             else //成功登陆后关闭
  29.             {
  30.                 this.Close();
  31.             }
  32.         }
WebBrowser1.Document.All("login").InvokeMember("Click")
原创粉丝点击