none
C#でのWebブラウザでのWebアクセスについての質問です。 RRS feed

  • 質問

  • VisualC#2010、Windows7での動作について質問があります。

    (1)このmsdnへのログインを自動化したいと考えました。

    string msdnloginURL = "https://login.live.com/login.srf?wa=wsignin1.0&wtrealm=social.msdn.microsoft.com&wreply=https%3a%2f%2fsocial.msdn.microsoft.com%2fForums%2fja-JP%2fcsharpgeneralja%2fthreads%3fstoAI%3d10&wp=MBI_FED_SSL&wlcxt=Msdn%24Msdn%24Msdn";
    string[] msdnlogin = { "login", "passwd" };
    string[] msdnID = { "ID", "PW" };

    private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)        {
    string URL = webBrowser.Url.ToString();
    HtmlElementCollection HE = webBrowser.Document.All;
    for (int i = 0; i < msdnlogin.Length; i++){
    HtmlElementCollection logins = HE.GetElementsByName(msdnlogin[i]);
    logins[0].InnerText = msdnID[i];
    }
    HtmlElementCollection submitbutton = HE.GetElementsByName("SI");
    if (submitbutton.Count != 0) submitbutton[0].InvokeMember("click");
    }

    のようにコードを書いたところ、IDは入ったのですが、PWを入力できません。

    HtmlElement password = webBrowser.Document.GetElementById("idDiv_PWD_PasswordTb");
    password.InnerText = msdnID[1];

    HtmlElementCollection inputs = webBrowser.Document.GetElementsByTagName("input");
    foreach (HtmlElement input in inputs)
    if (input.OuterText.Contains("passwd")) input.InnerText = msdnID[1];

    などのように、IDやTagNameで検索してもダメでした。
    どのようにすればよいかご教示いただけないでしょうか。

    (2)港区の図書館の検索を自動化しようとしています。
    http://www.lib.city.minato.tokyo.jp/j/searchsubmenu.html
    にアクセスして、文字を入力するところはほぼ上記と同様にしてできたのですが、検索語がヒットしないときに、「Webページからのメッセージ 該当する書誌がありません」というポップアップウィンドウが開きます。
    このポップアップウィンドウをキャンセル方法はありませんか?

    this.webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);

    というイベントを作り、
    void webBrowser_NewWindow(object sender, CancelEventArgs e){
    WebBrowser wb = sender as WebBrowser;
    string eventstring = e.ToString();
    }
    のようにしてイベントをキャンセルできるのか確かめてみたのですが、そもそもこのイベントが発火しないみたいです。
    よろしくご教示ください。


    • 編集済み NewTower 2012年7月22日 12:38 mistake
    2012年7月22日 12:35

すべての返信

  • (1) まず解析しようとしているHTMLを具体的に挙げてください。 "login", "passwd" で合っているのですか?

    (2) このポップアップはWebページではなく、そのために当然ながらNewWindowイベントは発生しません。見たところJavaScriptのalert()関数です。

    いずれにせよ、Webブラウザーをどうこうする前に、Webブラウザーの中で扱われているHTML / JavaScriptを理解することが先決だと思います。

    2012年7月22日 23:49
  • > のようにコードを書いたところ、IDは入ったのですが、PWを入力できません。

    不必要に複雑なコードを書いているからではないですか?

    login, passwd, SI という name 属性が、動的に変わったり、一意でないということ
    でなければ以下のようにしてログインできるはずです。

    HtmlElement login = webBrowser1.Document.All.GetElementsByName("login")[0];
    HtmlElement passwd = webBrowser1.Document.All.GetElementsByName("passwd")[0];
    login.InnerText = "ユーザー ID(メールアドレス)";
    passwd.InnerText = "パスワード";
    HtmlElement signin = webBrowser1.Document.All.GetElementsByName("SI")[0];
    signin.InvokeMember("click");

    > このポップアップウィンドウをキャンセル方法はありませんか?

    こちらの方は、佐祐理さんが書かれてているように、JavaScript の alert なので、
    JavaScript を無効にする以外方法はなんさそうです。

    WebBrowser でどうすれば JavaScript が無効にできるかは、自分は分かりません。

    2012年7月23日 13:41
  • New Towerさん

    お疲れ様です。曹です。
    Quiz1ですが、Live IDで登録する場合、Microsoftのauthorization codeが必要らしいです。
    詳しくは下記の資料(日本語)をご参照ください。
    http://msdn.microsoft.com/ja-jp/library/hh243649.aspx

    Source Code例があります。
    http://social.msdn.microsoft.com/Forums/en-US/messengerconnect/thread/cd769425-6332-4310-85d9-3d6ceafa10b7/

    以上です。

    • 回答の候補に設定 山本春海 2012年8月15日 7:38
    2012年7月24日 11:52
  • .NET Framework の WebBrowser コントロールに JavaScript を無効
    にするような機能は見つかりませんでしたが、ググって調べたら以下
    のページが見つかりました。

    Microsoft Web Browserコントロールのセキュリティを制御する
    http://codezine.jp/article/detail/246

    COM 相互運用で提供されている機能を利用して COM ラッパーを生成
    し、それを通じて ActiveX を操作できるように WebBrowser コント
    ロールを拡張すれば、JavaScript をプログラムで無効にすることは
    可能なようです。(検証はしてませんが)

    でも、JavaScript を無効にすると、そのページ全体がうまく動かな
    くなるかの知れませんので、注意してください。

    2012年7月24日 13:02
  • ピンポイントで、よくわかっていなくて回答します。

    alert関数を無効化したいだけなら、ページ遷移後にalert関数を上書きで定義してしまえばいいだけかもしれません。

    Microsoft.mshtmlへの参照が必要です。

    webBrowser1.Navigated += (_s, _e) =>
            {
                var w = (WebBrowser) _s;
                var label = w.Document.CreateElement("label");
                label.Id = "message";
                w.Document.Body.AppendChild(label);
    
                var script = w.Document.CreateElement("script");
                var scriptDom = (IHTMLScriptElement) script.DomElement;
                scriptDom.text = 
    @"function alert(message) { 
        document.getElementById('message').innerHTML = message;
    }";
                w.Document.Body.AppendChild(script);
            };
    

    2012年7月25日 1:16
  • webbrowser コントロールの alert 制御については

    > webBrowserでjavascriptで書かれたalertを表示させない方法はありませんか
    > http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/a82432f4-145f-452f-b1a7-ed4defe91a85

    こちらにもいくつか話題があります。


    2012年7月25日 3:54