剛學c#不久,也不太懂什麼IHTMLDocument、IHTMLDocument二、IWebBrowser2等等。本身琢磨了很久,終於知道了怎麼用WebBrowser操做frame和iframe。html
1.獲取frame的源文件web
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(refj) as HTMLWindow2Class; if (frame.name == "main") { MessageBox.Show(frame.document.title); } }
3.獲取frame的IHTMLDocument2接口c#
IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.Window.Frames["main"].Document.DomDocument;
4.取得frame中被點擊的鏈接瀏覽器
private void webBrowser1_Navigating(objectsender, WebBrowserNavigatingEventArgs e) { string url =webBrowser1.Document.Window.Frames["main"].Document.ActiveElement.GetAttribute("src"); }
C# 經過webBrowser 框架網頁框架
首先對webBrowser加載網頁學習
this.webBrowser1.Url= new System.Uri("url地址", System.UriKind.Absolute);
給通常不是框架網頁中的文本框賦值this
webBrowser1.Document.GetElementById("文本框ID").InnerText= "weiling";//文本框賦值根據ID賦值 this.webBrowser1.Document.All["文本框name"].SetAttribute("value", "0924");//文本框賦值根據name賦值
表單提交,也能夠當作是一個點擊事件url
HtmlElement form= webBrowser1.Document.GetElementById("formID");//提交表單 form.InvokeMember("submit");
框架網頁中的文本框賦值,"frameMain"是框架的namespa
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時的操做
//防止頁面屢次刷新頁面執行 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++) { HtmlElementGetElement = 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實現網頁自動填表
曾今向網友介紹過個人一個本身編寫的自動填寫網頁表單的小程序,不少網友都以爲很實用,也許多會對這個程序的源碼很感興趣,這裏我只是簡介下程序中用到的主要代碼。最初我是經過下面這篇文章漸漸積累的相關知識,再慢慢完善,現轉來同你們分享,共同窗習。
話說有了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="關閉" /> </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的。
※關於表單的提交,的確還有另外一種方法就是獲取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("已搜索到文檔結尾。"); } } }
到此爲止,簡單的查找就搞定了。至於替換功能,看了下一個例子,我相信你就能夠舉一反三輕鬆搞定了