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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

333閲覧

[C#/Webbrowser]Web自動操作における謎な挙動について

退会済みユーザー

退会済みユーザー

総合スコア0

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/05/20 09:50

編集2018/05/21 06:01

C#でWEBデスクトップアプリを開発しています。
私は下のサイトでカートに入れるをクリックした後に、ご注文手続きへをクリックする動作を自動化しているのですが
ご注文手続きへをクリックするとホーム画面に飛ばされてしまいます。
カートに入れるをクリックした後に、ご注文手続きへボタンが出現しますが、ご注文手続きへボタンのHTMLソースは元々のソースに記述されているという状態です。
http://www.supremenewyork.com/shop/accessories/wp25y34zk/qgv50ob3d

そこでいろいろ試行錯誤していたのですが下のことが分かりました。

①二回目のforeach構文内に

lang

1else { MessageBox.Show("見つかりません"); }

ご注文手続きへページに自動で進みました。しかしelse構文がないとホーム画面に飛ばされてしまうことが分かりました。

②ボタンを押すと動作をするようにしています。ボタンを押した一度目にはホーム画面に飛ばされましたが、二度目(一度目のホームに飛ばされた後すぐにボタンをもう一度押す)は上手く動作してご注文へ手続きページまで進むことができました。

なぜメッセージボックスを出現させるとうまくいったり、二度目の動作ではうまくいくとゆう謎の挙動が出ているのでしょうか。
メッセージボックスを出現させないかつ一度の動作で自動化したいです><
確かな原因ではなくても構いませんので、お力添えお願い致します。

lang

1HtmlElementCollection inputs = webBrowser1.Document.GetElementsByTagName("input"); 2 foreach (HtmlElement input in inputs) 3 { 4 if (input.GetAttribute("name") =="commit") 5 { 6 7 input.InvokeMember("click"); 8 break; 9 } 10 11 12 13 } 14 15 16 HtmlElementCollection checkouts = webBrowser1.Document.GetElementsByTagName("a"); 17 18 foreach (HtmlElement checkout in checkouts) 19 { 20 if (checkout.InnerText == "ご注文手続きへ") 21 { 22 23 checkout.InvokeMember("click"); 24 25 break; 26 } 27 28 29 30 } 31

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

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

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

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

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

guest

回答1

0

ベストアンサー

記載されている内容からの推測ですが、ボタンを押された後の処理が行われるためにメッセージループを回してをブラウザ側に処理を行わせる必要があると思われます。
余計な不具合が発生してもよければApplication.DoEvents()などの処理を行う。
Application.DoEventsを使わないのであれば、BeginInvokeなどを使用して、後続の処理を実行するなどの手段があります。

投稿2018/05/20 13:16

hmmm

総合スコア818

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

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

退会済みユーザー

退会済みユーザー

2018/05/21 05:58

まず初めに回答ありがとうございます。試行錯誤した結果多少状況がかわりましたので質問を編集しました。 >ブラウザ側に処理を行わせる必要がある なるほど。つまりカートインしてクリック→ご注文手続きへをクリックするとゆう動作中にはwebbrowserは画面の変化ができない訳ですね。そのためにApplication.DoEvents()やBeginInvokeなどを用いるとゆうことでしょうか?
hmmm

2018/05/21 10:38

はい。そうですね。Webページ側の実装に依存しますが、おそらく今回の場合はJavaScriptを動作させるためにWebBrowser側に処理を行わせる必要があると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問