*WebBrowser [#y6727773] フォーム上にブラウザを実装できるWebBrowserコントロールを使ってみます。 #contents(); **URLを開く [#je50e909] Navigateメソッドを使用することで指定したURLを開くことができます。 URLを文字列で与える場合。 private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate(textBox1.Text); } 例外: -[[InvalidOperationException>.NET Framework/Exception#y18fa698]] -[[ObjectDisposedException>.NET Framework/Exception#wf45eb69]] **ページ取得完了のチェック [#na80a123] ***イベントを使う [#x714b88a] OnDocumentCompleted()イベントが発生するので、これを捕捉する。 ページにフレームが使用されている場合は、それぞれでこのイベントが発生するので、 対象ページに対するイベントなのかどうかは自分で判断する必要がある。 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.ToString() == "http://www...") { } } ただし強制リダイレクトされるページについては、変数eはリダイレクト後のURLになるので判断が難しい。 ***ポーリングを使う [#l172c818] WebBrowser.IsBusyプロパティだけでは十分でないので、WebBrowser.ReadyStateも監視する。 while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) { System.Threading.Thread.Sleep(50); System.Windows.Forms.Application.DoEvents(); } ***検出できないケース [#occ7dab0] 当たり前といえば当たり前だが、 例えばフォームでsubmitイベントを使用し、JavaScriptでクライアントで完結するような処理を行う場合、その処理中・処理完了を検出することは出来ない。 そのスクリプトを自前で用意している場合は、hiddenで処理中フラグなどを持ち、ポーリングで監視するなどの工夫をする必要がある。自前で無い場合はどうすればいいんだろ。。 **そのHTMLソースを得る [#g5483ace] 表示中のURLのソースを得るには次のようにする。 HtmlDocument doc = webBrowser1.Document; String src = doc.GetElementsByTagName("html")[0].OuterHtml; 他の方法もある。こっちの方がシンプル。 HtmlDocument doc = webBrowser1.Document; String src = doc.Body.outerhtml; DocumentTextから直接取得すると、文字コードが解決される前の状態で得られる。日本語だと化け化けだったり。 **HTMLを表示する [#eb6bd410] HTMLを直接与えて表示することができます。 private void button4_Click(object sender, EventArgs e) { string html = textBox2.Text; webBrowser1.DocumentText = html; } 例外: -[[InvalidOperationException>.NET Framework/Exception#y18fa698]] -[[ObjectDisposedException>.NET Framework/Exception#wf45eb69]] **フォームに入力する [#se22d978] 例えば下記のような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"); **フレームのあるサイト [#k51c19a5] 複数のフレームから成る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\"> **要素のツリー構造を得る [#gf4c99e1] -HtmlElementにはChildrenプロパティがあり、自身の直下の要素への参照がまとめられている。 -この要素の集合を管理しているのはHtmlElementCollectionクラス。 -HtmlElement.Childrenを再帰的にたどることにより、HTML全体の木構造を得ることができる。 ***各要素のタグ名や属性を得る [#k52456a3] -TagNameプロパティでタグ名を、getAttribute()メソッドでタグ内に書かれた属性を得ることができる。 --<A href="xxxx">というタグのHtmlElementであれば、TagNameは"A"、GetAttribute("href")で"xxxx"を得ることができる。 ***要素をドキュメントから削除したい [#vc706fc4] -要素をドキュメントから削除したいときは、OuterHTMLプロパティに""を代入する。 el.OuterHtml = ""; ***新しい要素をドキュメントに追加したい [#b9fe001d] -新しい要素を、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); ***要素をドキュメント内で移動したい [#t859631d] -移動先の親要素のAppendChild()メソッドでその配下に追加すると、元の親要素から自動的に削除される。(移動) :HtmlElement.AppendChild メソッド|http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.appendchild.aspx **参考URL [#f3ac8cfc] :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 [[WebRequest>System.Net.WebRequest]]/[[WebResponse>System.Net.WebResponse]]クラスでPOSTメソッドによりデータを送信するには?|http://www.atmarkit.co.jp/fdotnet/dotnettips/318webpost/webpost.html :.NET TIPS [[WebRequest>System.Net.WebRequest]]/[[WebResponse>System.Net.WebResponse]]クラスで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