WebBrowser

フォーム上にブラウザを実装できるWebBrowserコントロールを使ってみます。

URLを開く

Navigateメソッドを使用することで指定したURLを開くことができます。

URLを文字列で与える場合。

private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate(textBox1.Text);
}

例外:

ページ取得完了のチェック

イベントを使う

OnDocumentCompleted()イベントが発生するので、これを捕捉する。 ページにフレームが使用されている場合は、それぞれでこのイベントが発生するので、 対象ページに対するイベントなのかどうかは自分で判断する必要がある。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.ToString() == "http://www...")
    {

    }
}

ただし強制リダイレクトされるページについては、変数eはリダイレクト後のURLになるので判断が難しい。

ポーリングを使う

WebBrowser.IsBusyプロパティだけでは十分でないので、WebBrowser.ReadyStateも監視する。

while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
    System.Threading.Thread.Sleep(50);
    System.Windows.Forms.Application.DoEvents();
}

検出できないケース

当たり前といえば当たり前だが、 例えばフォームでsubmitイベントを使用し、JavaScriptでクライアントで完結するような処理を行う場合、その処理中・処理完了を検出することは出来ない。

そのスクリプトを自前で用意している場合は、hiddenで処理中フラグなどを持ち、ポーリングで監視するなどの工夫をする必要がある。自前で無い場合はどうすればいいんだろ。。

そのHTMLソースを得る

表示中のURLのソースを得るには次のようにする。

    HtmlDocument doc = webBrowser1.Document;
    String src = doc.GetElementsByTagName("html")[0].OuterHtml;

他の方法もある。こっちの方がシンプル。

    HtmlDocument doc = webBrowser1.Document;
    String src = doc.Body.outerhtml;

DocumentTextから直接取得すると、文字コードが解決される前の状態で得られる。日本語だと化け化けだったり。

HTMLを表示する

HTMLを直接与えて表示することができます。

private void button4_Click(object sender, EventArgs e)
{
    string html = textBox2.Text;

    webBrowser1.DocumentText = html;

}

例外:

フォームに入力する

例えば下記のようなHTMLだった場合、

<form action="LoginDo" method="post">
<input name="ID" type="text" maxlength="10" value="">
<input name="PASS" type="password" maxlength="20" value=""/>
<input type="submit" value="ログイン">
</form>

以下のようにすることで、 テキストフォームに値を書き込んで、Submitボタン押下したのと同じ動作をする。

HtmlDocument doc = webBrowser1.Document;

doc.All.GetElementsByName("ID")[0].SetAttribute("value", "id");
doc.All.GetElementsByName("PASS")[0].SetAttribute("value", "password");
doc.Forms[0].InvokeMember("submit");

フレームのあるサイト

複数のフレームから成るWebページの場合は、次のようにしてフレーム毎にアクセスすることになる。(iframeも対象)

HtmlDocument doc = webBrowser1.Document;   // 大元のページ
int count = doc.Window.Frames.Count;       // 含まれるフレームの数
HtmlWindow win0 = doc.Window.Frames[0];    // 1番目のフレーム情報
HtmlDocument doc0 = win0.Document;         // 1番目のフレームの文書情報
HtmlDocument doc1 = doc.Window.Frames[1].Document;      // 2番目のフレームの文書情報
HtmlDocument doc2 = doc.Window.Frames["abc"].Document;  // "abc"という名前のフレームの文書情報

入れ子構造になっているので再帰的にFrames[]を探索すれば、 総てのフレームの構造を得ることが出来る。

フレーム自身の定義は次のように取得できる。

HtmlElement el = win0.WindowFrameElement;
String elHtml = el.OuterHtml;

このelHtmlは下記のようなタグの記述形式で得られる。

<FRAME name=logo src=\"title.html\">

要素のツリー構造を得る

  • HtmlElementにはChildrenプロパティがあり、自身の直下の要素への参照がまとめられている。
  • この要素の集合を管理しているのはHtmlElementCollectionクラス。
  • HtmlElement.Childrenを再帰的にたどることにより、HTML全体の木構造を得ることができる。

各要素のタグ名や属性を得る

  • TagNameプロパティでタグ名を、getAttribute()メソッドでタグ内に書かれた属性を得ることができる。
    • <A href="xxxx">というタグのHtmlElementであれば、TagNameは"A"、GetAttribute("href")で"xxxx"を得ることができる。

要素をドキュメントから削除したい

  • 要素をドキュメントから削除したいときは、OuterHTMLプロパティに""を代入する。
    el.OuterHtml = "";

新しい要素をドキュメントに追加したい

  • 新しい要素を、HtmlDocument#CreateElement()メソッドで作成する。
  • 必要に応じて属性などを加える。
  • 親要素のAppendChild()メソッドでその配下に追加される。
    HtmlElement el = webBrowser1.Document.CreateElement("A");
    el.SetAttribute("HREF", "http://www.yahoo.co.jp");
    el.InnerText = "Yahooサイトへ";
    webBrowser1.Document.Body.AppendChild(el);

要素をドキュメント内で移動したい

  • 移動先の親要素のAppendChild()メソッドでその配下に追加すると、元の親要素から自動的に削除される。(移動)
HtmlElement.AppendChild メソッド
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.appendchild.aspx

参考URL

WebBrowserコントロールによりWebページからリンクや画像を抽出するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html
WebBrowserコントロールからフレームを利用したのページのHTMLソース取得方法
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=355880&SiteID=7
.NET TIPS WebClientクラスでGETメソッドによりクエリ文字列を送信するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/308wcquerystr/wcquerystr.html
.NET TIPS WebClientクラスでWebページを取得するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/302wcget/wcget.html
.NET TIPS WebRequestWebResponseクラスでPOSTメソッドによりデータを送信するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/318webpost/webpost.html
.NET TIPS WebRequestWebResponseクラスでWebページを取得するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/311webreqres/webreqres.html
Visual C# 2005 または Visual C# .NET で WebBrowser コントロールをホストしてフォーム データを送信する方法
http://support.microsoft.com/kb/313068/ja
WebBrowserコントロールにYahoo!ログインページを表示し、自動的にID,パスワードを入力してログインが成功、失敗したか知りたい
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1518302&SiteID=7
MSN相談箱 VB2005、WebBrowserにてログインが成功したか失敗したかを判断
http://questionbox.jp.msn.com/qa3366793.html?StatusCheck=ON
.NET Framework クラス ライブラリ HtmlDocument クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(VS.80).aspx
.NET Framework クラス ライブラリ HtmlElementCollection クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelementcollection(VS.80).aspx
.NET Framework クラス ライブラリ HtmlElement クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement(VS.80).aspx

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-09-29 (木) 12:20:30 (2939d)