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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

Q&A

解決済

1回答

11443閲覧

seleniumでダイアログのクリックが止まってしまいます。

ky_46

総合スコア92

JavaScript

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

0グッド

1クリップ

投稿2018/11/12 04:54

前提・実現したいこと

python3に、seleniumをインストールし、毎日行うWEB作業を代行させようとしています。
※seleniumはテスト用なので、本来の使用方法でないのは重々承知なのですが、WEBブラウザを自動制御できるのは助かりますので…

発生している問題・エラーメッセージ

データファイルをダウンロードするのに、指定のボタンを押し、続いてダウンロードのダイアログが出ますので、これをクリックするという作業です。
イメージ説明

図左のボタンは、 driver.find_element_by_xpath( で要素を指定する事で、正常にクリックできています。

結果、出てきたダイアログは、 Alert(driver).accept() クリックできるはずなのですが、待っても進行せず、強制終了させると、エラーとしてAlert(driver).accept()が表示されるので、このダイアログが見つけられないのでは? と考えています。

よく動作を見ると、ボタンを押すと新しいタブが開かれ、そこでボタンが発生しているのですが、元のタブ(ボタンのついていた方)をクリックすると消えてしまうため、新しく開かれたタブの参照方法も判らずにおります。

このダイアログをseleniumでクリックできる方法はないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを見てみないと詳しいコメントが難しいかもしれませんが、させたい処理はこのようなイメージでしょうか?

http://www.seleniumqref.com/api/python/window_set/Python_accept_dismiss.html

投稿2018/11/12 05:39

oh_rusty_nail

総合スコア319

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

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

ky_46

2018/11/12 06:25

はい。その通りでして、指摘のページでいうと、12行目で処理が止まってしまいます。 ただしエラーも出ず、停止もしないので、プログラムとしては、ダイアログを待っているのではないかと思います。 コード全体を書くのはご容赦ください。処理がまる判りになってしまうので… driver.find_element_by_xpath("//div[hogehoge]~ボタンを示すパスです。").click() # ダウンロードダイアログ time.sleep(15) Alert(driver).accept() のように、ボタンを押して15秒後、ダイアログをクリックするハズなのですが、上記のようにずっと待っている状態です。
oh_rusty_nail

2018/11/12 06:56

ダイアログは出ていますか? (これは、headlessモードで起動せず目視するのがはやいと思います) 出ているのに押せないのであれば、 https://teratail.com/questions/125969 の記事のようにwindowをスイッチする必要がありそうですね。
ky_46

2018/11/12 07:39

ご回答ありがとうございます。ダイアログは出ています。 windowのスイッチを試してみます。
ky_46

2018/11/12 08:37

oh_rusty_nail様 試してみましたが、windowをスイッチすると、ダイアログを含んだ新タブが閉じてしまい、Alert(driver).accept()ができませんでした。 ボタンを押すとダイアログ付きの新しいタブが開き、その状態でボタンのあったページへ戻ると、ダイアログ付きの新しいタブごと閉じてしまうというのはどういう方法で実装しているのかが判らないとダメかもしれません…
oh_rusty_nail

2018/11/12 23:47

提案を試してくださってありがとうございます。 「ボタンを押すとダイアログ付きの新しいタブが開き」と言われているのはOKボタンを押す挙動はできているのでしょうか? このサービスの作りを把握できていませんが、 商品管理メニュー => ダイアログ(OK) => どこか別のページに遷移 でしょうか?
ky_46

2018/11/13 00:24

こちらこそ、ご回答ありがとうございます。 > 「ボタンを押すとダイアログ付きの新しいタブが開き」と言われているのはOKボタンを押す > 挙動はできているのでしょうか? 画像はデータの指定ページになります。 ここで「ダウンロード」というボタンをクリックすると、新しいタブが開き、そこに本当にダウンロードするか? のダイアログが現れます。 その新しいタブに表示されているページには、なんのデータも表示されていない真っ白なものでした。 従って人間がブラウザを操作するときは、「ダウンロード」ボタンをクリック後、ダイアログの「はい」をクリックする事になります。 ※アクティブなタブは新規の真っ白ですし、そこにダイアログが表示されているだけなので、もしかすると迷わせないためかもしれません… 手動でも試してみましたが、この「ダウンロード」ボタンをクリック後、ダイアログが「はい」「いいえ」を表示しているところで、「ダウンロード」ボタンのあるページのタブへ移動したところ、ダイアログを含んだ新しいタブも消えてしまいました。 もちろんデータもダウンロードされていませんでした。 alert = driver.switch_to_alert() は、これから試してみます。
ky_46

2018/11/13 08:53

> alert = driver.switch_to_alert() でalertは取得できそうな気がしますがいかがでしょう? こちらもだめでした。 このコードの行で止まってしまいます。 alert = driver.switch_to_alert() <ここで止まる alert.accept() time.sleep(15)などで、ダウンロード開始ボタンからdriver.switch_to_alert()までの間にwaitをもうけても結果が変わりませんでした。
oh_rusty_nail

2018/11/14 06:10

このような感じで、ダウンロードの許可をプロファイルで許可してダイアログに出さないようにするのも1つの手ではあると思います。 # 許可するファイル形式はよしなにしてください profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream") 参考: https://a-zumi.net/python-selenium-save-to-disk/ https://stackoverflow.com/questions/32205245/need-the-chrome-equivalent-of-these-firefox-browser-profile-settings-in-seleni
ky_46

2018/11/27 07:34

色々手間取ってしまい、時間がかかってしまいました。 fp = webdriver.FirefoxProfile('C:/Users/shop/AppData\Roaming/Mozilla/Firefox/Profiles/[csvを指定フォルダにダウンロードするFirefoxプロファイル名]') fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream") driver = webdriver.Firefox(fp) にしたところ、うまくダウンロードする事ができるようになりました。 ありがとうございました。
oh_rusty_nail

2018/11/27 07:58

解決されたようでよかったです! これは余談ですが、一応宣伝させていただきます。 定期的にSlack上に集まって情報交換する会を企画しています。 次は冬頃を考えています。よろしければご参加ください。 https://selenium-danwakai.connpass.com/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問