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 而且它工作得很好,比这里的大多数答案对我来说更好。
我想控制我的 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 而且它工作得很好,比这里的大多数答案对我来说更好。