webdriverをちゃんと終了しないと実行した分だけwebdriverのプロセスとブラウザーのプロセスが残る。
意図的にブラウザを開いたままにしておくというのでなければテスト後に正常に終了させたほうが良い。
Seleniumのサンプルコードはclose()
を使っているが、これだとChromeDriverが終了しない。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
一方でChromeDriverのサンプルコードを見てみるとquit()
で終了されている。
import time
from selenium import webdriver
driver = webdriver.Chrome('/path/to/chromedriver') # Optional argument, if not specified will search path.
driver.get('http://www.google.com/');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()
元々close()
は現在のウィンドウの終了で、quit()
は全てのウインドウとドライバーの終了という違いがあるが、ChromeDriverではquit()
の実装がService.stop()
も呼ぶように変更されている。
恐らくそうしないとドライバーを終了することができないのだろう。
with構文を使う
ここでWebdriverの実装を見てみると__enter__
__exit__
が実装されており、__exit__
でquit()
が呼ばれているのでwith構文を使えば同じことができるというのが分かる。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
with webdriver.Firefox() as driver:
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
特別な意図がない限りはこちらのほうがブラウザ毎の終了のさせ方の違いを吸収できるので覚えるには良いかと思う。