DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowser でダイアログを操作するには

環境/言語:[Windows7 32bit Visual Basic 2010 Excel2010 NET Framework4.5.1]
分類:[.NET]

Visual Basic 2010 Express で制作しています。

フォームにWebBrowserをセットし、

http://web.biz-prog.net/index.html

を参考に、ID/PASSをセットしたり、submitボタンを押すなどの処理を順番に行うよう記述をして、自分用WEB巡回ロボットを制作しています。
概ね希望通りの動作をしますが、ファイルをダウンロードしようと、submitボタンを押すコードを通したところ、

---------
ファイルのダウンロード
このタイルを開くか保存しますか?
---------

のダイアログがでました。

希望の動作としては、このダイアログの保存のボタンを「押した」処理を送り、保存場所を指定して、ファイルを自動ダウンロードしたいです。
そうでないと、ロボットなのに人間がオペレートしてやらないといけないので……

Visual Basic 2010 WebBrowser ダイアログ 保存 など、googleでも調べてみたのですが、調べ方の問題か、希望のような処理をするコードを見つける事ができませんでした。

そこで質問ですが、WebBrowserからダイアログボックスに対し、処理を行うにはどうしたらよいでしょうか?

よろしくご教授をお願いいたします。
■No32614に追記

すみません。ルールを再読したところ、これは追記しておく必要があると思いますので、記載します。

半年くらい前に、Okwebで同じ内容の質問をしました。

その時は、WebBrowser から WebClient へ認証を引き渡せばいいのでは? という情報は得られたのですが、チケットを引き渡す(?)という方法がわからず、WebClient が認証エラーのテキストファイルを出力するところで開発が止まってしまっています。

チケットを引き渡す(?)ようなのですが、その方法がわからず困っています。

時間はかなり経過していますので、マルチポストではないとは思うのですが、ほかに質問したことはあるので、追記しておきます。

よろしくお願いいたします
実は、ワタシも似たようなことをやりたいと思っていました。
(例えば、リンクされているPDFをあらかじめ指定した場所に自動的に保存)

> 半年くらい前に、Okwebで同じ内容の質問をしました。
>
> その時は、WebBrowser から WebClient へ認証を引き渡せばいいのでは? という情報は得られたのですが、チケットを引き渡す(?)という方法がわからず、WebClient が認証エラーのテキストファイルを出力するところで開発が止まってしまっています。


もしOkWebの質問が削除されていなければ、質問自体が閉め切られていてもいいので
そのURLを教えてもらえますか?
■No32618に返信(コジマさんの記事)

> 実は、ワタシも似たようなことをやりたいと思っていました。
> (例えば、リンクされているPDFをあらかじめ指定した場所に自動的に保存)

やりたいことは同じですね。私はクリックすると生成されるCSVファイルをダウンロードして、そのままデータベースに読み込めればと思っていたのですが…うまくいかず放置になってしまいました…


> もしOkWebの質問が削除されていなければ、質問自体が閉め切られていてもいいので
> そのURLを教えてもらえますか?

はい。

http://okwave.jp/qa/q8566164.html

こちらになります。
よしさん。
ワタシも色々と探したところ、参考になりそうなサイトを見つけました。
Cookieを渡せばよいのであれば、もしかしたら以下の質問に書いてあるソースが参考になるかもしれません。
なお、質問者には別の課題があるようで、環境によってはそれが問題になるかもしれませんが、それについては残念ながら回答がついていませんでした。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=68287&KLOG=116

ただ、これについてはクラスの概念や継承といったことが多少なりとも理解できた方がいいかも知れません。
(要は、うまく動かなかった時に何が問題なのかが見当つけやすいということ)
■No32620に返信(コジマさんの記事)

ありがとうございます。

> http://bbs.wankuma.com/index.cgi?mode=al2&namber=68287&KLOG=116


>(WebBrowserから取得した該当サイトのクッキー)
とありますから、予めcookieのテキストを取り出しておけ という事なのでしょうか?


> ただ、これについてはクラスの概念や継承といったことが多少なりとも理解できた方がいいかも知れません。

確かに、このコードをそのまま使用しようとすると宣言が必要ですなどのエラーが出ますので、何等かの対処が必要だと思うのですが、それが判りません。

Visual Basicのプログラミング教室にも通いましたが、クラスはさらっと流しただけ。
結局、クラスはどう使うのか、あまり良くわからないままでした…
なにか理解する方法があれば良いのですが…
そのままソースを貼り付けてエラーとなるのは、
おそらくSystem.Net名前空間が省略されているためにエラーになるのでしょう。
ソースを貼り付けたクラスの宣言(例えば、Public Class Form1)の前に、以下の行を書いてみてください。

Imports System.Net

(Importsキーワードについては検索してみてください。)


なお、ある程度以上のことをVBでやろうと思ったら、.Netやクラスのことをある程度理解することは避けて通れません。
例えば、どぼんさんの.NET Tipsの内容を理解するには、それなりのスキルが必要です。

そこで、Visual Basic中学校をオススメサイトとして挙げておきます。

http://homepage1.nifty.com/rucio/main/main.htm

ここではVBの文法のみならず、クラスの概念まで、初心者にも分かりやすく解説されています。
ここで勉強すれば、どぼんさんの.NET Tipsの内容がよく理解できるようになりますよ。
なお、

>(WebBrowserから取得した該当サイトのクッキー)

について調べたところ、

WebBrowser1.Document.Cookie

でWebBrowser1に表示されているサイトのクッキーが取れるようです。
■No32623に返信(コジマさんの記事)

> おそらくSystem.Net名前空間が省略されているためにエラーになるのでしょう。

ありがとうございます。

私の方は面倒くさい方法を選んでしまいましたが、 System.Net. をエラーの出る箇所に貼り付けて解決しました。

すると、
http://bbs.wankuma.com/index.cgi?mode=al2&namber=68287&KLOG=116


> wc.DownloadFile("pdfのURL", fileName) '←ここでエラー

と同じ所で例外が出て止まりました。

解決にはかなり時間がかかりそうです…
VB中学校を見て、1から勉強するとなると、WEBロボット完成はいつになるか……
こちらの環境ではエラーが出ず、上手くいきそうな感じなのですが、
例外の内容はやはり

「System.Net.WebException: リモート サーバーがエラーを返しました: (407) プロキシ認証が必要です」

でしたか?
もしそうなのであればネット環境の問題かも知れません。
■No32626に返信(コジマさんの記事)

ありがとうございます。

> 「System.Net.WebException: リモート サーバーがエラーを返しました: (407) プロキシ認証が必要です」
>

いえ、これではありませんでした。
ファイルは落ちては来たのですが、そのファイルには

> 認証エラーが発生しました

> 誠に恐れ入りますが、ご利用規制などのため、操作を継続して受け付けることができ> ません。

と記載され、認証が正しく引き継がれていないようです。

ファイルをダウンロードするURLは、String形式の url1 に出来ているので、これをURIに変換する方法をいろいろ調べて、

Dim wb_cookies As String = WebBrowser1.Document.Cookie
Dim url2 As Uri = New Uri(url1)

のようにNEWで組み込んだのですが、これが正しくないのだろうか? と思っています。

URLは、

https://****tool.rms.rakuten.co.jp/****/?owin=&menu=pc&evt=RT_D01_01&category=RT_P01_01

のようなURLで、これを認証を通ったブラウザにURLとしてペーストすると、ファイルをダウンロードしますか? のダイアログボックスが出るのでURLは間違いはないとおもいます。
恐らく、IEでダウンロードしようとする時のリクエストの内容
(具体的にはヘッダ情報を含めた内容・例えばCookieの内容やUserAgent、いわゆるブラウザ情報など) と、
WebClientでのリクエストの内容が異なるために相手サーバーが「おかしい」と判断し、
エラー画面を返しているのだと思います。

ここまでくるとワタシのスキルではハードルが高そうです。
ゴメンナサイ...

ただ、ワタシが貼った掲示板のスレ

> http://bbs.wankuma.com/index.cgi?mode=al2&namber=68287&KLOG=116

では、Fiddlerというものを使ってリクエストの内容を調べよ、
というようなことが書かれていました。

Fiddlerというものは使ったことがないのでアドバイスはできませんが、
まずは各手法でのリクエスト内容の差異を確認する必要があるでしょうね。
その上で、同じようなリクエストを送信するにはどうするか、ということに
なろうかと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板