在重复自动化的同时,我们可以仅使用Selenium一次运行chromedriver吗?

时间:2018-12-29 09:33:25

标签: selenium google-chrome selenium-webdriver webdriver selenium-chromedriver

我使用Selenium执行自动化。 但是,如果我重复自动化的话,我会有很多chromedriver。

我想解决这个问题。 您不能只运行一个chromedriver吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

根据您提供的屏幕截图,您的系统中似乎有Zombie ChromeDriver process的一对。

直接回答,您不能仅启动一个 ChromeDriver 进程,而重复自动化,因为您无法重新连接到上一个浏览会话。您可以在How can I reconnect to the browser opened by webdriver with selenium?

中找到详细的讨论

您的代码试验将为我们提供更多的见解,从而说明为什么 ChromeDriver 流程没有得到清理。按照最佳做法,请始终在driver.quit()方法内调用tearDown(){}来关闭并销毁 WebDriver Web Client 实例,如下所示:

driver.quit() // Python
//or
driver.quit(); // Java
//
driver.Quit(); // DotNet

您可以在PhantomJS web driver stays in memory

中找到详细的讨论

如果 ChromeDriver 进程仍未销毁或删除,则可能需要从任务列表中终止这些进程。您可以在Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?

中找到详细的讨论
  • Python解决方案(跨平台):

    import os
    import psutil
    
    PROCNAME = "geckodriver" # or chromedriver or IEDriverServer
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == PROCNAME:
            proc.kill()
    

答案 1 :(得分:0)

留下* driver.exe进程的原因很可能是因为您没有在测试运行结束时显式关闭它们-以所选语言在驱动程序对象上调用quit()方法

该步骤通常在对象的析构函数中完成-如果您使用的是面向对象的方法; finally块(如果是异常处理);或程序/脚本的退出行。大多数高级框架(Cucumber,TestNG,Robotframework,使用不同语言的大量单元测试)都有某种“可拆卸”块,通常用于此目的。


为什么会这样?

启动自动化时,操作系统会为此启动进程;当您实例化一个webdriver对象时,它将为浏览器的驱动程序生成一个进程-在您的情况下为“ chromedriver.exe”。下一步是打开浏览器实例-“ chrome.exe”。

运行结束后,将关闭该过程。但是,如果您尚未显式调用quit()方法-浏览器的驱动程序仍然存在,则“保持活动”;现在是一个孤立的进程(不要误以为是僵尸,这是完全不同的事情)-功能齐全,但是-没有程序可以命令它。

实际上,在此阶段-具有有效的驱动程序进程和浏览器,您可以重新连接到该进程,并在以后的运行中使用。在这里查看如何以及为什么-https://stackoverflow.com/a/52003231/3446126