我的 Python 脚本使用 Selenium 来自动化 Windows 上的浏览器。我希望能够通过按 CTRL+C 来中断脚本。但即使我捕获了异常,WebDriver 也会在中断时终止:
from selenium import webdriver
driver = webdriver.Chrome()
try:
while True:
pass
except KeyboardInterrupt:
print('KeyboardInterrupt caught')
driver.get('https://www.google.com') # will fail
按下 CTRL+C 时,WebDriver 窗口立即关闭。对驱动程序方法的任何后续调用都会引发 urllib3 异常。
如果我在 Python REPL 中使用 WebDriver 并且需要通过中断终止某些函数,我不希望它破坏我的驱动程序实例。同样,在测试较长的自动化流程时,如果出现问题,我希望能够手动取消执行,但允许浏览器窗口保持打开状态以进行调试。
我可以按照here的建议在本地计算机上使用 Remote WebDriver 实例(通过 Selenium Grid),但我不想增加管理网格的复杂性。 here提到的解决方案似乎只适用于 Unix。
有没有一种简单的方法可以在 Windows 上实现此目的?
网络驱动程序终止,因为在 Windows 中,中断执行的
CTRL+C
按下(Windows 并不真正有“信号”)被 传播到子进程。 Selenium 的 webdriver 是一个单独的进程(由 subprocess.Popen
创建),程序通过 HTTP 与之通信。
可以使用标志实例化 Selenium 服务对象,以便它在单独的进程组中创建 webdriver 子进程:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import subprocess
serv = Service(popen_kw={"creation_flags": subprocess.CREATE_NEW_PROCESS_GROUP})
driver = webdriver.Chrome(service = serv)
现在驱动程序将不会收到来自父进程的任何“信号”!
我在几个小时寻找适当的解决方案并最终检查 Selenium 的源代码后创建了这个问答。我希望它对其他人有帮助。