如何让 CTRL+C 中断脚本而不关闭 Selenium WebDriver?

问题描述 投票:0回答:1

我的 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 上实现此目的?

python windows selenium-webdriver keyboardinterrupt
1个回答
1
投票

网络驱动程序终止,因为在 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 的源代码后创建了这个问答。我希望它对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.