2015-03-09 14 views
5

Ich möchte steuern, ob meine WebDriver beenden, aber ich kann keine Methode dafür finden. (It seems that in Java there's a way to do it)Python Selenium: Wie überprüft man, ob der WebDriver beendet wurde()?

from selenium import webdriver 
driver = webdriver.Firefox() 
driver.quit() 
driver # <selenium.webdriver.firefox.webdriver.WebDriver object at 0x108424850> 
driver is None # False 

Ich erforschte auch die Attribute WebDriver aber ich kann keine spezifische Methode nicht finden Informationen über den Fahrerstatus zu erhalten. Auch die Überprüfung der Session-ID:

driver.session_id # u'7c171019-b24d-5a4d-84ef-9612856af71b' 

Antwort

6

Wenn Sie den Quellcode der Python-Selen-Treiber erkunden würde, würden Sie sehen, was die quit() method des Firefox-Treiber tut:

def quit(self): 
    """Quits the driver and close every associated window.""" 
    try: 
     RemoteWebDriver.quit(self) 
    except (http_client.BadStatusLine, socket.error): 
     # Happens if Firefox shutsdown before we've read the response from 
     # the socket. 
     pass 
    self.binary.kill() 
    try: 
     shutil.rmtree(self.profile.path) 
     if self.profile.tempfolder is not None: 
      shutil.rmtree(self.profile.tempfolder) 
    except Exception as e: 
     print(str(e)) 

Es gibt Dinge, Darauf können Sie sich verlassen: Überprüfen Sie, ob profile.path vorhanden ist, oder überprüfen Sie den binary.process-Status. Es könnte funktionieren, aber Sie können auch sehen, dass es nur "externe Anrufe" gibt und es gibt nichts ändert sich auf der Python-Seite, die Ihnen helfen würde, anzuzeigen, dass quit() aufgerufen wurde.

Mit anderen Worten, benötigen Sie einen externen Anruf zu machen, die Status zu überprüfen:

>>> from selenium.webdriver.remote.command import Command 
>>> driver.execute(Command.STATUS) 
{u'status': 0, u'name': u'getStatus', u'value': {u'os': {u'version': u'unknown', u'arch': u'x86_64', u'name': u'Darwin'}, u'build': {u'time': u'unknown', u'version': u'unknown', u'revision': u'unknown'}}} 
>>> driver.quit() 
>>> driver.execute(Command.STATUS) 
Traceback (most recent call last): 
... 
socket.error: [Errno 61] Connection refused 

Sie kann unter der try/except setzen und eine wiederverwendbare Funktion machen:

import httplib 
import socket 

from selenium.webdriver.remote.command import Command 

def get_status(driver): 
    try: 
     driver.execute(Command.STATUS) 
     return "Alive" 
    except (socket.error, httplib.CannotSendRequest): 
     return "Dead" 

Nutzungs :

>>> driver = webdriver.Firefox() 
>>> get_status(driver) 
'Alive' 
>>> driver.quit() 
>>> get_status(driver) 
'Dead' 

würde Ein weiterer Ansatz WebDriver und stellen Sie die session_id-None in quit()-machen Ihre benutzerdefinierten Firefox sein:

>>> driver = MyFirefox() 
>>> print driver.session_id 
u'69fe0923-0ba1-ee46-8293-2f849c932f43' 
>>> driver.quit() 
>>> print driver.session_id 
None 
+0

Ist für Fahrer Abschlussprüfung notwendig in "Produktionsqualität" -Code? Mit anderen Worten, wie balanciere ich wirklich kugelsicheren Code im Vergleich zu der Zeit, die benötigt wird, um all diese Prüfungen durchzuführen? – franklin

+0

@franklin Ich habe noch nie Browser-Terminierungs-Checks gemacht, während ich selbst Selen benutzt habe und ich denke, dass das OP hier nur einen bestimmten Anwendungsfall hatte. Nicht sicher, ob dies nach dem Beenden des Treibers wirklich benötigt wird. Was denken Sie? – alecxe

+0

Ich war so interessiert, ich habe [hier die Frage gestellt] (http://stackoverflow.com/questions/35426824/optimal-amount-of-testing-for-selenium/) hier. Ich glaube ehrlich, dass die Fehlerquote beim Dekonstruieren eines Objekts in jeder Sprache so gering ist, dass es nicht notwendig ist, es zu testen. – franklin

0

Wie wäre:

class MyFirefox(webdriver.Firefox): 
    def quit(self): 
     webdriver.Firefox.quit(self) 
     self.session_id = None 

Dann können Sie einfach den session_id Wert überprüfen Ausführen eines Treiberbefehls und Prüfen auf eine Ausnahme:

import httplib, socket 

try: 
    driver.quit() 
except httplib.CannotSendRequest: 
    print "Driver did not terminate" 
except socket.error: 
    print "Driver did not terminate" 
else: 
    print "Driver terminated" 
0

es funktioniert in Java, geprüft auf FF

((RemoteWebDriver)driver).getSessionId() == null 
0

ich in das gleiche Problem lief und versuchte, den Titel zurückkehrt - das ist für mich gearbeitet mit chromedriver ...

from selenium.common.exceptions import WebDriverException 

try: 
    driver.title 
    print(True) 
except WebDriverException: 
    print(False) 
Verwandte Themen