Selenium - かならずwebdriverを閉じる
Seleniumを使っていて気がつくと、chromedriverのプロセスが溜まっていることがあります。 code:chromedriver.log
$ ps -ef | grep chromedriver
501 13894 1 0 10:17PM ttys000 0:00.07 chromedriver --port=63029
501 13919 1 0 10:17PM ttys000 0:00.05 chromedriver --port=63047
501 13946 1 0 10:18PM ttys000 0:00.05 chromedriver --port=63065
501 13972 1 0 10:18PM ttys000 0:00.05 chromedriver --port=63084
501 13998 1 0 10:18PM ttys000 0:00.06 chromedriver --port=63101
501 14022 13053 0 10:18PM ttys000 0:00.00 grep chromedriver
これは、webdriver.Chrome()等でwebdriverを起動したあと、webdriver.quit()が呼ばれていないためです。プログラムが終了してもブラウザを手動で閉じても、webdriver.quit()を呼ばない限りchromedriverのプロセスは停止しません。Seleniumを使っていると、思っていたとおりに要素が見つからなかったりして例外で止まってしまい、quit()が呼ばれないという状況がありがちです。
確実にquit()を呼び出すため、try〜finallyを使いましょう。
code:try-finally.py
try:
driver = webdriver.Chrome()
...
finally:
driver.quit()
これで、テスト実行中に例外が発生しても必ずquit()が呼び出されるようになります。
あるいは、withを使えるようにするという手もありそうですが、ちょっと頑張りすぎかもしれません。
code:with.py
class SafeDriver:
def __init__(self):
self.driver = webdriver.Chrome()
def __enter__(self):
return self.driver
def __exit__(self, type, value, traceback):
self.driver.quit()
with SafeDriver() as d:
d.get(...)
...