C#的WebBrowser操做frame

剛學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("已搜索到文檔結尾。");
}
}
}
複製代碼

到此爲止,簡單的查找就搞定了。至於替換功能,看了下一個例子,我相信你就能夠舉一反三輕鬆搞定了

相關文章
相關標籤/搜索