none
webbrowserのボタンクリック方法について RRS feed

回答

  • this.webBrowser1.Navigateでスクリプト実行エラーが出ましたが、これは別問題として

    上記コードでサブミットアクションしましたよ。

    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
        this.webBrowser1.Navigate(@"http://search.ameba.jp");
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
        HtmlElementCollection forms = webBrowser1.Document.GetElementsByTagName("form");
        forms[0].InvokeMember("submit");
      }
    }
    
    

    • 回答としてマーク taokato 2011年2月9日 6:11
    2011年2月9日 4:33

すべての返信

  • InvokeMemberより前のコードはどうなっているのでしょうか。

    対象のサイトを見てみましたけど、検索ボタンの属性として、IDもNameもないので、

    GetElementsByTagName("button")で要素コレクションを取得して、

    取得コレクションをループして、.GetAttribute("value") == "検索" の要素に

    対してInvokeMember("click")する感じかなと思います。

     

    似たような例が、参考にされているページの一番下 にあります。

     

    訂正:submitではなくclick

    • 編集済み honefai 2011年2月8日 7:49 修正
    2011年2月8日 7:29
  • >このソースなら一見、InvokeMember("submit")で出来そうだったのですが、ダメでした。

    どの要素に対して submit の実行を試みましたか?

    submit を実行する対象は、form 要素であるべきです。

    2011年2月8日 7:32
    モデレータ
  • 何らかの内容を含む(終了タグが存在し、タグに挟まれた部分に何らかの文字が存在する状態)

    BUTTON要素に対してGetAttribute("VALUE")を実行すると、

    BUTTON要素のVALUE属性ではなく要素の内容を取得するみたいですね。

    他の属性はtypeかclassですが、classの場合はclassNameで取得する必要がある点が注意点でしょうか。

    (IE8、.NET 4、Windows XP sp3 以外だと違う動作をするかもしれません)

    2011年2月8日 8:35
  • お返事、ありがとうございます。

    >InvokeMemberより前のコードはどうなっているのでしょうか。

           private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                HtmlElementCollection all = webBrowser1.Document.All;
                HtmlElementCollection forms = all.GetElementsByName("q");
                forms[0].InnerText = @"携帯"; // テキストボックスに「C#」を入力
                //value指定の場合 click
                //HtmlElementCollection buttons = all.GetElementsByName("btnG");
                //foreach (HtmlElement element in buttons)
                //{
                //    if (element.GetAttribute("value") == "Google 検索")
                //    {

                //        element.InvokeMember("click");

                //    }
                //}

                HtmlElementCollection buttons = all.GetElementsByName("target");
                foreach (HtmlElement element in buttons)
                {
                    if (element.GetAttribute("value") == "blog")
                    {

                        element.InvokeMember("click");
                        //forms[0].InvokeMember("submit"); // フォームのサブミット

                    }
                }


            }

     .GetAttribute("value") == "検索" も、試してみましたがダメでした。 

    GetElementsByTagName("button")で要素コレクションを取得してもダメでした。

    clickも、試してみたんですけれど・・・

    何が、悪いんだろう?

    2011年2月8日 8:37
  • お知らせを受けて、次のコードでも実験しました。

                HtmlElementCollection buttons = all.GetElementsByName("from");
                foreach (HtmlElement element in buttons)
                {
                    if (element.GetAttribute("value") == "検索")
                    {

                        //element.InvokeMember("click");
                        forms[0].InvokeMember("submit"); // フォームのサブミット

                    }
                }

    しかし、反応なし。

    扱おうとしているサイトに、問題があるのでしょうか?

    2011年2月8日 8:45
  • clickしようとしている要素はボタンじゃないですね、input type="hidden"の要素みたいです。

    GetElementsByName("target");でなく、GetElementsByTag Name("button");で、、

    element.GetAttribute("value") == "blog"を、 =="検索" に変えれば動作しますか?

     

    追記:

    m.yoshinoさんの記述によれば動作しない可能性もあるので、(この場合ボタンが子要素を持つ)

    渋木さんのおっしゃるようなForm要素のサブミットの方がいいかもしれませんね。

    HtmlElementCollection forms = webBrowser.Document.GetElementsByTagName("form");
    forms[0].InvokeMember("submit");
    

    • 編集済み honefai 2011年2月8日 8:56 追記
    2011年2月8日 8:50
  • HtmlElementCollection forms = webBrowser.Document.GetElementsByTagName("form");
    forms[0].InvokeMember("submit");
    
    
    このやり方と、GetElementsByTag Name("button");でも試してみましたが反応がありません。
    もう、何が何だか、さっぱり判らなくなってしまいました。 (ToT)
    2011年2月9日 2:47
  • this.webBrowser1.Navigateでスクリプト実行エラーが出ましたが、これは別問題として

    上記コードでサブミットアクションしましたよ。

    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
        this.webBrowser1.Navigate(@"http://search.ameba.jp");
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
        HtmlElementCollection forms = webBrowser1.Document.GetElementsByTagName("form");
        forms[0].InvokeMember("submit");
      }
    }
    
    

    • 回答としてマーク taokato 2011年2月9日 6:11
    2011年2月9日 4:33
  • サブミットアクションを確認できました!!

    forms[0]の変数名を、別で宣言していたものとダブっていました。 → バグだった m(_ _)m

    お騒がせをして申し訳ございません。

    ありがとうございました。

    2011年2月9日 6:11