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

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

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

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

Q&A

解決済

2回答

1396閲覧

python 定義した関数の内部の変数をいじる方法

kakini

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2020/05/27 07:05

環境python3.5.3

seleniumを使ってあるサイトを開いた時にログインしてその際色々な処理をするんですが
全ての作業が終わったら一度ウィンドウを全て閉じてその後再度同じサイトを開いて
別のIDでログインして作業を繰り返すプログラムを作ろうとしています

プログラムの全体像としては
1.seleniumを使ってサイトを開きIDやパスを入力するのを関数で定義
2.その後開いたサイト内で行う様々な処理に関しても別々の関数で定義
3.プログラムの末尾にfor文を使って予め作ったIDとパスのリスト分の回数だけループさせる処理を書いておくです

python

1from selenium import webdriver 2from selenium.webdriver.support.ui import Select 3 4 5id=[-----] 6pas=[-----] 7 8def login(i): 9 #ログイン画面にアクセス 10 driver_path = "c:/driver/chromedriver.exe" 11 driver = webdriver.Chrome(driver_path) 12 driver.maximize_window() 13 driver.get("http:////////////////") 14 15 #IDとパスを入力 16 search_id=driver.find_element_by_id("login_id") 17 search_id.send_keys("-------+"+id[i]+"@gmail.com") 18 search_pass=driver.find_element_by_id("password") 19 search_pass.send_keys(pas[i]) 20 search_btn=driver.find_element_by_class_name("btn-login.btn") 21 search_btn.click() 22 23def 何かしらの処理1 24 25def 何かしらの処理2 26 27以下続く 28 29for i in range(10): 30 login(i) 31 def 1 32 def 2 33 driver.quit() 34 35

この処理をしようとしたら最後の行のdriver.quit()でエラーが起こりました
恐らく関数内で定義した変数driverを外から操作出来ないというエラーです
その後プログラムを少し変えて

python

1from selenium import webdriver 2from selenium.webdriver.support.ui import Select 3 4 5id=[-----] 6pas=[-----] 7 8def login(i): 9 if i>0.5: 10 driver.quit() 11 #ログイン画面にアクセス 12 driver_path = "c:/driver/chromedriver.exe" 13 driver = webdriver.Chrome(driver_path) 14 driver.maximize_window() 15 driver.get("http:////////////////") 16 17 #IDとパスを入力 18 search_id=driver.find_element_by_id("login_id") 19 search_id.send_keys("-------+"+id[i]+"@gmail.com") 20 search_pass=driver.find_element_by_id("password") 21 search_pass.send_keys(pas[i]) 22 search_btn=driver.find_element_by_class_name("btn-login.btn") 23 search_btn.click() 24 25def 何かしらの処理1 26 27def 何かしらの処理2 28 29以下続く 30 31for i in range(10): 32 login(i) 33 def 1 34 def 2 35

def login()関数の最初の部分に
if i>0.5:driver.quit()
をつけてlogin関数が2回目以降に呼び出された時にウィンドウを閉じる動作をさせようと考えましたが、これも
UnboundLocalError: local variable 'driver' referenced before assignment
この様なエラーが出てきて(恐らく1回目と2回目で名前はdriverという名で一緒でも別々の変数扱いされてるもよう)
うまく動かせません

これはどうすれば全ての処理を行った後(for文内で呼び出した全ての関数の処理が終了)ウィンドウを閉じて再度新しいウィンドウからログインさせる動作が出来ますでしょうか?

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

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

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

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

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

guest

回答2

0

関数内の変数は、関数の処理が終わるとなくなります。
ずっと残したいなら、関数の外でdriverを定義するか、y_waiwaiさんの回答のようにグローバル変数にしてしまうかですね。

ちなみに、if文の位置をdriver定義後にするのでは駄目なんでしょうか。(下記参照)

python3

1def login(i): 2 #ログイン画面にアクセス 3 driver_path = "c:/driver/chromedriver.exe" 4 driver = webdriver.Chrome(driver_path) 5 if i>0.5: 6 driver.quit() 7 driver.maximize_window() 8 driver.get("http:////////////////") 9 10 #IDとパスを入力 11 search_id=driver.find_element_by_id("login_id") 12 search_id.send_keys("-------+"+id[i]+"@gmail.com") 13 search_pass=driver.find_element_by_id("password") 14 search_pass.send_keys(pas[i]) 15 search_btn=driver.find_element_by_class_name("btn-login.btn") 16 search_btn.click()

投稿2020/05/27 07:16

jeanbiego

総合スコア3966

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

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

0

ベストアンサー

グローバル変数にするのではダメなんでしょうか

投稿2020/05/27 07:10

y_waiwai

総合スコア87719

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

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

kakini

2020/06/07 05:21

返答が遅れて申し訳ありません グローバル変数を定義する方法がありましたね、気がつきませんでした ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問