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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Q&A

解決済

2回答

6975閲覧

C# mshtmlを用いたIE自動操作におけるDOMの取得について

kondo-modoru

総合スコア18

C#

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

0グッド

1クリップ

投稿2016/10/23 20:23

IE 自動化TOOLを作成するため、DOM操作について不明な点があります。

mshtml.HTMLInputElement の getElementsByTagNameにて
特定のTAGを取得しようとしているのですが、取得できる要素と取得できない要素があります。

input →OK
a, button →不可でした。
今回取得したい要素はbuttonです。
html内には1つしかありません。

取得できた、inputも同様ですが、table,td内にあり、親要素、子要素の入れ子により取得不可では
ないように思われます。

変更できないwebページからの取得を前提としているため
html内にclass名、id名、name=""がないため、他のgetElementByid、ElementsByNameでは不可と考えております。
ちなみに、該当のTAGは、
<button onclick="submitForm('myform');return false" type="submit">ログイン</button>
です。
waitをかけて、取得タイミングを遅らせても不可。
他の原因では?と考えて、別のTAGをターゲットとしてinputタグを指定し、foreach した場合は正確に
html内のタグ個数分だけ取得可能です。

そもそもgetElementsByTagName 自体の取得対象タグとしてbuttonタグが含まれていることを確認できております。

用途は、このbuttonがログインボタンになっておりページを自動LOGINできるTOOLをC#で実現したいと考えております。

良いアイデアやDOM操作についてご教授いただければ幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/10/24 01:29

質問者さんが「自動化 TOOL」でログインしようとしているサイトの所有者・管理者には自動化ツールでアクセスすることの許可は得ているのでしょうか?
kondo-modoru

2016/10/24 16:13

ご興味持っていただきありがとうございます。許可は受けていないです。特定のタグについて要素の取得を制限することは可能なのでしょか?
退会済みユーザー

退会済みユーザー

2016/10/26 12:05

質問者さんが、自分のサイトに「自動化 TOOL」で無断でログインされたら、あまり気持ちは良くないのでは? 許可を得ることをお勧めします。脅かすわけではないですが、業務妨害で逮捕された例もあります。
kondo-modoru

2016/10/29 03:33

ご回答ありがとうございます。おっしゃる通りだと思います。ですが、今回は発行されたID、PASSがありますので無断ではないと考えています。ですがそれでも抵触するのでしょうか?またはウェブサイトのcopyrightの問題ということでしょうか?確かに引用はダメだと認識していましたが、要素の取得でもそうなんでしょうか?
退会済みユーザー

退会済みユーザー

2016/10/29 04:03

クローラを作って某図書館のサイトにアクセスしたら業務妨害で逮捕されたと言う結構有名な事件です。「クローラ 図書館」ググるとヒットしますので興味がおありでしたら見てください。これはたぶんお役人の保身がらみの話だと思いますが、警察がその気になればこのようなことで逮捕できるということらしいです。
kondo-modoru

2016/10/30 13:49

ご教授いただきありがとうございます。十分に配慮して作成に当たりたいと思います。
guest

回答2

0

mshtmlに使い慣れていない、あるいは、mshtml側の不具合(ほとんどないと思いますが)もあり得ますので、
他のライブラリを試してみてはどうですか?

私はよく↓を使っています。
htmlagilitypack
参考サイト:http://www.atmarkit.co.jp/ait/articles/1501/27/news140.html

getElementsByTagNameに相当するメソッドは SelectNodes です。
参考サイト:http://kobarin.hateblo.jp/entry/20130125/1359086781


回答になっていないかもしれませんが、
mshtmlにこだわる必要がなければ、自分が一番使いやすいライブラリを使ったほうがいいですよ、
という事が言いたかったのです。

投稿2016/11/01 05:56

編集2016/11/01 06:09
LaLaLand

総合スコア107

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

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

0

ベストアンサー

HtmlElementCollection elems = mshtml.HTMLInputElement .GetElementsByTagName("button");

foreach (HtmlElement el in elems ) {
if (el.GetAttribute("type") == "submit"&& el.GetAttribute("value").Equals("ログイン"))
{
el.InvokeMember("click");
break;
}
}

こんな感じじゃないですかね?

投稿2016/10/24 12:24

編集2016/10/25 03:53
takagi.1994

総合スコア47

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

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

kondo-modoru

2016/10/24 17:46

大変申し訳ありません。 そもそのこの構文ででforeach できませんでした。 htmlelement →型ではない旨のエラー。 mshtml.HTMLDocument doc; doc = (mstml.HTMLDocument)ie.Document; foreach(mshtml.HTMLInputElement inp in doc.getElementByName("")){ } で実装したいのですが?どこの修正ですか?
takagi.1994

2016/10/25 04:02

foreach(mshtml.HTMLInputElement inp in doc.getElementByName("")){ Console.WriteLine(inp.OuterHtml); } してみては?
kondo-modoru

2016/10/30 13:47

追記です。 HtmlElementCollection elems = mshtml.HTMLInputElement .GetElementsByTagName("button"); が、CS0120 静的でないフィールド、メゾット、またはプロパティDispHTMLElemetsByTagName(string)'でオブジェクト参照が必要です のエラーでした。
takagi.1994

2016/10/30 17:10

すいません。テストせずに書いてしまってたので。 doc.GetElementsByTagName("button"); ではどうですか?
kondo-modoru

2016/10/30 19:07

いえ。本当に回答いただきありがとうございます。 HtmlElementCollection elems = doc.getElementsByTagName("button"); ですと CS0029 型'mshtml.HTMLElementCollection'をSystem.windows.Forms.HtmlElementCollectionに暗黙的に変換できません。 になってしまいます。
takagi.1994

2016/10/30 21:25

どうしてこうなるか想像できますか? そもそも何をしないといけないかイメージできてますか?
kondo-modoru

2016/10/31 17:43

ご迷惑をおかけしてすいません。キャストの問題だと思っているのですがいかがでしょうか? docの宣言は mshtml.HTMLDocument doc; doc = (mshtml.HTMLDocument)ie.Document; としております。
takagi.1994

2016/10/31 19:13 編集

まず、要件としてログインするためにbuttonタグを踏みたいと認識しているのですが、これは間違いではないでしょうか? mshtmlを使ったことがないのでコピペだけでいけるやつが書けなくてもうしわけないのですが、この場合、型が違う=キャストの問題ではないと思います。 (数字から文字列のようにキャストできるものばかりではないので) docにはログインページのhtmlが入っていると思うのですが、そのさいに <button onclick="submitForm('myform');return false" type="submit">ログイン</button> はあるのでしょうか? 通常、ログインする場合などは id、passがあるとおもうのですが、そのあたりの操作はできているのでしょうか?できているのであればそれらはコピペでしょうか? docに要素としてbuttonタグがあるのであれば、要素の中からbuttonタグを見つけ出してその要素に対して操作(クリック)してあげればよいだけであると思っています。 ここまでで不明な点は違う点はありますでしょうか?
kondo-modoru

2016/11/05 09:25

mshtmlを使ったことがないのでコピペだけでいけるやつが書けなくてもうしわけない →こちらこそ、要領不足で申し訳ありません。 docにはログインページのhtmlが入っていると思うのですが、そのさいに <button onclick="submitForm('myform');return false" type="submit">ログイン</button> はあるのでしょうか? →あります。こちらは、nameがついているため、doc.getElementsByName("password");で取得できました。inputタグとして実装されており、取得できました。 <button onclick="submitForm('myform');return false" type="submit">ログイン</button> はあるのでしょうか? →ここが私もわからないわからずでした。  確認のためdocすべてを表示したいのですが、stringへの型変換ができない状態です。  
takagi.1994

2016/11/06 01:16

エレメント操作は理解されてますか? →あります。こちらは、nameがついているため、doc.getElementsByName("password");で取得できました。inputタグとして実装されており、取得できました。 とありますが、取得した結果どうしたのか? 確認のためdocすべてを表示したいのですが、stringへの型変換ができない状態です。 とありますが、msのサイトのマニュアルはみられてますか? mshtmlにこだわる理由ななぜでしょう? ちなみに.netのバージョンはいくつですか? stringにキャストする理由は? そもそも私ならwebbrowserクラスを使って実装します。 https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser(v=vs.110).aspx ほかにも方法はありますが、ログインした結果どうしたいかもわかりませんがwebbrowserをつかうのが簡単なのでなないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問