WebBrowserコントロール

Similar documents
NotifyIconコントロール

VB.NET解説

グラフィックス

ICONファイルフォーマット

正規表現応用

Userコントロール

ListViewコントロール

データアダプタ概要

ファイル操作-インターネットキャッシュ

プロセス間通信

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

64bit環境で32bitコンポーネントの利用

プラグイン

ファイル操作

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

ハッシュテーブル

VFD256 サンプルプログラム

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

ファイル監視

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

ファイル操作-バイナリファイル

VB実用Ⅲ⑩ フリーデータベースⅡ

ウィンドウ操作 応用

データベースプログラミング

ルーレットプログラム

C#の基本

TestDesign for Web

Ver.1.1

DAOの利用

構造体

Prog2_12th

ブロック パニック

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

Microsoft Word -

スレッド操作 タイマー

Prog2_15th

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加

Microsoft Word - VB.doc

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

Prog2_4th

Microsoft Word - ModelAnalys操作マニュアル_

WebReportCafe

PALNETSC0184_操作編(1-基本)

mySQLの利用

グラフィックス 目次

GUIプログラムⅣ

印刷

スライド 1

VB.NET解説

グラフィックス 目次

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

Microsoft Excel操作

brieart変換設定画面マニュアル

(1)IE6 の設定手順 (1)IE6 の設定手順 1) 信頼済みサイトの追加手順 1: ブラウザ (Internet Explorer) を起動します 手順 2: ツール / インターネットオプション / セキュリティ メニューを選択します 手順 3: セキュリティ タブの 信頼済みサイト を選択


正規表現詳細

インテル(R) Visual Fortran コンパイラ 10.0

Shareresearchオンラインマニュアル

XAML Do-It-Yourself 第 3 回ベントとトリガー XML Do-It-Yourself 第 3 回目は ベント処理とトリガーについて学習します Windows フォームゕプリケーションでは たとえば ボタンが押された というベントに対応する処理 ( ベントハンドラー ) を記述する

VB実用⑦ エクセル操作Ⅰ

Prog2_2nd

改版履歴 版数 改版日付 改版内容 /03/14 新規作成 2013/03まで製品サイトで公開していた WebSAM DeploymentManager Ver6.1 SQL Server 2012 製品版のデータベース構築手順書 ( 第 1 版 ) を本 書に統合しました 2

Prog2_6th

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

CONTEC DIOプロバイダ ユーザーズガイド

Java - Visual Editor

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

Java言語 第1回

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます


PowerPoint プレゼンテーション

エクセル詳細 アドイン

Delphi/400でFlash動画の実装

Microsoft PowerPoint - Borland C++ Compilerの使用方法(v1.1).ppt [互換モード]

ブロック崩し風テニス

クライアント証明書導入マニュアル

WinXp-Rmenu

WinXp-Rmenu

MISAO with WPF

intra-mart Accel Platform

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

構造体

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版

CubePDF ユーザーズマニュアル

すると メインメニューと呼ばれる DC さくらのメインウィンドウ部が表示されます ( 下の画面がスクリーンシ ョットです ) メインメニューは ウィンドウ右上の ボタンを押すと閉じます リスト内のアイテムは ダウンロードのタスクを表します ダウンロード状況を把握できます メニュー項目やボタンの説明は

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

正規表現概要

1. WebShare 編 1.1. ログイン / ログアウト ログイン 1 WebShare の URL にアクセスします xxxxx 部分は会社様によって異なります xxxxx. 2 ログイン名 パスワードを入力し

C1Live

データベースⅠ

モグラ叩きプログラム

Msako技術資料 

brieart初期導入ガイド

プレポスト【問題】

CodeGear Developer Camp

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

Prog2_9th

Android Layout SDK プログラミング マニュアル

Transcription:

WebBrowser コントロール Windows アプリケーションで Web ページを表示.NET Framework 2.0 では HTML 等の Web ページを Windows フォーム上に表示する為の WebBrowser コントロール (System.Windows.Forms 名前空間 ) が新たに追加されて居り 非常に手軽に Web ページの表示が出来る様に成って居る (.NET Framework 1.x では ActiveX コントロールで有る IE 用のコンポーネントを直接利用する必要が有り 少し面倒だった ) WebBrowser コントロールを利用するには WebBrowser クラスのインスタンスを生成して WebBrowser コントロールを作成し フォーム上に追加する 後は表示し度い Web ページの URL を ( 文字列等で ) パラメータに指定して WebBrowser コントロールの Navigate メソッドを呼び出す丈で有る 次のコードは 此れを実際に実装した例で有る Private webbrowser1 As WebBrowser Sub New( ) 省略 ' WebBrowser コントロールを作成とフォーム上に追加 webbrowser1 = New WebBrowser( ) Me.Controls.Add( webbrowser1 ) ' Web ページを表示 webbrowser1.navigate( "http://www.atmarkit.co.jp/fdotnet/" ) private WebBrowser webbrowser1; public Form1( ) { 省略 // WebBrowser コントロールを作成とフォーム上に追加 webbrowser1 = new WebBrowser( ); this.controls.add( webbrowser1 ); // Web ページを表示 webbrowser1.navigate( "http://www.atmarkit.co.jp/fdotnet/" ); 此れを実行すると 右の様な画面が表示される筈で有る 猶 WebBrowser コントロールは Visual Studio 2005 のツールボックス内に標準で提供されるコモンコントロールで有る 従って 通常のコントロールと同じ様に ツールボックスから Widows フォームデザイナ上にドラッグ & ドロップで追加する事も出来る -1-

WebBrowser コントロールに依り Web ページからリンクや画像を抽出 Web ページの HTML からリンク文字列 ( 及び 其の URL) や画像の URL を抜き出し度い場合 単純な方法と仕ては HTML ドキュメントをダウンロードし 正規表現等に依り <A> タグや <IMG> タグを抜き出す事が出来る 併し 此の方法では HTML ドキュメントの構造が複雑な場合や ページ作成者のタグの閉じ忘れ等迄に対応し様とすると非常に困難に成る 其の様な場合には.NET Framework 2.0 の標準コントロールで有る WebBrowser コントロール (System.Windows.Forms 名前空間 ) を利用すると良い 此れは IE の描画エンジンをコントロール化した物で 対象と成る Web ページを此のコントロールに表示させた時点で IE の描画エンジンが其の HTML ドキュメントを解析して居る為 其れに含まれる各 HTML 要素には 後述する.NET Framework のクラスを使って簡単にアクセス出来る 本来 WebBrowser コントロールは Windows アプリケーション上に Web ページや HTML で記述されたヘルプやドキュメントを表示させる為の物だが GUI を持たないアプリケーションでも其の機能は利用可能で有る 本稿ではコンソールアプリケーションから WebBrowser コントロールを使用し 指定された Web ページからリンク文字列を抜き出す方法を示す Web ページからリンク文字列を抜き出すサンプルプログラム Windows アプリケーションで WebBrowser コントロールに依り単に Web ページを表示する場合には Visual Studio でフォームに WebBrowser コントロールを配置しておき 其の Navigate メソッドを呼び出す丈で良い ( TIPS:Windows アプリケーションで Web ページを表示するには? 参照 ) 今回のケースでは 以下の様な手順に依り WebBrowser コントロールを使用し Web ページ内の HTML 要素にアクセスする 1.WebBrowser コントロールをインスタンス化する 2.Navigate メソッドに依り Web ページに移動する 3. ページ取得が完了するのを待つ 4.Document プロパティから HtmlDocument オブジェクトを得る 5.HtmlDocument オブジェクトから各要素 (HtmlElement オブジェクト ) にアクセスする ポイントと成るのは 3 のページ取得完了を待つ処理が必要と成る点だ (WebBrowser コントロールではページの取得は非同期に行われる為 Navigate メソッドの呼び出し自体はすぐに完了する ) ここではまず 上記の手順を実装したサンプルプログラムを示す 此のプログラムは Insider.NET のトップ ページに含まれるすべてのリンク文字列と其の URL を表示する Imports System Imports System.ComponentModel Imports System.Windows.Forms Public Class NonDispBrowser Inherits WebBrowser Dim done As Boolean ' タイムアウト時間 (10 秒 ) Dim timeout As New TimeSpan( 0, 0, 10 ) -2-

Protected Overrides Sub OnDocumentCompleted( _ ByVal e As WebBrowserDocumentCompletedEventArgs ) ' ページにフレームが含まれる場合にはフレーム毎に ' 此のメソッドが実行される為 実際の URL を確認する If e.url = Me.Url Then done = True End If Protected Overrides Sub OnNewWindow( ByVal e As CancelEventArgs ) ' ポップアップウィンドウをキャンセル e.cancel = True Public Sub New( ) ' スクリプトエラーを表示しない Me.ScriptErrorsSuppressed = True Public Function NavigateAndWait( ByVal url As String ) As Boolean MyBase.Navigate( url ) ' ページの移動 done = False Dim start As DateTime = DateTime.Now While done = False If DateTime.Now - start > timeout Then ' タイムアウト Return False End If Application.DoEvents( ) End While Return True End Function End Class Class GetLinks Shared Sub main( ) Dim ndb As New NonDispBrowser ndb.navigateandwait( "http://www.atmarkit.co.jp/fdotnet/" ) Dim doc As HtmlDocument = ndb.document ' リンク文字列と其の URL の列挙 For Each e As HtmlElement In doc.getelementsbytagname( "A" ) Dim href As String = e.getattribute( "HREF" ) ' HREF 属性の値 Dim text As String = e.innertext ' リンク文字列 If ( Not String.IsNullOrEmpty( href )) _ And ( Not String.IsNullOrEmpty( text )) Then text = text.replace( vbcrlf, "" ) ' 改行文字の削除 Console.WriteLine( href ) Console.WriteLine( text ) End If Next End Class -3-

using System; using System.ComponentModel; using System.Windows.Forms; public class NonDispBrowser: WebBrowser { bool done; // タイムアウト時間 (10 秒 ) TimeSpan timeout = new TimeSpan( 0, 0, 10 ); protected override void OnDocumentCompleted( WebBrowserDocumentCompletedEventArgs e) { // ページにフレームが含まれる場合にはフレーム毎に // 此のメソッドが実行される為実際の URL を確認する if ( e.url == this.url ) { done = true; protected override void OnNewWindow( CancelEventArgs e ) { // ポップアップウィンドウをキャンセル e.cancel = true; public NonDispBrowser( ) { // スクリプトエラーを表示しない this.scripterrorssuppressed = true; public bool NavigateAndWait( string url ) { base.navigate( url ); // ページの移動 done = false; DateTime start = DateTime.Now; while ( done == false ) { if ( DateTime.Now - start > timeout ) { // タイムアウト return false; Application.DoEvents( ); return true; class GetLinks { [ STAThread ] static void Main( ) { NonDispBrowser ndb = new NonDispBrowser( ); ndb.navigateandwait( "http://www.atmarkit.co.jp/fdotnet/" ); HtmlDocument doc = ndb.document; -4-

// リンク文字列と其の URL の列挙 foreach ( HtmlElement e in doc.getelementsbytagname( "A" )) { string href = e.getattribute( "href" ); // HREF 属性の値 string text = e.innertext; // リンク文字列 if (!string.isnullorempty( href ) &&!string.isnullorempty( text )) { text = text.replace( " r n", "" ); // 改行文字の削除 Console.WriteLine( href ); Console.WriteLine( text ); プログラムの実行結果は次の様に成る http://www.atmarkit.co.jp/ @IT http://tech.atmarkit.co.jp/ @IT テクノロジー http://www.atmarkit.co.jp/im/ @IT 情報マネジメント http://monoist.atmarkit.co.jp/ @IT MONOist http://jibun.atmarkit.co.jp/ @IT 自分戦略研究所 http://www.atmarkit.co.jp/job/ 以下省略 此のプログラムでは WebBrowser コントロールをサブクラス化して NonDispBrowser クラスを作成して居る NonDispBrowser クラスの NavigateAndWait メソッドが 指定した Web ページの取得を開始し 其れが完了する迄待つメソッドで有る ページ取得完了を待つ処理 NavigateAndWait メソッドでは WebBrowser コントロールより継承した Navigate メソッドを呼び出してページ取得を開始した後 done フラグが true に成る迄 Application.DoEvents メソッド呼び出しのループに依りページ取得が完了するのを待つ done フラグを true にセットして居るのは ページ取得が完了した時にシステムに依り呼び出される OnDocumentCompleted メソッドで有る 但し 対象と仕て居る Web ページにフレームが含まれて居る場合には フレーム内容の取得が完了した場合にも此の OnDocumentCompleted メソッドが呼び出される 此の為プログラムでは 其の時に取得が完了した URL( コードでは e.url) と最終的に取得し度い URL(WebBrowser コントロールの Url プロパティの値 ) が一致した場合に而巳 done フラグを true にして居る 併し 此の処理丈では 他の URL にリダイレクトされる様なページの取得は正しく処理出来ない (WebBrowser コントロールの Url プロパティの値がリダイレクト後の URL と成る為 ) 此の為 一定時間 ( 上記のコードでは 10 秒間 ) 内に done フラグが true に成らない場合には強制的にループを抜ける様にして居る -5-

ポップアップウィンドウの抑制 今回は GUI を持たないアプリケーションでの使用を目的と仕て居るので WebBrowser コントロールが別ウィンドウを開こうとするのを阻止しなければ成らない 此れは 新しいウィンドウが開く直前にシステムに依り呼び出される OnNewWindow メソッドにおいて メソッドのパラメータで渡される CancelEventArgs オブジェクト (System.ComponentModel 名前空間 ) の Cancel プロパティに true をセットする事で可能と成る 亦 デフォルトでは 対象と成る Web ページに実行エラーと成るスクリプト (JavaScript のコード等 ) が含まれて居る場合 スクリプトエラーを示すダイアログが表示されて了う 此れを抑制するには WebBrowse コントロールの ScriptErrorsSuppressed プロパティを true にして置けば良い HtmlDocument オブジェクトと HtmlElement オブジェクト Web ページの取得が完了すれば 其の HTML ドキュメントには Document プロパティからアクセス出来る HTML ドキュメントは HtmlDocument オブジェクト (System.Windows.Forms 名前空間 ) で表され 此れは HTML ドキュメントに含まれる各 HTML 要素を HtmlElement オブジェクト (System.Windows.Forms 名前空間 ) のコレクションと仕て保持して居る ( 此のコレクションは HtmlElementCollection クラス (System.Windows.Forms 名前空間 ) に依り表される ) HtmlElement クラスには親要素や子要素 ( のコレクション ) を示す Parent プロパティや Children プロパティが有り HTML ドキュメントは 1 つのツリー構造で表現されて居る 此の為ツリー構造を辿り乍ら 任意の要素にアクセスする事も出来るが 特定のタグを持つ要素丈を列挙する場合には HtmlDocument オブジェクトの GetElementsByTagName メソッドを使うのが便利で有る GetElementsByTagName メソッドのパラメータには A や IMG と謂ったタグ名を文字列で指定して呼び出す ( 大文字小文字は区別されない ) 此れに依り 其のタグ名を持つ HtmlElement オブジェクトのコレクションが取得出来 其の各要素に付いて GetAttribute メソッドに依りタグの属性値を InnerText プロパティに依り其のタグ内に含まれるテキストを取得出来る -6-

WebBrowser コントロール内の HTML 要素から class 属性の値を取得 前述の WebBrowser コントロールに依り Web ページからリンクや画像を抽出 で示して居る様に WebBrowser コントロール (System.Windows.Forms 名前空間 ) を使えば Web ページを取得して 其処から特定のタグの要素を抜き出すと謂った事が可能で有る 此の様にして取得した HTML 要素は 上記の項でも示して居る様に HtmlElement クラス (System.Windows.Forms 名前空間 ) のオブジェクトと仕て表され 更には 其の GetAttribute メソッドに依り 任意の属性の値も取得出来る 例えば 下記のコードは 変数 e が HtmlElement オブジェクトを参照して居り 其の要素の href 属性の値を取得して居る Dim Href As String = E.GetAttribute( "href" ) ' href 属性の値の取得 string href = e.getattribute( "href" ); // href 属性の値の取得 但し GetAttribute メソッドの利用には 1 つ大きな注意点が有り class 属性の値を取得する場合に限り 其の属性名を classname と記述しなければ成らない Dim C As String = E.GetAttribute( "classname" ) ' class 属性の値の取得 string c = e.getattribute( "classname" ); // class 属性の値の取得 class 属性の値の取得メソッドの引数には classname と指定する必要が有る 猶 GetAttribute メソッドでは属性名の大文字小文字は区別されない 引数に "class" と指定すると 仮令 class 属性が存在して居いても GetAttribute メソッドの戻り値は空文字と成る為 注意が必要で有る 因みに JavaScript の getattribute 関数に於いても IE7 迄は class 属性値を取得するには引数と仕て 'classname' を指定する必要があったが IE8 では Firefox 等の他のブラウザと同様に 'class' と指定出来る様に成って居る ( 猶 WebBrowser コントロールに於ける GetAttribute メソッドの挙動は インストールされて居る IE のバージョンとは関係ない ) -7-

WebBrowser コントロールのコンテンツを文字列に依り設定 Windows フォーム用の WebBrowser コントロール (.NET Framework 2.0 以降で利用可能 ) では Uri プロパティに URL を設定するか URL を引数にして Navigate メソッドを呼び出し ページを表示するのが一般的だが HTML コードの文字列を Web ページと仕て表示する事も可能で有る 此処では其の方法を 2 つ紹介する DocumentText プロパティに依る表示 1 つ目の方法は非常にシンプルで WebBrowser コントロールの DocumentText プロパティに HTML の内容を含んだ文字列をセットする丈で有る 次のサンプルコードでは WebClient クラス (System.Net 名前空間 ) に依り Insider.NET のトップページの HTML を取得し 其れを WebBrowser コントロールに表示して居る ' HTML データの取得 Dim Wc As New WebClient( ) Wc.Proxy = Nothing Wc.Encoding = System.Text.Encoding.GetEncoding( "Shift_JIS" ) Dim Html As String = Wc.DownloadString( "http://www.atmarkit.co.jp/fdotnet" ) WebBrowser1.DocumentText = html // HTML データの取得 WebClient wc = new WebClient( ); wc.proxy = null; wc.encoding = System.Text.Encoding.GetEncoding( "Shift_JIS" ); string html = wc.downloadstring( "http://www.atmarkit.co.jp/fdotnet" ); webbrowser1.documenttext = html; DocumentText プロパティに依り HTML を表示変数 webbrowser1 は WebBrowser コントロールを参照して居る物とする 亦 WebClient クラスを使用して居る為 System.Net 名前空間のインポートが必要で有る WebClient クラスの使い方に付いては オンラインヘルプを参照され度い 猶 当然乍 相対 URL で記述されて居る要素 ( 絶対 URL で記述されて居ない要素 例えば <img src="images/fdotnet_m.gif"> ) に付いては 正しく表示等が行えない OpenNew/Write メソッドに依る表示 今 1 つの方法は WebBrowser コントロールに表示されて居るドキュメントを示す HtmlDocument オブジェクト (Document プロパティから取得出来る ) に対して Write メソッドに依り HTML を書き込む方法で有る メソッドの引数には HTML の内容を含んだ文字列を指定する 此の時 事前に OpenNew メソッドを呼び出す事に依り 現在表示中のドキュメントの内容をクリア出来る 但し アプリケーションの起動直後は WebBrowser コントロールに HtmlDocument オブジェクトが割り当てられて居ない 此の為 下記のサンプルコードの様に Navigate メソッドに依り空白ページに移動する等して WebBrowser コントロールにページ表示をさせる処理が最初に必要と成る -8-

' HTML データの取得 Dim Wc As New WebClient( ) Wc.Proxy = Nothing Wc.Encoding = System.Text.Encoding.GetEncoding( "Shift_JIS" ) Dim Html As String = Wc.DownloadString( "http://www.atmarkit.co.jp/fdotnet" ) ' アプリケーション起動直後はドキュメントが存在しない If WebBrowser1.Document = Nothing Then WebBrowser1.Navigate( "about:blank" ) ' 空白ページを開く End If WebBrowser1.Document.OpenNew( True ) ' クリア WebBrowser1.Document.Write( Html ) ' 書き込み // HTML データの取得 WebClient wc = new WebClient( ); wc.proxy = null; wc.encoding = System.Text.Encoding.GetEncoding( "Shift_JIS" ); string html = wc.downloadstring( "http://www.atmarkit.co.jp/fdotnet" ); // アプリケーション起動直後はドキュメントが存在しない if ( this.webbrowser1.document == null ) { webbrowser1.navigate( "about:blank" ); // 空白ページを開く webbrowser1.document.opennew( true ); // クリア webbrowser1.document.write( html ); // 書き込み Write メソッドに依り HTML を表示変数 webbrowser1 は WebBrowser コントロールを参照して居る物とする 亦 WebClient クラスを使用して居る為 System.Net 名前空間のインポートが必要で有る 猶 OpenNew メソッドの引数には WebBrowser コントロールが保持する履歴の現在のエントリを新しいドキュメントで置き換えるか何うかを指定する 2 つの方法の違い 以上 2 つの方法を示したが DocumentText プロパティに文字列をセットした場合には Navigating Navigated DocumentCompleted 等のイベントが発生するのに対して Write メソッドで文字列を書き込んだ場合には 此等のイベントは発生しない 此れが 2 つの方法の大きな違いと謂える -9-

WebBrowser コントロール内のテキストボックスに文字列をセットする Windows フォームには Windows アプリケーション内に Web ページを表示する為の WebBrowser コントロールが用意されて居る 此の WebBrowser コントロールでは 指定したページへの移動や 戻る 進む等のブラウザと同様の操作に加え コントロールで表示されて居るドキュメント内の要素をプログラムから操作する事も可能で有る 本稿では WebBrowser コントロールに表示されて居る入力フォーム内のテキストボックスにプログラムから値を入力し 更に 其のフォームをサブミット ( フォームの内容を送信 ) する 或いはフォームに有るボタンをクリックする方法を紹介する 此の方法に依り Web アプリケーションのテストや Web アプリケーションへの自動ログイン等が可能に成る Google の検索ページを操作するサンプルプログラム 此処では最初に 本稿で作成するサンプルプログラムの動作を説明する 此れは 3 つのボタンと 1 つの WebBrowser コントロールを配置した Windows アプリケーション ( 下図参照 ) で 此等 3 つのボタンで Google の検索ページを操作する 具体的には プログラム起動時に Google の検索ページが表示され 此処で [ 検索語の入力 ] ボタン ( 下図の 1 ) をクリックすると ページに表示されて居るテキストボックスに と謂う文字列が自動的に入力される 更に 2 或いは 3 のボタンをクリックすると 検索が実行されて検索結果ページが表示される [ 検索語の入力 ] ボタン ( 1 ) をクリック -10-

[ フォームのサブミット ] ボタン 2 か [[ Google 検索 ] ボタンのクリック ] ボタン 3 をクリック -11-

此の様にプログラムから Web ページを操作する場合 事前に其の HTML のソースをチェックして 操作対象と成る HTML 要素を明確にして置く必要が有る Google の検索ページのソースを見ると フォームの定義部分で次の様な記述を見付ける事が出来る <form action="/search" name=f > <input name=q size=55 value="" > <input name=btng type=submit value="google 検索 " > Google の検索ページ内のフォーム定義部分 ( 抜粋 ) 此の記述から フォーム (<form> 要素 ) には f と謂う名前 (name 属性 ) が付けられて居り 亦テキストボックス (<input> 要素 ) には q [Google 検索 ] ボタン ( サブミット ボタン type=submit と謂う属性が付いて居る <input> 要素 ) には btng と謂う名前が付けられて居る事が分かる 以上が確認出来れば それぞれの名前で各 HTML 要素を検索し 其れを外部から操作する事が可能に成る 3 つのボタンのイベントハンドラの内容 Web ページの表示内容は HTML 要素 (HTML タグ ) の集まりで有るが WebBrowser コントロールのドキュメント上では 此等の要素は HtmlElement クラス (System.Windows.Forms 名前空間 ) のオブジェクトで表される 亦 HtmlElement オブジェクトのコレクションと仕て HtmlElementCollection クラス (System.Windows.Forms 名前空間 ) が定義されて居る 一方 WebBrowser コントロールのドキュメントは HtmlDocument クラス (System.Windows.Forms 名前空間 ) のオブジェクトで表され 此れは WebBrowser コントロールの Document プロパティから取得出来る 然して 其の All プロパティからは ドキュメント内の全要素を含んだ HtmlElementCollection オブジェクトを取得出来る 以上を踏まえた上で 上記サンプルプログラムの 3 つの操作の内容を次に示す 猶 上記サンプルプログラムでは WebBrowser コントロールをフォームに配置する際に 其の Url プロパティに http://www.google.co.jp をセットして 起動時に Google の検索ページが開く様にして居る テキストボックスに文字列をセット 特定のテキストボックスに文字列をセットするには 其のテキストボックスを表す HtmlElement オブジェクトを取得し 其れに含まれるテキストを InnerText プロパティに依り設定する事が出来る 従って 上記サンプルプログラムの [ 検索語の入力 ] ボタンのイベントハンドラは次の様に成る Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles Button1.Click Dim All As HtmlElementCollection = WebBrowser1.Document.All Dim Forms As HtmlElementCollection = All.GetElementsByName( "q" ) Forms( 0 ).InnerText = "c#" ' テキストボックスに を入力 private void button1_click( object sender, EventArgs e ) { HtmlElementCollection all = webbrowser1.document.all; HtmlElementCollection forms = all.getelementsbyname( "q" ); forms[ 0 ].InnerText = "c#"; // テキストボックスに を入力 -12-

GetElementsByName メソッドは コレクションで有る HtmlElementCollection オブジェクトから 特定の名前を持つ要素を取得する為の物で有る 複数の要素が同じ名前を持つ可能性が有る為 此のメソッドの戻り値も HtmlElementCollection オブジェクトと成る 此のコードでは q と謂う名前の要素は 1 つと謂う前提で記述して居るが 通常はプロパティにアクセスする前に コレクションの要素数をチェックす可きで有る フォームのサブミット フォームのサブミットでは 上記と同様に 先ず 要素名からフォームを表す HtmlElement オブジェクトを取得する 然して "submit" と謂う引数で InvokeMember メソッドを呼び出せば良い コードは次の様に成る Private Sub Button2_Click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles Button2.Click Dim All As HtmlElementCollection = WebBrowser1.Document.All Dim Forms As HtmlElementCollection = All.GetElementsByName( "f" ) Forms( 0 ).InvokeMember( "submit" ) ' フォームのサブミット private void button2_click( object sender, EventArgs e ) { HtmlElementCollection all = webbrowser1.document.all; HtmlElementCollection forms = all.getelementsbyname( "f" ); forms[ 0 ].InvokeMember( "submit" ); // フォームのサブミット [ フォームのサブミット ] ボタン (2) のイベントハンドラ ボタンのクリック 上記の様にフォームを直接サブミットする代わりに サブミットボタンをクリックしてもフォームをサブミット出来る ボタンをクリックするには 其のボタンの HtmlElement オブジェクトを取得し "submit" と謂う引数で InvokeMember メソッドを呼び出す Private Sub Button3_Click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles Button3.Click Dim All As HtmlElementCollection = WebBrowser1.Document.All Dim Forms As HtmlElementCollection = All.GetElementsByName( "btng" ) forms( 0 ).InvokeMember( "click" ) ' ボタンのクリック private void button3_click( object sender, EventArgs e ) { HtmlElementCollection all = webbrowser1.document.all; HtmlElementCollection forms = all.getelementsbyname( "btng" ); forms[ 0 ].InvokeMember( "click" ); // ボタンのクリック [[ Google 検索 ] ボタンのクリック ] ボタン (3) のイベントハンドラ -13-

HTML 要素の其他の探し方 今回は name 属性の値が事前に解って居た為 GetElementsByName メソッドに依り HTML 要素のオブジェクトを特定した name 属性ではなく id 属性が付けられて居る場合には id 属性の内容で HTML 要素を検索する GetElementById メソッドが使える ( 下記は id="username" を取得する例 ) Dim UsernameTextbox As HtmlElement = _ webbrowser1.document.getelementbyid( "username" ) HtmlElement usernametextbox = webbrowser1.document.getelementbyid( "username" ); HTML 要素に name 属性や id 属性が付けられて居ない場合には GetElementsByTagName メソッドを使って HTML 要素のタグ名から検索する方法が有効で有る (<button> 要素を取得する例 ) Dim Buttons As HtmlElementCollection = _ webbrowser1.document.getelementsbytagname( "button" ) HtmlElementCollection buttons = webbrowser1.document.getelementsbytagname( "button" ); 此の場合には 通常複数の HTML 要素が見付かる為 HTML 上での並び順や 属性の値 (GetAttribute メソッドに依り属性名から其の値を取得可能 ) を手掛かりにして HTML 要素を絞り込む必要が有る WebBrowser コントロールで選択されて居る文字列をコピーする WebBrowser コントロールの HTML ドキュメントに対する操作は 前述の WebBrowser コントロールに依り Web ページからリンクや画像を抽出 の最後で示して居る様に ドキュメント内の特定の HTML 要素を取得してから行う事が多いが 此れとは別に 現在のドキュメントに対してコマンドを実行すると謂う方法を採る場合が有る コマンドの実行には WebBrowser コントロールの Document プロパティから HtmlDocument オブジェクト (System.Windows.Forms 名前空間 ) を取得し 其の ExecCommand メソッドを呼び出して行う WebBrowser コントロールに表示されて居る HTML ドキュメントに於いて 現在選択されて居る文字列のクリップボードへのコピーは Copy コマンドで可能で有る 此れは次の様なコードに依り実行する webbrowser1.document.execcommand( "Copy", False, Nothing ) webbrowser1.document.execcommand( "Copy", false, null ); ExecCommand メソッドの第 2 引数にはコマンド固有のダイアログを表示するか何うかを 第 3 引数にはコマンドに必要なパラメータを指定するが 此等が使用されるか何うかはコマンドの種類に依って異なる Copy コマンドの場合には 孰れも使用されない 猶 ExecCommand メソッドで実行可能なコマンドの一覧は MSDN の Command Identifiers に記載されて居る Copy コマンド以外では Web ページを保存する SaveAs や Web ページの印刷を行う為の Print 等が比較的良く使用される様で有る -14-

Firefox の描画エンジン (Gecko エンジン ) で Web ページを表示 前述の Windows アプリケーションで Web ページを表示する では Windows フォーム上に Web ブラウザコントロールを配置する方法を紹介して居る Web ブラウザコントロールとは Web ページを表示する為のコントロールで 此の項では WebBrowser コントロール (System.Windows.Forms 名前空間 ) と謂う.NET Framework 2.0 に含まれる Windows フォームコントロールを利用して居る 此の WebBrowser コントロールは ( 其の内部で )Web ページの描画に IE(Internet Explorer) のレンダリングエンジンを利用する 併し 最近では世界全体で Firefox が約 15% 迄ブラウザシェアを伸ばして来て居り ( 参考 :Market Share : Browser Market Share for September, 2007) レンダリングエンジンにも Firefox と同等の物 ( Gecko エンジン と呼ばれる ) を使い度いと謂うニーズも少なくないだろう ( 例えば 国内で人気の高いカスタムブラウザ Sleipnir にも Gecko レンダリングのモードが有る ) 其処で 此処では Firefox で使われて居る Gecko エンジンに依るレンダリングが行える Web ブラウザコントロールの利用方法を紹介する Gecko エンジンの Web ブラウザコントロールを利用 実は Firefox で使われて居る Gecko エンジンは Firefox 本体と静的にコンパイルされて居る為 其の儘外部から利用する事が出来ない Firefox のソースコードから Gecko エンジンを抜き出す事も不可能では無いと思うが 現実的に考えて其れでは余りにも手間が掛かり過ぎる 其れでは もっと手軽に Gecko エンジンを利用する方法は無いのだろうか Gecko エンジンは 様々なプロジェクトで活用されて居る 例えば Firefox 丈でなく Netscape(Web ブラウザ ) や Thunderbird( メールクライアント ) SeaMonkey( インターネット統合アプリケーション *1) XULRunner(XUL アプリケーションのランタイムパッケージ *2) 等で有る 此等の内 SeaMonkey や XULRunner では Gecko エンジンの ActiveX コントロール版が同梱されて居るので 此の ActiveX コントロールを利用すると謂う方法が有る 1 此のインターネット統合アプリケーションには タブ方式の Web ブラウザ メールクライアント WYSIWYG 形式の HTML 編集ツール等が含まれて居る 2 XUL は XML ユーザーインターフェイス言語 を意味し Mozilla に依りデスクトップアプリケーション開発の為に提供されて居る XULRunner は Gecko エンジンを利用するランタイム環境の為 ( 新 )GRE(Gecko Runtime Environment) とも呼ばれる ( 因み 新 GRE に対して Mozilla Application Suite の一部が 旧 GRE と呼ばれて居る ) 詰まり 例えば XULRunner をクライアント環境にインストールすれば 其の ActiveX コントロールを利用して Gecko エンジンに依る Web ページレンダリングが実現出来ると謂う訳で有る 以下では 此の方法に付いて説明する XULRunner のインストール 先ずは 最新の XULRunner をインストールする事にする 此れは 下記の FTP サイトで入手する事が出来る XULRunner の Nightly ビルドの最新版 上記のサイトで xulrunner-*.***.en-us.win32.zip ( 本稿執筆時点での最新バージョンは xulrunner-1.9a9pre.en-us.win32.zip) をダウンロードして.zip ファイルに格納されて居る xulrunner フォルダを 任意の場所 ( 本稿の例では D: xulrunner ) に展開する -15-

此の中に含まれる mozctlx.dll が Gecko エンジンの Web ブラウザコントロール (ActiveX 版 ) で有る 拠って 此の ActiveX コントロールを regsvr32.exe*3 を使って レジストリに登録する 此れには コマンドプロンプトを立ち上げ ( 此れには 例えば [ スタート ] メニューから [ ファイル名を指定して実行 ] を表示して cmd を入力して実行する ) 本稿の例では 次の様なコマンドを入力すれば良い regsvr32 D: xulrunner mozctlx.dll Gecko エンジンコントロール (ActiveX 版 ) をシステムに登録するコマンド 3 regsvr32 は Windows に付属するコンソールプログラムで ActiveX 等の COM コンポーネントをシステムに登録する際に使う コマンドライン引数に COM コンポーネント (.DLL ファイル ) へのパスを指定すれば登録される 猶 登録を解除するには /u オプションを付加して呼び出せば良い 以上で XULRunner のインストールは完了で有る Visual Studio での ActiveX コントロールの活用 ActiveX コントロールがインストール出来れば 後は通常の ActiveX コントロールを利用するのと同じ手順で有る 一応 念の為 其の手順を画面で示して置く 猶 以下では Visual Studio 2005 を利用して居る 亦 以降では ActiveX コントロールの Gecko エンジン Web ブラウザコントロール は AxMozillaBrowser と表記 先ずは ツールボックスに AxMozillaBrowser のアイコンを追加する 此れには ツールボックス上で右クリックして 表示されるコンテキストメニューから [ アイテムの選択 ] をクリックする 然うすると 次の様な [ ツールボックスアイテムの選択 ] ダイアログが表示される [ ツールボックスアイテムの選択 ] ダイアログの [COM コンポーネント ] タブを開き MozillaBrowser Class ( パスは本稿の例では D: xulrunner mozctlx.dll と成って居る ) を選択して [OK] ボタンをクリックする 此れに依り [ ツールボックス ] に MozillaBrowser Class と謂うコントロールが追加される 此処で 更に解り易い様に MozillaBrowser Class から AxMozillaBrowser 等に [ アイテム名の変更 ] をしても良い 以上で Visual Studio の Windows フォームデザイナ上に AxMozillaBrowser を配置可能に成る 次の画面は実際に AxMozillaBrowser を Windows フォーム上に配置して 其の Doc プロパティに Fill を指定した処で有る -16-

上記の画面の手順で Windows フォーム上に配置する処迄出来た 後は AxMozillaBrowser コントロールの Navigate メソッドを呼び出せば 其のブラウザコントロール内に好きな URL の Web ページを表示出来る メソッドの第 1 パラメータに URL を指定する 例えば フォームの Load イベントハンドラで @IT/Insider.NET のトップページを表示するには 次の様なコードに成る Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles MyBase.Load AxMozillaBrowser1.Navigate( "http://www.atmarkit.co.jp/fdotnet/" ) private void Form1_Load( object sender, EventArgs e ) { axmozillabrowser1.navigate( "http://www.atmarkit.co.jp/fdotnet/" ); 此れを実行すると 右の画面の様に成る 此の例では @IT/Insider.NET のトップページが Gecko レンダリングに依って表示されて居る -17-