2011年2月6日日曜日

Internet Explorerの自動操作

C#を使ってInternet Explorerを自動操作します.

※もちろん.NET Frameworkの使える言語ならC#以外でも同じことが行えるはずです.

まず,次の2つのファイルへの参照を追加します.どちらもC:\Windows\System32にあると思います.

  • mshtml.tlb
  • shdocvw.dll

IEの自動化に使うクラスは,InternetExplorer ObjectInterfaces and Scripting ObjectsのリストにあるIHTML*というクラス達になります.

データ型のよくわからないオブジェクトを沢山扱うことになりますので,dynamicキーワードを使うと便利です.こちらの記事を必ず確認して下さい.

後は,簡単な使い方をメモしておきます.

  • インターネット・エクスプローラを起動・終了を行う.
    SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
    ie.Visible = true;
    ie.Quit();
  • ページの移動を行う.
    ie.Navigate("http://www.bing.com/");
    ページ移動の完了を知るにはie.NavigateComplete2イベントをキャッチ.
  • リンクを探して押したい.
    foreach (dynamic link in ie.Document.links)
    {
        if (link.href == "http://jp.msn.com/")
        {
            link.click();
            // ie.Navigate(link.href); という方法もある
             break;
        }
    }
  • フォームを自動入力したい.
    foreach (dynamic form in ie.Document.forms)
    {
        if (form.action == "/search")
        {
            foreach (dynamic element in form.Descendants)
            //Descendantsはchildrenプロパティを使って自分で実装します
             {
                switch ((string)element.getAttribute("name"))
                {
                    case "q":
                        element.setAttribute("value", "テスト");
                        break;
                    case "go":
                        element.click();
                        return;
                }
            }
        }
    }

2 件のコメント:

  1. こんにちは てんてんと申します。

    NavigateComplete2の
    イベントをキャッチするサンプルがあるとすごく助かります。

    返信削除
  2. >てんてんさん
    バタバタしていて返信が遅くなってしました.すいません

    イベントをキャッチする方法についてはMSDN等が参考になると思います.
    また,イベントの発生するタイミングはIE コンポーネントにおけるイベントの発生順序に分かりやすいまとめを発見しました.

    最後に,この記事のサンプルですが,dynamicは使わない方が良いです.(dynamicとCOMとメモリ リーク
    私の不注意で修正するのを忘れていました.

    返信削除