首页 > 代码库 > HttpWebRequest post 提交 C#的WebBrowser操作frame如此简单 WebClient 提交

HttpWebRequest post 提交 C#的WebBrowser操作frame如此简单 WebClient 提交

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//<a href="http://www.cnblogs.com/cgli/archive/2011/04/09/2010497.html">http://www.cnblogs.com/cgli/archive/2011/04/09/2010497.html</a> <br>System.Net.ServicePointManager.Expect100Continue = false;
 
            string param = "u=1159924411&p=zwl.303815";//分别是用户名框的id和密码的id
            byte[] bs = Encoding.ASCII.GetBytes(param);
 
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://qzone.qq.com/");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            req.ContentLength = bs.Length;
 
            using (Stream reqStream = req.GetRequestStream())
            {
                reqStream.Write(bs, 0, bs.Length);
            }
            using (WebResponse wr = req.GetResponse())
            {
                
 
                StreamReader sr = new StreamReader(wr.GetResponseStream());
                string str = sr.ReadToEnd();
//引用HtmlAgilityPack.dll<br>                HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
                 html.LoadHtml(str);
                  
               // HtmlDocument doc = new HtmlDocument();
              //  doc.Write("<html><title>test</title><body>this is a hteml</body></html>");
                //string str=wr.
                //在这里对接收到的页面内容进行处理
           

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
C#的WebBrowser操作frame如此简单
刚学c#不久,也不太懂什么IHTMLDocument、IHTMLDocument2、IWebBrowser2等等。自己琢磨了好久,终于知道了怎么用WebBrowser操作frame和iframe。
1.获取frame的源文件
MessageBox.Show(webBrowser1.Document.Window.Frames["main"].Document.Body.InnerHtml);
2.获取frame的HTMLDocument接口
HTMLDocument doc = (HTMLDocument)webBrowser1.Document.DomDocument;
object j;
for (int i = 0; i < doc.parentWindow.frames.length; i++)
{
      j = i;
      HTMLWindow2Class frame = doc.parentWindow.frames.item(ref j) as HTMLWindow2Class;
      if (frame.name == "main")
       {                  
             MessageBox.Show(frame.document.title);                   
       }
}   
3.获取frame的IHTMLDocument2接口
IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.Window.Frames["main"].Document.DomDocument;
4.取得frame中被点击的连接
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
     string url = webBrowser1.Document.Window.Frames["main"].Document.ActiveElement.GetAttribute("src");
}
  
  
原文:http://blog.csdn.net/llj1985/archive/2007/09/01/1768147.aspx
 
C# 通过webBrowser 框架网页
2009-11-16 08:53
 
首先对webBrowser加载网页
this.webBrowser1.Url= new System.Uri("url地址", System.UriKind.Absolute);
 
给一般不是框架网页中的文本框赋值
webBrowser1.Document.GetElementById("文本框ID").InnerText= "weiling";//文本框赋值根据ID赋值
或者:this.webBrowser1.Document.All["文本框name"].SetAttribute("value", "0924");//文本框赋值根据name赋值
 
表单提交,也可以看成是一个点击事件
HtmlElement form= webBrowser1.Document.GetElementById("formID");//提交表单
form.InvokeMember("submit");
 
框架网页中的文本框赋值,"frameMain"是框架的name
webBrowser1.Document.Window.Frames["frameMain"].Document.GetElementById("txtXingming").InnerText= "521656";//框架赋值
注:frameMain 是框架的name
 
框架网页中下拉框赋值
HtmlDocument doc= webBrowser1.Document.Window.Frames["frameMain"].Document;//框架下下拉框赋值
HtmlElement el= doc.GetElementById("drpXingbie");
el.SetAttribute("selectedIndex","1");
 
 
 
网页控件没有ID时的操作
C#:webBrowser1控件通过TagName,Name查找元素(没有ID时)
//防止页面多次刷新页面执行
            if (num == 1)
            {
                string GetUserName = System.Configuration.ConfigurationSettings.AppSettings["Y2000UserName"].ToString();
                string GetUserPassword = System.Configuration.ConfigurationSettings.AppSettings["Y2000UserPassword"].ToString();
                int a = 1;
                int all = webBrowser1.Document.Body.All.Count;
                for (int i = 0; i < all; i++)
                {
                    HtmlElement GetElement = webBrowser1.Document.All[i];
                    //取到包含input标签的元素
                    if (GetElement.TagName.ToUpper().ToString() == "INPUT")
                    {
                        //根据input的Name属性,找到该元素并赋值:给用户名输入框赋值
                        if (GetElement.Name.ToString() == "UserName")
                        {
                            webBrowser1.Document.All[i].SetAttribute("value", GetUserName);
                        }
                        //根据input的Name属性,找到该元素并赋值:给密码输入框赋值
                        if (GetElement.Name.ToString() == "Passwd")
                        {
                            webBrowser1.Document.All[i].SetAttribute("value", GetUserPassword);
                        }
                    }
                    //根据input的Name属性,找到提交按钮并执行动作
                    if (GetElement.Name.ToString() == "Submit")
                    {
                        //过滤点击页面中相同"name=Submit"的元素
                        if (a == 1)
                        {
                            webBrowser1.Document.All[i].InvokeMember("click");
                        }
                        a++;
                    }
                }
                num++;
            }
 
 
C# WebBrowser实现网页自动填表
2010-02-01 16:20
C# WebBrowser实现网页自动填表
曾今向网友介绍过我的一个自己编写的自动填写网页表单的小程序,很多网友都觉得很实用,也许多会对这个程序的源码很感兴趣,这里我只是简介下程序中用到的主要代码。最初我是通过下面这篇文章渐渐积累的相关知识,再慢慢完善,现转来同大家分享,共同学习。
 
话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢)。那么,无论我们是想做一个“定制版IE”,还是希望利用HTML来做用户界面(指WinApp而非WebApp。许多单机软件,包括Windows的帮助支持中心,都是HTML做的),都少不了Windows Form和包含在WebBrowser中的Web页面的交互。本文将通过几个实际的例子,初步介绍一下WinForm和WebBrowser所包含的Web页面之间的交互。
下面的代码假设你已经建立了一个Windows Form,上面有一个WebBrowser名为“webBrowser”。
Study Case 1:用WinForm的Event Handler响应Web页面的事件
现在有这样一个Windows Application,它的界面上只有一个WebBrowser,显示一个本地的HTML文件作为界面。现在的问题是,所有逻辑都可以放在HTML文件里,唯独“关闭”按钮遇到了困难——通常,Web页面是没有办法直接控制浏览器的,更不用说结束这个WinForm程序了。
但是,在.Net 2.0当中,“由Windows Form响应Web页面的事件”已经成为了现实。
在.Net 2.0中,整个HTML文档以及其包含的各个HTML元素,都和一个个HtmlDocument、HtmlElement之类的.Net对象对应。因此只要找到这个“关闭”按钮对应的HtmlElement对象,为其click事件添加Event Handler即可。
假设HTML源代码如下:
<html>
<body>
<input type="button" id="btnClose" value=http://www.mamicode.com/"关闭" />
</body>
</html>
那么找出该按钮并为之添加Event Handler的代码如下:
HtmlDocument htmlDoc = webBrowser.Document;
HtmlElement btnElement = htmlDoc.All["btnClose"];
if (btnElement != null)
{
btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);
}
其中HtmlBtnClose_Click是按下Web按钮时的Event Handler。
很简单吧?那么稍稍高级一点的——我们都知道一个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));
Study Case 2:表单(form)的自动填写和提交
要使我们的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方法,这些验证代码就得不到执行,有可能会引起错误。
Study Case 3:查找并选择文本
这次我们希望实现一个和IE一模一样的查找功能,以对Web页面内的文字进行查找。
文本查找要借助于TextRange对象的findText方法。但是,.Net里并没有这个对象。这是因为,.Net 2.0提供的HtmlDocument,HtmlWindow,HtmlElement等类,只不过是对原有mshtml这个COM组件的不完整封装,只提供了mshtml的部分功能。所以许多时候,我们仍旧要借助mshtml来实现我们需要的功能。好在这些.Net类都提供了DomDocument这个属性,使得我们很容易把.Net对象转换为COM对象使用。下面的代码演示了如何查找Web页面的文本。
(需要添加mshtml的引用,并加上using mshtml;)
public partial class SearchDemo : Form
{
// 建立一个查找用的TextRange(IHTMLTxtRange接口)
private IHTMLTxtRange searchRange = null;
public SearchDemo()
{
InitializeComponent();
}
private void btnSearch_Click(object sender, EventArgs e)
{
// Document的DomDocument属性,就是该对象内部的COM对象。
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document.DomDocument;
string keyword = txtKeyword.Text.Trim();
if (keyword == "")
return;
// IE的查找逻辑就是,如果有选区,就从当前选区开头+1字符处开始查找;没有的话就从页面最初开始查找。
// 这个逻辑其实是有点不大恰当的,我们这里不用管,和IE一致即可。
if (document.selection.type.ToLower() != "none")
{
searchRange = (IHTMLTxtRange)document.selection.createRange();
searchRange.collapse(true);
searchRange.moveStart("character", 1);
}
else
{
IHTMLBodyElement body = (IHTMLBodyElement)document.body;
searchRange = (IHTMLTxtRange)body.createTextRange();
}
// 如果找到了,就选取(高亮显示)该关键字;否则弹出消息。
if (searchRange.findText(keyword, 1, 0))
{
searchRange.select();
}
else
{
MessageBox.Show("已搜索到文档结尾。");
}
}
}
到此为止,简单的查找就搞定了。至于替换功能,看了下一个例子,我相信你就可以触类旁通轻松搞定了

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//WebClient
private void StartLoop(int ProxyNum)
        {
           WebClient [] wcArray = new WebClient[ProxyNum]; //初始化
             for (int idArray = 0; idArray< ProxyNum;idArray++)
            {
                 wcArray[idArray] = new WebClient();
                wcArray[idArray].OpenReadCompleted += new OpenReadCompletedEventHandler(Pic_OpenReadCompleted2);
                wcArray[idArray].UploadDataCompleted += new UploadDataCompletedEventHandler(Pic_UploadDataCompleted2);
                try
                {
                    
                    wcArray[idArray].Proxy = new WebProxy(proxy[1], port);
                    wcArray[idArray].OpenReadAsync(new Uri("http://hi.baidu.com/srxljl")); //打开WEB;
                    proxy = null;
                }
                catch
                {
                }
            }
        }
 
        private void Pic_OpenReadCompleted2(object sender, OpenReadCompletedEventArgs e)
        {
                if (e.Error == null)
                {
                            string textData = http://www.mamicode.com/new StreamReader(e.Result, Encoding.Default).ReadToEnd(); //取返回信息
                             ..
                              String cookie = ((WebClient)sender).ResponseHeaders["Set-Cookie"];
                             ((WebClient)sender).Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                            ((WebClient)sender).Headers.Add("Accept-Language", "zh-cn");
                            ((WebClient)sender).Headers.Add("Cookie", cookie);
 
                            string postData = http://www.mamicode.com/""
                            byte[] byteArray = Encoding.UTF8.GetBytes(postData); // 转化成二进制数组
                           ((WebClient)sender).UploadDataAsync(new Uri("http://hi.baidu.com/srxljl"), "POST", byteArray);
                }
         }
 
        private void Pic_UploadDataCompleted2(object sender, UploadDataCompletedEventArgs e)
        {
                 if (e.Error == null)
                {
                    string returnMessage = Encoding.Default.GetString(e.Result);
                    
                }
       }