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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

2485閲覧

headless chromeにおいて、ダウンロードするためのVBAコードを教えて下さい

dam9806

総合スコア21

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

1クリップ

投稿2019/04/30 01:58

編集2019/05/01 07:37

Excel vbaでSeleniumを使ってChromeを操作しています。

実行環境:win7, Excel2016

#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If Sub test() Dim driver As New Selenium.ChromeDriver Dim wkObj, wkNow On Error GoTo err wkNow = Now With driver ' ヘッドレスモードの設定 .AddArgument "headless" .AddArgument "disable-gpu" .start .get "https://www.japannetbank.co.jp/service/payment/web_all/csv_download.html" ' 「全銀形式~」のリンクをクリックすると、自動でダウンロードされる .FindElementByClass("listStyle04").FindElementByTag("a").Click Call Sleep(3000) End With Set driver = Nothing Set wkObj = Nothing MsgBox "処理が完了しました。処理時間" & DateDiff("s", wkNow, Now) & "秒" Exit Sub err: Debug.Print "err.Number=[" & err.Number & "], err.Description=[" & err.description & "], VBA.Erl=[" & VBA.Erl & "]" Set driver = Nothing Set wkObj = Nothing MsgBox "エラーとなりました。処理時間" & DateDiff("s", wkNow, Now) & "秒" End Sub

上記の実行によりCSVファイルがダウンロードされる想定ですが、されません。
ヘッドレスモードを設定する2行をコメント化すると、ダウンロードされます。

ダウンロードするためのvbaコードのヒント・参考となるサイトなど分かりましたら教えて下さい。
何をどう試せば良いのか、行き詰まっております。

なお、ネット上にPythonのサンプルコードは少なからず存在します。
例えば、Pythonのサンプルコード記載記事の一つはこちら。
https://qiita.com/zkangaroo/items/1c4d4c11b06e7823e7fe

また、本質問とは関係ないと思いますが、処理時間について以下の結果となりました。
ヘッドレスの場合:47秒ほど
通常モードの場合:7秒ほど

ヘッドレスの場合、サイトのロードに大幅に時間がかかっていることを確認済みです。
タイムオーバーになることすらあります。
これについても何か対応策があれば教えて下さい。

以上、宜しくお願いいたします。

5/1 追加で試したことの追記
上記コードの「.start」の直前に、以下のパターンでコードを追加して試しました。
しかし、いずれも例外は発生しないものの、ファイルはダウンロードされませんでした。
リファレンス・ドキュメントなどに記載を見つけることができなかったので、pythonコードを参考にして適当に試したものです。

.SetPreference "page.setDownloadBehavior.behavior", "allow"
.SetPreference "browser.setDownloadBehavior.behavior", "allow"
.SetPreference "download.setDownloadBehavior.behavior", "allow"
.SetPreference "setDownloadBehavior.behavior", "allow"

.SetPreference "page.setDownloadBehavior", "{'behavior':'allow'}"
.SetPreference "browser.setDownloadBehavior", "{'behavior':'allow'}"
.SetPreference "download.setDownloadBehavior", "{'behavior':'allow'}"
.SetPreference "setDownloadBehavior", "{'behavior':'allow'}"

.SetPreference "page.set_download_behavior.behavior", "allow"
.SetPreference "browser.set_download_behavior.behavior", "allow"
.SetPreference "download.set_download_behavior.behavior", "allow"
.SetPreference "set_download_behavior.behavior", "allow"

.SetPreference "page.set_download_behavior", "{'behavior':'allow'}"
.SetPreference "browser.set_download_behavior", "{'behavior':'allow'}"
.SetPreference "download.set_download_behavior", "{'behavior':'allow'}"
.SetPreference "set_download_behavior", "{'behavior':'allow'}"

.SetPreference "downloadBehavior", "allow"
.SetPreference "download.behavior", "allow"

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

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

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

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

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

CHERRY

2019/04/30 05:09

丸投げと評価されていますので、このままだと回答はつきにくいと思います。 現在できている部分だけでも噛まいませんので、ご自身で考えたコードを質問に記載してください。 また、Web ページが一般公開されていて、誰でもアカウントが作れるのであれば、公開していただいたほうが回答が付きやすいと思います。
dam9806

2019/04/30 05:16

コメントありがとうございます。 説明が足りませんでしたが、有料アカウントでないと当該ページの操作ができないのです。
dam9806

2019/04/30 05:18

もう少し本文に補足してみます。
oikashinoa

2019/04/30 06:47

ボタンクリックする前も書いたほうがいいですよ。
dam9806

2019/04/30 07:01

こめんとありがとうございます。本文に追記しました。
oikashinoa

2019/04/30 08:53

1. エラーをCatchしているのであれば、エラー内容からなにか分かりませんか? 2. 時間かかっている件は有用な情報ですね。Headlessと通常で動きが違うのですから。Excel vba&Seleniumで作ったこと無いので具体的なメソッドとかは調べて欲しいですが、.get "https:(略)直後とかのHTMLをHeadlessと通常で比較するとヒントが有ると思いますよ。 …最初からこれくらいの情報量を記載して質問すればもっと回答付いたと思いますよ。
dam9806

2019/04/30 08:58

たまにタイムアウトエラーとなりますが、多くの場合は正常終了します。 ですが、実際にはファイルがダウンロードされていない・・・という状況です。
dam9806

2019/04/30 09:00

ご指摘、ありがとうございます。 もし回答が少なければ、混乱させてしまうことになりますが、当質問を取り消し、同内容で再質問することにしたい思います。
oikashinoa

2019/05/02 07:58

問題切り分けのために以下のように順番逆にしてはいかが? Call Sleep(3000) .FindElementByClass("listStyle04").FindElementByTag("a").Click 本当はsleepの前にHTMLを取得して、通常とHeadlessで比較することですが。
dam9806

2019/05/02 08:31

oikashinoaさん、ありがとうございます! sleepの前というのは、リンクをクリックする前・・・ということでしょうか?
oikashinoa

2019/05/02 08:37

そうです。何らかの理由でサーバー側からHTMLもろもろがクライアント側にダウンロード出来ていないのでは? - 正しくはsleepの前にHTMLを取得して、通常とHeadlessで比較することですが。
dam9806

2019/05/02 10:32 編集

HTMLを比較しましたが、差違がありませんでした。 ご提案のように順番を逆にした後、.get と sleepの間に以下コードを追記して、headとbodyのHTMLソースをログ出力し比較しました。(debugPrintFile は、自作のログ出力関数) debugPrintFile .FindElementByTag("head").Attribute("outerHTML") debugPrintFile .FindElementByTag("body").Attribute("outerHTML")
guest

回答1

0

投稿2019/05/02 11:53

oikashinoa

総合スコア2826

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

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

dam9806

2019/05/03 04:55

コメントありがとうございます! 1個目のリンクについては、質問文に記載のリンクと同じですね。 pythonを参考にして対策したコードについては、質問文の下部に追記したパターンでテストして、ダウンロードできないことを確認済みです。 2個目のリンクについては、見てはいましたが、さらっと流す程度でした。 改めて確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問