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

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

新規登録して質問してみよう
ただいま回答率
85.31%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

899閲覧

自作関数が完了前に消えるのはなぜか???

sssaki

総合スコア15

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2022/03/03 13:44

編集2022/03/04 05:52

python初心者です。
自作関数の作り方について質問があります。
私は、バイト先で毎日入力しなければならない検温システムが面倒臭く、自動ログインと体温入力の自動化を行おうと奮闘中です。
一応、コーディングと実装まで出来て、問題なく動いたので、関数としてまとめました。
しかし、作った関数を実行すると、エラーは出ないのですが、プログラムが完了せずに勝手に消えてしまいます。関数にする前に、作ったコードをコピペしたので、写し間違いはないと思っています。
なぜ、関数化するとプログラムが完了する前にウィンドウが消えてしまうのでしょうか?
どなたか分かる方がいらっしゃいましたらご回答よろしくお願いします。

-------------------------------コードの内容--------------------------------------------------------------

from selenium import webdriver
from time import sleep

from selenium.webdriver.support.select import Select
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert

#ログイン情報
USER = ユーザ名
PASS = password
CHROMDRIVER = "C:/Users/Yuuki/ウェブスクレイピング/chromedriver.exe"

#ログインページにアクセス
url_login = "https://www.smart-kenon.jp/hapifull/m/page/login_mobile.jsp;jsessionid=C0DC5D7A20ED2E3EC2327F255C50DF42"
browser.get(url_login)
sleep(3)
print("ログインページにアクセスしました")

#自動ログイン
elem_username = browser.find_element(By.ID,'user')
elem_username.send_keys(USER)
elem_pass= browser.find_element(By.ID,'password')
elem_pass.send_keys(PASS)

sleep(1)
elem_login= browser.find_element(By.ID,'submit')
elem_login.click()

sleep(1)
elem_new_create = browser.find_element(By.ID,'sidA_NEW')
elem_new_create.click()

sleep(1)
elem_select = browser.find_element(By.ID,'sidTEMP')
import random
indexNum = [11,12,13,14,15,16,17]
select = Select(elem_select)
select.select_by_index(random.choice(indexNum))

sleep(1)
elem_complete = browser.find_element(By.ID,'sidA_INS')
elem_complete.click()
Alert(browser).accept()

#ログインページの取得
chrome_service = fs.Service(executable_path =CHROMDRIVER )
browser = webdriver.Chrome(service=chrome_service)
browser.get("https://www.google.com/")
browser.implicitly_wait(3)

#自動ログイン
elem_username = browser.find_element(By.ID,'user')
elem_username.send_keys(USER)
elem_pass= browser.find_element(By.ID,'password')
elem_pass.send_keys(PASS)

sleep(1)
elem_login= browser.find_element(By.ID,'submit')
elem_login.click()

sleep(1)
elem_new_create = browser.find_element(By.ID,'sidA_NEW')
elem_new_create.click()

sleep(1)
elem_select = browser.find_element(By.ID,'sidTEMP')
import random
indexNum = [11,12,13,14,15,16,17]
select = Select(elem_select)
select.select_by_index(random.choice(indexNum))

sleep(1)
elem_complete = browser.find_element(By.ID,'sidA_INS')
elem_complete.click()
Alert(browser).accept()

-----------------------------------------------
関数にまとめたものが以下になります。これを実行すると完了前にウィンドウが消えます。

python

1def job(): 2 USER = USER 3 PASS = Password 4 CHROMDRIVER = "C:/Users/Yuuki/ウェブスクレイピング/chromedriver.exe" 5 chrome_service = fs.Service(executable_path =CHROMDRIVER ) 6 browser = webdriver.Chrome(service=chrome_service) 7 browser.get("https://www.google.com/") 8 browser.implicitly_wait(3) 9 url_login = "https://www.smart-kenon.jp/hapifull/m/page/login_mobile.jsp;jsessionid=C0DC5D7A20ED2E3EC2327F255C50DF42" 10 browser.get(url_login) 11 sleep(3) 12 elem_username = browser.find_element(By.ID,'user') 13 elem_username.send_keys(USER) 14 elem_pass= browser.find_element(By.ID,'password') 15 elem_pass.send_keys(PASS) 16 sleep(3) 17 elem_login= browser.find_element(By.ID,'submit') 18 elem_login.click() 19 sleep(3) 20 elem_new_create = browser.find_element(By.ID,'sidA_NEW') 21 elem_new_create.click() 22 sleep(3) 23 elem_select = browser.find_element(By.ID,'sidTEMP') 24 import random 25 indexNum = [11,12,13,14,15,16,17] 26 select = Select(elem_select) 27 select.select_by_index(random.choice(indexNum)) 28 sleep(3) 29 elem_complete = browser.find_element(By.ID,'sidA_INS') 30 elem_complete.click() 31 Alert(browser).accept() 32 33 34job()

python(上手く作動するプログラム)

1def job(): 2 USER = 20364 3 PASS = 203641213 4 CHROMDRIVER = "C:/Users/Yuuki/ウェブスクレイピング/chromedriver.exe" 5 6 sleep(1) 7 chrome_service = fs.Service(executable_path =CHROMDRIVER ) 8 browser = webdriver.Chrome(service=chrome_service) 9 browser.get("https://www.google.com/") 10 browser.implicitly_wait(3) 11 12 sleep(1) 13 url_login = "https://www.smart-kenon.jp/hapifull/m/page/login_mobile.jsp;jsessionid=C0DC5D7A20ED2E3EC2327F255C50DF42" 14 browser.get(url_login) 15 16 sleep(1) 17 elem_username = browser.find_element(By.ID,'user') 18 elem_username.send_keys(USER) 19 elem_pass= browser.find_element(By.ID,'password') 20 elem_pass.send_keys(PASS) 21 22 sleep(1) 23 elem_login= browser.find_element(By.ID,'submit') 24 elem_login.click() 25 26 sleep(1) 27 elem_new_create = browser.find_element(By.ID,'sidA_NEW') 28 elem_new_create.click() 29 30 sleep(1) 31 elem_select = browser.find_element(By.ID,'sidTEMP') 32 import random 33 indexNum = [11,12,13,14,15,16,17] 34 select = Select(elem_select) 35 select.select_by_index(random.choice(indexNum)) 36 37 sleep(3) 38 elem_complete = browser.find_element(By.ID,'sidA_INS') 39 elem_complete.click() 40 41 sleep(3) 42 Alert(browser).accept() 43 a

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

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

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

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

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

mineralwater

2022/03/03 13:58

関数の中身のインデントはコードのままですか?
1T2R3M4

2022/03/03 14:01

USERやPASSは全世界に公開して問題ないものですか。
sssaki

2022/03/03 14:09

関数の中身のインデントはコードのままです
sssaki

2022/03/03 14:10

僕は特に後悔しても問題ないですが、一応非公開にしておきます
TakaiY

2022/03/03 14:16

pythonはインデントが無いと読めませんので、質問を編集して、コードを<code>ボタンで表示される ``` と ``` の間に入れて、最初の言語をpythonに変えてください。
sssaki

2022/03/03 14:23

このような機能があるのですね!! ありがとうございます。 実際のコードと同じインデントになりました
bboydaisuke

2022/03/03 14:40

関数を呼んでないから関数は実行されずに終了してるのでは?
sssaki

2022/03/03 14:50

一応関数はjob()で呼び出したのですが、同じようになります。
退会済みユーザー

退会済みユーザー

2022/03/03 22:17 編集

job()の途中にprint("チェックポイント1")、print("チェックポイント2")みたいな感じで「途中でクラッシュして処理が端折られた――が起きずにちゃんと処理が進んでいる保障」が得られるような文字列をprintするようにして、プログラムの様子をみてはいかがでしょう? 処理が進んでいるのに何も実行されていないのであればプログラムの処理内容がおかしく、処理がすっとばされて黙ってこけているのかすっとばされているのであれば走らない理由を探らないといけません。
TakaiY

2022/03/04 00:49

「一応関数はjob()で呼び出したのですが、同じようになります。」 その、呼び出しているところも含めてコードを提示したほうがいいですね。そちらに問題がある可能性もあります。
sssaki

2022/03/04 05:28

チェックポイントをつけて処理しましたが、最後まで問題なくprintされるので、他に何か問題があるのかもしれません。。。
melian

2022/03/04 05:41

elem_complete.click() の直後に sleep を入れてアラートボックスが表示されるのを待ってみてはどうでしょうか。 elem_complete.click() sleep(3) Alert(browser).accept()
sssaki

2022/03/04 05:47

確かにsleep(3)を入れることで、アラートボックスが表示される前に消えることは無くなりましたが、アラートボックスが出た後に自動でウィンドウが消えてしまいました
sssaki

2022/03/04 05:50

なぜだか、分からないのですが、関数の最後の行に適当な文字("a")を入れると、自分の思い通りにプログラムが動きました。もちろん、エラーで(name a is not defined)は出ます。 これは、本当に意味が分からないです。。。。 一応、そのプログラムも追加で記載しておきます
melian

2022/03/04 05:51

はい、プログラムが Alert(browser).accept() で終了していますのでウィンドウが閉じることになります。
sssaki

2022/03/04 05:54

ウィンドウが閉じないようにするためにはどのような処理が必要なのでしょうか? また、なぜAlert(browser).accept()で終了するとwindowが閉じるのかはご存知でしょうか?
melian

2022/03/04 06:08 編集

browser 変数(webdriver)がローカル変数だから、です。つまり、job 関数の終了によって解放されてしまいます。なので、detach するか、browser をグローバルスコープで定義することで回避できます。
melian

2022/03/04 06:07

Detach に関しては以下の回答を参考にして下さい。 Python Seleniumで処理後コンソールを消してそのままChromeを使用し続ける方法 https://teratail.com/questions/253512
sssaki

2022/03/04 06:22

melianさんがおっしゃる通り、それが原因のように思われます。。ただ、初心者過ぎて、まだグローバルスコープでの定義の仕方が分かっていないので、定義の仕方を勉強して試してみます。 ありがとうございます。完成できそうな気がしてきました。。。。
sssaki

2022/03/04 06:54

見よう見まねですが上手くいきました!!! 始めて作った簡単なプログラムですが、上手くいってとてもうれしいです。 自分の書いたプログラムがどのように行っているかや新しく学んだことを深堀して、もっと知見を深めていきたいと思います。 皆さんありがとうございました!!!!
guest

回答1

0

自己解決

browser 変数(webdriver)がローカル変数だから、です。つまり、job 関数の終了によって解放されてしまいます。なので、detach するか、browser をグローバルスコープで定義することで回避できます。

投稿2022/03/04 06:56

sssaki

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問