Python Selenium:如何检查 WebDriver 是否退出()?

Python Selenium: How to check whether the WebDriver did quit()?

我想控制我的 WebDriver 是否退出,但找不到方法。 (It seems that in Java there's a way to do it)

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

我也探索了 WebDriver 的属性,但我找不到任何特定的方法来获取有关驱动程序状态的信息。同时检查会话 ID:

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

如果您探索 python-selenium 驱动程序的源代码,您会看到 firefox 驱动程序的 quit() method 在做什么:

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))

这里有您可以依赖的东西:检查 profile.path 是否存在或检查 binary.process 状态。它可以工作,但您还可以看到只有 "external calls" 并且 在 python 侧 没有任何变化可以帮助您表明 quit() 被调用。

换句话说,你需要进行外部调用来查看状态:

>>> 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

你可以把它放在try/except下面,做一个可复用的函数:

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"

用法:

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

另一种方法是制作自定义 Firefox webdriver 并在 quit() 中将 session_id 设置为 None:

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

然后,您可以简单地检查 session_id 值:

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

如何执行驱动程序命令并检查异常:

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"

它在 java 中有效,在 FF

上检查过
((RemoteWebDriver)driver).getSessionId() == null

我 运行 遇到了同样的问题并尝试返回标题 - 这对我使用 chromedriver 很有效...

from selenium.common.exceptions import WebDriverException

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

有这个功能:

if driver.service.isconnectible(): print('Good to go')

上面建议的方法在 selenium 版本 3.141.0 上对我不起作用

dir(driver.service) found a few useful options 

driver.session_id   
driver.service.process
driver.service.assert_process_still_running()
driver.service.assert_process_still_running 

当我在关闭一个已经关闭的驱动程序时遇到问题时,我发现了这个 SO 问题,在我的例子中,围绕 driver.close() 的 try catch 对我的目的有效。

try:
    driver.close()
    print("driver successfully closed.")
except Exception as e:
    print("driver already closed.")

另外:

import selenium
help(selenium)

检查 selenium 版本号

''''python def 关闭 driver(): 全局 driver 名称 drivername.quit() 全球 driver 开启 driver开=假 '''' 这个函数“closedriver”使用一个名为“drivername”的全局变量和一个名为“driveron”的全局布尔变量,你可以只传递一个当前的driver作为参数但是
注意:driveron 必须是全局的才能存储 driver 的状态为 'on' 或 'off'。 ''''python
def closedriver(driver名称):
全局 driver开启
尝试:
drivername.quit()
除了:
通过
driver开=假
''''
当你开始一个新的 driver 时,只需使用 check
全局 driver开启
如果不是 driver on:
driver=webdriver.Chrome()

这对我有用:

from selenium import webdriver

driver = webdriver.Chrome()
print( driver.service.is_connectable()) # print True

driver.quit()
print( driver.service.is_connectable()) # print False

对于此处大多数人的方法,浏览器界面本身以及chromedriver.exe(或等效项)都需要关闭;否则,Selenium 认为它是 运行 正常。我处于一个需要检测浏览器界面是否关闭的位置,无论 chromedriver 是否仍然 运行。在这里尝试了一堆答案之后,我选择了显而易见的答案:

from selenium.common.exceptions import WebDriverException

try:
    driver.current_url
    print('Selenium is running')
except WebDriverException:
    print('Selenium was closed')

A 而且它工作得很好,比这里的大多数答案对我来说更好。