Py Selenium:在尝试启动时强行杀死网络驱动程序
Py Selenium: Force kill a webdriver while it's trying to startup
我有一个 PyQt QThread,它是 运行 一个工作对象,作为工作对象的职责之一,它实例化并使用 selenium webdriver(在本例中为 Firefox)。
我还在该工作对象上有一个 PyQt 插槽,需要彻底拆除该对象。由于 worker“拥有”webdriver,它需要能够随时杀死它。调用 webdriver.quit()
只会导致 webdriver 有时退出,仅在 webdriver 完全设置之后。通过 Selenium 源代码的调用堆栈跟踪问题让我认为问题发生在我尝试在远程 webdriver 上执行 Command.QUIT
时。如果它的远程命令执行器还没有实例化,那么它自然不能退出。
我怎样才能绝对确定 selenium 已被拆除?
我已经完全重构了我的代码,但这是我在此期间学到的东西:
避免这种情况的一种方法是设置一个互斥锁,当我们完成“设置”selenium 时解锁。这样,当我们确定有东西要杀死时,我们实际上只能 运行 “杀死”代码。看起来像这样:
class Worker(QObject):
finished = QtCore.pyqtSignal()
def __init__(self):
#Setup the lock early
self.setupLock = QMutex()
def setup(self):
self.setupLock.lock()
#do whatever selenium initialization you need to
self.setupLock.unlock()
def quit(self):
self.setupLock.lock()
self.driver.quit()
self.setupLock.unlock()
self.finished.emit()
请注意,我 非常有目的地 将 setup() 函数从 __init__
中移出。 Worker 不一定会在线程结束后销毁,因此我们在 setup() 和 quit() 上实践了良好的互斥安全性。
我有一个 PyQt QThread,它是 运行 一个工作对象,作为工作对象的职责之一,它实例化并使用 selenium webdriver(在本例中为 Firefox)。
我还在该工作对象上有一个 PyQt 插槽,需要彻底拆除该对象。由于 worker“拥有”webdriver,它需要能够随时杀死它。调用 webdriver.quit()
只会导致 webdriver 有时退出,仅在 webdriver 完全设置之后。通过 Selenium 源代码的调用堆栈跟踪问题让我认为问题发生在我尝试在远程 webdriver 上执行 Command.QUIT
时。如果它的远程命令执行器还没有实例化,那么它自然不能退出。
我怎样才能绝对确定 selenium 已被拆除?
我已经完全重构了我的代码,但这是我在此期间学到的东西:
避免这种情况的一种方法是设置一个互斥锁,当我们完成“设置”selenium 时解锁。这样,当我们确定有东西要杀死时,我们实际上只能 运行 “杀死”代码。看起来像这样:
class Worker(QObject):
finished = QtCore.pyqtSignal()
def __init__(self):
#Setup the lock early
self.setupLock = QMutex()
def setup(self):
self.setupLock.lock()
#do whatever selenium initialization you need to
self.setupLock.unlock()
def quit(self):
self.setupLock.lock()
self.driver.quit()
self.setupLock.unlock()
self.finished.emit()
请注意,我 非常有目的地 将 setup() 函数从 __init__
中移出。 Worker 不一定会在线程结束后销毁,因此我们在 setup() 和 quit() 上实践了良好的互斥安全性。