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

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

新規登録して質問してみよう
ただいま回答率
85.37%
例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

Python

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

Q&A

解決済

1回答

854閲覧

一連の流れの途中での例外チェックについて

toomato

総合スコア2

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

Python

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

0グッド

0クリップ

投稿2021/08/23 16:33

編集2021/08/23 17:46

前提・実現したいこと

Seleniumを使用してGoogle Chromeを操作するプログラムを作成しています。

プログラムの内容は用意してある複数のURLを指定しそのページに移動し、ボタンを押すというものです。

処理を順番にしていく際に画面に表示されたボタンがクリックできない場合があります。
その時だけ別の処理を行いプログラムを続行したいのですが、現状ではボタンのクリック毎にTry, Exceptの行を追加しないといけません。

対象のボタンがすべて同じ場合はループさせれば済むのですが、printf()で文章を表示してみたり異なるボタンを押したいためその手段が取れません。エラーの内容はページ毎に同じものなので、プログラムの行数を短くするために便利な書き方などありましたら教えていただけると嬉しいです。

Python

1 2# ボタンA,Bを押す、クリックできない場合は別のボタン(btn_Error)を押す 3Try: 4 driver.get(url_1) 5 btn = driver.find_element_by_class_name("btn_A").click() 6 btn = driver.find_element_by_class_name("btn_B").click() 7 print("ボタンを押しました") 8 9Except selenium.common.exceptions.ElementClickInterceptedException: 10 btn = driver.find_element_by_class_name("btn_Error").click() 11 12 13# ボタン(btn_A)を押す、クリックできない場合は別のボタン(btn_Error)を押す 14Try: 15 driver.get(url_2) 16 btn = driver.find_element_by_class_name("btn_A").click() 17 18Except selenium.common.exceptions.ElementClickInterceptedException: 19 btn = driver.find_element_by_class_name("btn_Error").click() 20 21 22# ボタンC,A,Bを押す、クリックできない場合は別のボタン(btn_Error)を押す 23Try: 24 driver.get(url_2) 25 btn = driver.find_element_by_class_name("btn_C").click() 26 btn = driver.find_element_by_class_name("btn_A").click() 27 btn = driver.find_element_by_class_name("btn_B").click() 28 printf("ボタン") 29 30Except selenium.common.exceptions.ElementClickInterceptedException: 31 btn = driver.find_element_by_class_name("btn_Error").click() 32 3334353637

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

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

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

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

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

udon-ken

2021/08/23 16:49

全体に質問の意味と用語の使いか方がよくわかりません。 なので、その保守性の悪いプログラムを提示しないと回答が付かないと思います。 想像で回答して、「質問の意図と全然違っていた」となると完全に無駄になるからです。
toomato

2021/08/23 17:10

失礼しました。再度書き直そうと思います。 文章を書くのは苦手なので編集しても分かりずらいと思いますので無視していただいて構いません。 ご指摘ありがとうございました。
guest

回答1

0

ベストアンサー

ボタン操作の関数を作って行うのでは駄目でしょうか?

python

1def btn_click(driver, url, btns, cleanup = None): 2 try: 3 driver.get(url) 4 for btn in btns: 5 driver.find_element_by_class_name(btn).click() 6 if callable(cleanup): 7 cleanup() 8 except selenium.common.exceptions.ElementClickInterceptedException: 9 btn = driver.find_element_by_class_name("btn_Error").click() 10 11btn_click(url_1, ["btn_A", "btn_B"], lambda: print("ボタンを押しました")) 12btn_click(url_2, ["btn_A"]) 13btn_click(url_3, ["btn_C", "btn_A", "btn_B"], lambda: print("ボタン"))

動作確認していませんが、こんな感じでしょうか?

投稿2021/08/26 06:08

TANAKAKazuyoshi

総合スコア96

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

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

toomato

2021/08/26 06:20

アドバイスありがとうございます。 確かに関数に入れると余計に何度も書かなくてすっきりして使いやすいと感じました。 自分のプログラムもボタン操作を関数にまとめたいと思います。 一点気になることがありまして、callableに引数として渡すcleanupという関数(?)変数(?)はどのような意味があるのでしょうか?callable については調べて実行可能かを判定すると分かったのですが、cleanupの役割について補足いただけないでしょうか。
TANAKAKazuyoshi

2021/08/26 09:22

サンプルでボタン操作終了時にprint命令がありました。 それを実現するためにボタン操作終了後に任意の関数を呼べるようにしただけです。(lambdaは無名関数と言われる関数の書き方です)
toomato

2021/08/27 09:36

なるほど理解しました。 書いていただいた関数btn_click()の第4引数に好きな関数をlambaの形式で渡すことができるということですね。コードの書き方の引き出しが増えてうれしいです。 追加の質問までお答えいただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問