如何使用Python退出由GeckoDriver和Selenium启动的所有Firefox进程

5

我正在使用Python 3.7 + Selenium + geckodriver.exe + Firefox 70.0.1x64,我知道driver.quit()可以关闭Firefox窗口,但在某些情况下我无法完全退出Firefox,我不知道为什么。这是我的代码:

from selenium import webdriver
import time

def func1():
    driver = webdriver.Firefox()
    i = 0
    while True:
        try:
            if i > 10 and driver is not None:
                driver.quit()
                driver = None
                print('quit success')
            i += 1
            print(i)
            time.sleep(1)
        except KeyboardInterrupt:
            if driver is not None:
                driver.quit()
                driver = None
                print('keyboard quit success')

if __name__ == '__main__':
    func1()

使用此代码,关闭火狐浏览器窗口有两种方法:
1. 等待10秒钟。
2. 使用Ctrl+C。
接下来我测试了第一种方法。
python test1.py

当Firefox窗口出现时,我注意到任务管理器中有6个进程,如下所示: enter image description here 然后我等待了10秒钟,一切正常,6个进程都消失了,如下所示: enter image description here 然后我测试了第二种方法。我在10秒钟内按下了Ctrl+C,结果如下所示: enter image description here 您可以看到仍然有5个进程在运行,只有1个进程已经终止,我不知道为什么。能否有人帮帮我?非常感谢!
1个回答

4
当通过Mozilla Firefox执行自动化测试时,您可能会观察到有多达六个Mozilla Firefox进程正在运行,可以通过Windows任务管理器的“进程”选项卡进行观察。请注意,此处保留了HTML标签。

Multi-Process Firefox


多进程Firefox

根据文章多进程Firefox:你需要知道的一切,为了提高浏览器的稳定性、性能和安全性,Firefox将稳定版本中的内容进程数量增加到四个,并成为了多进程Firefox,也被称为Electrolysise10S。多进程架构有助于将任务分离到进程中,Electrolysis功能在后台子进程中托管、渲染或执行与Web相关的内容,并通过各种ipdl协议与“父”Firefox浏览器通信。此外,多进程Firefox将NPAPI插件、媒体播放和Web内容移动到子进程中,从而将它们与浏览器的核心分离开来。


详情

当你运行进程管理器(例如Windows任务管理器)时,你会发现多个firefox.exe进程,这意味着电解作用已启用。显然,Firefox应该像以前一样运行,但是启用多进程功能应该立即改善浏览器的性能和稳定性。然而,你可能会注意到比平常更高的RAM使用率。Mozilla确认,启用电解作用的Firefox将使用大约20%更多的RAM。你可以更改Firefox用于其多进程功能的进程数。


这个用例

在你的第一个用例中,当你调用driver.quit()时,父进程和所有子Firefox进程以及父Firefox进程会被程序销毁。

您可以在Selenium:如何停止geckodriver进程影响PC内存,而不调用driver.quit()?中找到详细讨论。

在你的第二个用例中,在打印4后,你按下了Ctrlc,当KeyboardInterrupt发生时,你的程序中止,推测GeckoDriver失去了对 Mozilla Firefox 浏览器进程的控制。然而,仍然有1个进程通过driver.quit()终止,但其余进程仍然悬而未决。


结语

您可以在Google Chrome(32位)的许多进程中找到相关讨论。


非常感谢,我认为你是正确的,在测试后,我发现即使没有driver.quit(),在我按下Ctrl + C之后,6个进程会变成5个进程,这一定是因为Ctrl + C导致geckodriver之前关闭了Firefox,我决定使用'keyboard'模块代替Ctrl + C。问题解决了,谢谢。 - LadyKiller2018

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