Kushagra Aggarwal
Kushagra Aggarwal

Reputation: 131

In Python, how to check if Selenium WebDriver has quit or not?

Following is the sample code:

from selenium import webdriver

driver = webdriver.Firefox()

(The window gets closed due to some reason here)

driver.quit()

Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 183, in quit RemoteWebDriver.quit(self) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 592, in quit self.execute(Command.QUIT) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 297, in execute self.error_handler.check_response(response) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: Tried to run command without establishing a connection

Is there some way to check if an instance of webdriver is active?

Upvotes: 3

Views: 7968

Answers (5)

Matt Austin
Matt Austin

Reputation: 1

In addition to Corey Goldberg's answer, and to scign's answer:

Don't forget the import:

from selenium.common.exceptions import WebDriverException

Also, in Corey's answer, the code will hang for about 10sec while attempting to close an already closed webdriver before moving to the except clause.

Upvotes: 0

Peter Xie
Peter Xie

Reputation: 39

This is what I figured out and liked:

def setup(self):
    self.wd = webdriver.Firefox()

def teardown(self):
    # self.wd.service.process == None if quit already.
    if self.wd.service.process != None:
        self.wd.quit()

Note: driver_process=psutil.Process(driver.service.process.pid) will throw exception if driver already quits.

Upvotes: 4

scign
scign

Reputation: 943

The answer by Corey Golberg is the correct way.

However if you really need to look under the hood, the driver.service.process property gives access to the underlying Popen object that manages the open browser. If the process has quit, the process property will be None and testing whether it is truthy will identify the state of the browser:

from selenium import webdriver
driver = webdriver.Firefox()

# your code where the browser quits

if not driver.service.process:
    print('Browser has quit unexpectedly')

if driver.service.process:
    driver.quit()

Upvotes: 2

Corey Goldberg
Corey Goldberg

Reputation: 60604

be Pythonic... try to quit and catch the exception if it fails.

try:
    driver.quit()
except WebDriverException:
    pass

Upvotes: 6

Tarun Lalwani
Tarun Lalwani

Reputation: 146510

You can use something like this which uses psutil

from selenium import webdriver
import psutil

driver = webdriver.Firefox()

driver.get("http://tarunlalwani.com")

driver_process = psutil.Process(driver.service.process.pid)

if driver_process.is_running():
    print ("driver is running")

    firefox_process = driver_process.children()
    if firefox_process:
        firefox_process = firefox_process[0]

        if firefox_process.is_running():
            print("Firefox is still running, we can quit")
            driver.quit()
        else:
            print("Firefox is dead, can't quit. Let's kill the driver")
            firefox_process.kill()
    else:
        print("driver has died")

Upvotes: 2

Related Questions