🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

1588閲覧

C# Winformデスクトップアプリ内で開くブラウザのHTMLソースが拾えない

neji-thon

総合スコア7

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2020/12/22 05:58

編集2020/12/22 10:30

Visual Studio 2019にてWindowsフォームでwebBrowserを使って自動ログインを試みていますが、うまくいかず、基本的にソースが取れるかどうかから試していますが、うまくいきません。

```ここに言語を入力

private async void sleepAsync(int time)
{
await Task.Delay(time);
}

private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate("http://google.com"); while ((webBrowser1.IsBusy) || (webBrowser1.ReadyState != WebBrowserReadyState.Complete)) { Application.DoEvents(); sleepAsync(1000); } HtmlElementCollection ALL = webBrowser1.Document.All; MessageBox.Show(ALL); }
ALLの中には以下の1行が入るだけです。 System.Windows.Forms.HtmlElementCollection ソースすべてを取得するには以下の1行で行けると思ってましたが、何が問題なのでしょうか。 HtmlElementCollection ALL = webBrowser1.Document.All; 恐れ入りますが、ご教示いただけますと幸いです。 よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/22 08:38 編集

コードは ``` と ``` で囲ってください(``` はバッククオート 3 つ)。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 赤の他人の閲覧者・回答者はなおさらです。読んでもらわないと話が始まらないのですから、読んでもらえる努力をしませんか?
neji-thon

2020/12/22 10:31

失礼しました。コードを見やすくできたと思います。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/12/22 11:47

WebBrowser.DocumentCompleted イベント のハンドラで試してみてはいかがですか? 質問に書いてあったコード、 while ((webBrowser1.IsBusy) || (webBrowser1.ReadyState != WebBrowserReadyState.Complete)) { Application.DoEvents(); sleepAsync(1000); } は、はっきり言って問題外だと思います。
neji-thon

2020/12/22 20:06 編集

ご教示ありがとうございます。 WebBrowser.DocumentCompletedのイベントを入れて見た目上でもWebサイトが表示されてからMessageBoxがでているものの、結果は変わらずでした。 その表示されたサイト上で右クリックでソースは表示可能です。 設置してるのはForm1_LoadでURLを開く1行と webBrowser1_DocumentCompletedでHtmlElementCollection ALLとMessageBoxの2行だけでその他は混乱しないよう、すべて削除して余計なことはせずシンプルな状態でも試しました。 テスト用にローカルに1行だけtestと書いたページを表示させても結果は同じでした。。 Document.Bodyというのも試しても結果は同じでした。 何かほかに手段はございますでしょうか。
退会済みユーザー

退会済みユーザー

2020/12/22 22:24

> HtmlElementCollection ALL = webBrowser1.Document.All; > MessageBox.Show(ALL); ALL の中身を見たいということであればそれではダメです。デバッガを使ってローカル変数 ALL を展開して中を見てください。 ところで、アクセスする先のサイトの管理者に許可を得ていますか? クローラを作ってどこかの図書館のサイトにアクセスしたら、業務妨害とかで逮捕されたという事例もありますので、軽く考えない方がいいと思います。
neji-thon

2020/12/23 03:48 編集

MessageBoxで出力ためしてるので同じかなと思いつつ、代わりにファイルへ出力させても結果は同じでした。 また、ブレークポイントをいくつも変更してオンマウスでALLの値を確認してみましたが、 ALLには以下の1行しか入りません。 System.Windows.Forms.HtmlElementCollection ちなみにyahooとgoogleで試してましたが、アクセス許可はとっていなかったのと根本的にHTMLタグが取れないのが問題なのでローカルにhtmlを置き、そのファイルをアクセスするように変更しています。 Visual Studio標準のブラウザはセキュリティ的にも問題があるのでCefSharpに乗り換えないとだめかなと思っていましたが、情報が少ないかもと思って、できれば古くからあるものをと考えていました。 まさかとは思い、踏み込んでテスト用HTMLにタグを書き込み、GetAttributeでclassName指定するなどしてALL変数から抜き出せるかも試しましたが、HTMLのソースにはあっても、何も取得できない状態です。 CefSharp側だとjavascriptでソース取得や操作するようなのでまた勉強が必要ですが、やり方は異なるのでそちらでチャレンジしてみます。 もし、以下はすでに使えなくなってる、もしくは使い方が違うなどわかったら教えていただけると幸いです。 > HtmlElementCollection ALL = webBrowser1.Document.All;
guest

回答1

0

ベストアンサー

また、ブレークポイントをいくつも変更してオンマウスでALLの値を確認してみましたが、ALLには以下の1行しか入りません。
System.Windows.Forms.HtmlElementCollection

それはやり方の問題だと思います。ちゃんと取得できていれば以下の画像のようになるはずです。

イメージ説明

だたし、上記の情報を見ただけではやりたいこと「自動ログイン」はできないと思いますが。

ログインということは ID とパスワードをテキストボックスに入力して[ログイン]ボタンを押すとかの操作が必要になるのでは? であれば、そのテキストボックスとボタン要素を HtmlElementCollection の中から探して操作するということが必要になるはずです。

まさかとは思い、踏み込んでテスト用HTMLにタグを書き込み、GetAttributeでclassName指定するなどしてALL変数から抜き出せるかも試しましたが、HTMLのソースにはあっても、何も取得できない状態です。

HtmlElementCollection の中から探すなら、GetElementsByName メソッドを使ってみてください。

イメージ説明

具体例は以下の記事を見てください。以下の記事は iframe の中の要素を取得という話ですが、iframe を使ってなければコメントアウトしたコードで取得できると思います。

WebBrowser で iframe の中の要素を取得
http://surferonwww.info/BlogEngine/post/2012/08/10/how-to-get-htmlelements-in-iframe-shown-in-webbrowser.aspx

他に、WebBrowser.Document プロパティで取得できる HtmlDocument の中から探すこともできると思います。

イメージ説明

投稿2020/12/23 04:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neji-thon

2020/12/23 22:17 編集

できました! ALLの中身も入っていることがわかったので、GetElementsByNameでInnerTextにいれてsubmitをClickできました。 SurferOnWwwさんのおかげです。 ありがとうございます。 m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問