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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

Q&A

解決済

1回答

3532閲覧

seleniumでエラーの時に関数の再帰呼び出しをしたらMaxRetryErrorが起こる

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

0グッド

0クリップ

投稿2020/04/19 13:10

編集2020/04/19 13:20

ネットバンキングにログインして明細をCSVでダウンロードするプログラムを作っています。
ここまでの関数をabc_download(url)として定義しました。

すでに別タブなどでログインしていた場合、エラーとなるので
try-exceptでログインしていた場合をexcept(例外)として定め、
ログアウトしてブラウザを一旦閉じるようにしました。
この後に例外処理の中で、abc_download(url)を続けて実行しようと
すると下記のように、MaxRetryErrorとなります。

MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=63184): Max retries exceeded with url: /session/0fd3c3edf018690894996648427cc730/url (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x016C18D0>: Failed to establish a new connection: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。'))

今回実行しているコードは下記です。

Python

1from selenium import webdriver 2import chromedriver_binary 3from selenium.webdriver.support.select import Select 4from selenium.webdriver.common.action_chains import ActionChains 5from selenium.webdriver.chrome.options import Options 6from selenium.common.exceptions import NoSuchElementException 7import glob 8import os 9import time 10 11# 現在の時間 12t1 = time.time() 13 14''' 15ダウンロードフォルダーをデフォルトから変更 16↓のコメントアウトを外すと5行目のインポートはいらない 17''' 18# options = webdriver.ChromeOptions() 19options = Options() 20options.add_experimental_option('prefs', { 21'download.default_directory': r'G:\Fのバックアップ\ドキュメント\download', 22'download.prompt_for_download': False, 23'download.directory_upgrade': True, 24'safebrowsing.enabled': True 25}) 26# options.add_argument('--headless') 27driver = webdriver.Chrome(options=options) 28# 要素が見つかるまで5秒待つ設定 29driver.implicitly_wait(5) 30actions = ActionChains(driver) 31 32url="https://www.abc-shinkin.co.jp/web-banking/" 33 34def abc_download(url): 35 driver.get(url) 36 driver.find_element_by_xpath('//*[@id="page_topics_list19"]/div/div[2]/div/div[1]/div[1]/form/div/a').click() 37 38 handle_array = driver.window_handles 39 driver.switch_to.window(handle_array[1]) 40 time.sleep(3) 41 driver.find_element_by_xpath('//*[@id="splash-78561-close-button"]').click() 42 43 driver.find_element_by_name("userId").send_keys("******") 44 driver.find_element_by_name("loginPwd").send_keys("*****") 45 driver.find_element_by_name("LoginPage").click() 46 time.sleep(3) 47 48 try: 49 driver.find_element_by_link_text(u"入出金明細照会").click() 50 except NoSuchElementException: 51 driver.find_element_by_xpath('//*[@id="main"]/form/div[3]/div[1]/input').click() 52 time.sleep(3) 53 driver.quit() 54 print("NoSuchElementExceptionが起きたので一旦ログアウト") 55 abc_download(url) 56 # ラジオボタンの選択(xpathでOK) 57 driver.find_element_by_xpath("//div[@id='main']/form/div[4]/ul/li[6]/label").click() 58 59 time.sleep(3) 60 # 明細を見るボタンクリック 61 driver.find_element_by_name("viewDetailsBtn").click() 62 time.sleep(3) 63 # PDFのダウンロードボタンクリック 64 driver.find_element_by_xpath('//*[@id="main"]/form[1]/div[4]/ul/li[1]/div/input').click() 65 time.sleep(3) 66 driver.quit() 67 68abc_download(url) 69 70# 処理後の時刻 71t2 = time.time() 72 73# 経過時間を表示 74elapsed_time = t2-t1 75print(f"経過時間:{elapsed_time}")

具体的にエラーが起こっている場所は上記コードの

Python

1 except NoSuchElementException: 2 driver.find_element_by_xpath('//*[@id="main"]/form/div[3]/div[1]/input').click() 3 time.sleep(3) 4 driver.quit() 5 print("NoSuchElementExceptionが起きたので一旦ログアウト") 6 abc_download(url)

のabc_download(url)の部分です。

どのようにすれば例外発生時にログアウトした後に、再帰的にabc_download(url)を使うことができるのでしょうか?

実行環境:Windows10
Python 3.7.6

ご知見のおありになります方
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムは部分的にしか見ていませんが、3箇所修正。
再帰呼び出しじゃ無くてループでリトライします。

Python

1 except NoSuchElementException: 2 ~~~ 3 abc_download(url) =====> return True に変更

Python

1def abc_download(url): 2の末尾 3 driver.quit() 4 return False <=====追加

Python

1abc_download(url) =====> while abc_download(url): に変更

投稿2020/04/19 15:50

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2020/04/20 04:07

ありがとうございます。 なるほど、while文でやってできました! 本当に助かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問