Python selenium CTRL+C 关闭 chromedriver

4
我该如何在不关闭chromedriver的情况下捕获CTRL+C(即KeyboardInterrupt)? 当我通过cmd运行script.py时,它会关闭chromedriver。
driver = webdriver.Chrome()
try:
    while True:
        #do stuff with chromedriver
except KeyboardInterrupt:
    print "User pressed CTRL + C"
    #do other stuff with chromedriver

我的脚本中捕获了KeyboardInterrupt,因此我的脚本继续执行,但是chromedriver也收到了信号并关闭了自己。
编辑1: 当您通过CMD运行脚本或使用Pyinstaller冻结脚本并运行时(IOError:[Errno 4] Interrupted function call),此处的解决方案无效。
编辑2: 我还尝试让脚本忽略Errno 4(使用try和except Exception),但仍然有相同的结果(chromedriver关闭),因此简而言之,这个解决方案一点用也没有。

可能是如何优雅地处理SIGTERM信号?的重复问题。 - ddavison
我在Windows上遇到了完全相同的问题,而在macOS和Linux上相同的代码可以正常工作。我怀疑这是因为cmd.exe将CTRL+C发送给了chromedriver.exe而不是python.exe。 - fedterzi
3个回答

4
考虑使用webdriver.Remote方式。这种方式不会在解释器内部生成webdriver的本地版本,这应该可以避免SIGINT问题。
在另一个Shell中初始化webdriver - (对于Chrome是chromedriver,对于Firefox是geckodriver等)。注意监听端口。这里将使用默认值:9515用于chromedriver,4444用于geckodriver。
在你的Python脚本中:
Chrome:
driver=webdriver.Remote("http://127.0.0.1:9515",desired_capabilities=webdriver.DesiredCapabilities.CHROME)

Firefox:

driver=webdriver.Remote("http://127.0.0.1:4444",desired_capabilities=webdriver.DesiredCapabilities.FIREFOX)

你想提供哪些参数? - smudi
主要是user-data-dir和proxy-server,我正在使用socks5代理,并希望保存环境。但我犯了一个错误,因为我正在使用ruby、watir和chromedriver。现在使用设置的caps仍然能够工作。虽然无法直接使选项或参数生效,但现在很满意。谢谢关心。 - Til
好的回答!请注意,Webdriver可以在终端中通过输入“geckodriver”来启动。 - Yan King Yin

1

我刚试了@Krmit的回答,使用的是Selenium 4.8.2、Python 3.11和Geckodriver,对于我的需求(取消休眠)效果很好。

    options=Options()
    # options.profile = FirefoxProfile()
    ps = signal.getsignal(signal.SIGINT)
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), options=options)
    signal.signal(signal.SIGINT, ps)

0

您也可以在启动驱动程序时禁用SIGINT处理。像这样:

import signal 

...

ps = signal.getsignal(signal.SIGINT) # backup signal handler 
signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore signal temporarily

... = webdriver.Chrome(...) 

signal.signal(signal.SIGINT, ps) # restore original handler

看起来这会禁用程序员捕获Ctrl-C,从而破坏提问者的意图。 - Yan King Yin
我也很好奇这是否会防止SIGINT影响Webdriver。 - Yan King Yin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接