質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.23%

  • C#

    5026questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Webサイト

    820questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

C#のWebBrowserコントロールで、webページ上のログインボタンを押させる方法が分かりません

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 72

yusuke0424

score 2

目標

あるwebページに「ユーザ名とパスワードを自動入力しログインボタンを押す」という処理を行いたいと思っています。
環境はVisual Studio C#、.NET Frame Work 4.5で、フォームにWebBrowserコントロールを配置し処理をしたいと考えています。

問題点

webページにアクセスし、テキストボックスに入力させるまではできたのですが、どうやらテキストボックス上をマウスでクリックした際は問題なくログインボタンが有効化されるものの、テキストボックスにただ文字列を入れただけではログインボタンは押せない(その際、ボタンの上にカーソルを持っていくと赤い禁止のマークが出てクリックできない)のです。

該当のソースコード

                HtmlElementCollection all = webBrowser1.Document.All;
                HtmlElementCollection forms_un = all.GetElementsByName("user");
                forms_un[0].InnerText = textBox1.Text; // テキストボックスにユーザ名を入力
                HtmlElementCollection forms_pw = all.GetElementsByName("passwd");

                //webBrowser1.PreviewKeyDown();
                forms_pw[0].InnerText = textBox2.Text; // テキストボックスにパスワードを入力


                HtmlElementCollection buttons = all.GetElementsByName("login_form");

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


このコードを実行すると、スクリプトエラー

ライン:1
文字:1
エラー:メンバーが見つかりません
コード:0
URL:

となり実行できません。

試したこと

テキストボックスやボタンについて

forms_pw[0].Focus();
forms_pw[0].Enabled = true;


などを加えてみましたが、できませんでした。また、先程の状態からテキストボックスどちらかをクリックするだけでログインボタンは押せるようになるので、何かの処理が足りないのではないかと考えております。
通常はクリックでなくとも、Tabキーなどでもログインボタンは押せるようになるようです。

補足情報

ログインボタンは読み込み時は

<input name="ok" disabled="disabled" class="buttonFixed" id="submit" type="submit" value="Login">


ですが、ボタンが押せる状態になると

<input name="ok" class="buttonFixed" id="submit" type="submit" value="Login">


となるようです。
ご教示のほどよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2017/12/23 22:46

    ボタンが有効になる条件はわかっているのですか?

    キャンセル

  • yusuke0424

    2017/12/23 22:52 編集

    ユーザ名とパスワードがそれぞれ1文字以上入力されていることと、いずれかはマウスでのクリックやTabキーによる操作がないとやはりボタンは有効にはならないようです

    キャンセル

回答 2

+2

こんにちは。

おそらくJavaScriptで入力状態のチェック、ボタンの有効化を行っていますよね。
関数化されてそうであれば、InvokeScriptで呼んでみてはどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/24 01:40 編集

    回答をいただきありがとうございました。
    ご指摘をいただいた、javascriptからの呼び出しですが、やってみたところ特に変化なしでした。
    しかし、実際にページ内にはscriptが関数化された状態で存在したため、外面には変化がないだけで裏ではログイン処理が完了している可能性がありました(通常はログイン成功後はランダムなアドレスにリダイレクトされるため、推測です)。

    キャンセル

check解決した方法

0

エラーが出てきていた原因ですが、

HtmlElementCollection buttons = all.GetElementsByName("login_form");


において、名前の指定の仕方がそもそも間違っており、正しくは

HtmlElementCollection buttons = all.GetElementsByName("ok");


でした。これは以前使っていたシステムからコードをそのまま流用してきていたためであり、私の試行と確認不足でした。ここでの「ok」はログインボタンのinputでのname="ok"によります。

またsubmitについてですが、これは調べたところデータだけを送信するものでクリックしているわけではないということでした。ただ、これは以前のシステムでは問題がなかったものです。

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


は こちら を参考にHTMLコードにあったdisableを無効化する処理を追加したところクリックだけでログインできるようになり、 こちら を参考に「クリックをする」コードに書き直しました。
最終的には次のようになりました。

                await Task.Delay(3000);//読み込み待ち
                HtmlElementCollection all = webBrowser1.Document.All;
                HtmlElementCollection forms_un = all.GetElementsByName("user");
                forms_un[0].InnerText = textBox1.Text;
                forms_un[0].Focus();
                forms_un[0].Enabled = true;


                HtmlElementCollection forms_pw = all.GetElementsByName("passwd");
                forms_pw[0].InnerText = textBox2.Text;
                forms_pw[0].Focus();
                forms_pw[0].Enabled = true;

                dynamic document = webBrowser1.Document.DomDocument;
                document.querySelector("input[type=submit]").disabled = false;
                await Task.Delay(1000);
                HtmlElementCollection buttons = all.GetElementsByName("ok");

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


また回答からご指摘いただいた通り、ページ内にはjavascriptもあり、ログインボタンをクリックした際の動作と思われる内容も記述されていました。しかし、通常はログイン後にランダムなアドレスにリダイレクトされるため推測の域を出ません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • C#

    5026questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Webサイト

    820questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • トップ
  • C#に関する質問
  • C#のWebBrowserコントロールで、webページ上のログインボタンを押させる方法が分かりません