我使用Selenium来执行自动化。但是,如果我重复自动化,我有很多chromedrivers。我想解决这个问题。你不能只运行一个chromedriver吗?
beq87vna1#
留下 * driver. exe进程的原因很可能是因为您没有在测试运行结束时显式关闭它们--用您选择的语言调用驱动程序对象上的quit()方法。这一步通常在对象的析构函数中完成--如果你使用面向对象的方法;finally块,如果它是异常处理;大多数高级框架(Cucumber,TestNG,Robotframework,不同语言中过多的单元测试)都有某种类型的"拆卸"块,通常用于此目的。为什么会这样呢?当您启动自动化时,操作系统会启动自动化进程;当你示例化一个webdriver对象时,它会为浏览器的驱动程序--在你的例子中是"chromedriver.exe"--产生一个进程。2下一步是打开浏览器示例--"chrome.exe"。当你的运行结束时,它的进程被关闭,但是,如果你没有显式地调用quit()方法-浏览器的驱动程序仍然存在,"保持活动";并且现在是一个孤立的进程(不要被误认为是僵尸进程,这是完全不同的事情)-功能齐全,但是-没有程序来命令它。事实上,在这个阶段-有一个工作的驱动程序进程和一个浏览器,你可以重新连接到它,并在未来的运行中使用。
quit()
finally
erhoui1w2#
根据您提供的屏幕截图,您的系统中似乎存在几个Zombie ChromeDriver process。直接回答,您不能在 * 重复自动化 * 的同时只启动一个ChromeDriver进程,因为您无法重新连接到上一个浏览会话。您可以在如何重新连接到使用selenium的webdriver打开的浏览器中找到详细的讨论?您的代码试验将使我们更深入地了解ChromeDriver进程未被清理的原因。根据最佳实践,始终在tearDown(){}方法中调用driver.quit(),以正常关闭并销毁 WebDriver 和 Web Client 示例,如下所示:
tearDown(){}
driver.quit()
driver.quit() // Python //or driver.quit(); // Java // driver.Quit(); // DotNet
您可以在PhantomJS Web驱动程序驻留在内存中找到详细的讨论如果ChromeDriver进程仍然没有被销毁和删除,您可能需要从任务列表中删除这些进程。您可以在Selenium中找到详细的讨论:如何停止geckodriver进程影响PC内存,而不调用driver.quit()?
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()
cxfofazt3#
我在测试结束时使用清理例程来清除僵尸进程、临时文件等(Windows、Java)导入组织文件实用程序;导入java.util.logging.Logger;导入java.io.文件;导入java.io.IOException;公共类测试清理{
protected static Logger logger = Logger.getLogger(TestCleanup.class.getName()); public void removeTemporaryFiles() { try { FileUtils.cleanDirectory(new File(getPropertyValue("java.io.tmpdir"))); } catch (IOException ioException) { logger.info("IOexception trying to clean the downloads directory: " + ioException.getMessage()); } } public void closeWebdriver() { webDriver.close(); } public void killOperatingSystemSessions() { try { Process process = Runtime.getRuntime().exec("taskkill /IM \"chromedriver.exe\" /F"); } catch (IOException ioException) { logger.info("Exception when shutting down chromedriver process: " + ioException.getMessage()); } }
}
3条答案
按热度按时间beq87vna1#
留下 * driver. exe进程的原因很可能是因为您没有在测试运行结束时显式关闭它们--用您选择的语言调用驱动程序对象上的
quit()
方法。这一步通常在对象的析构函数中完成--如果你使用面向对象的方法;
finally
块,如果它是异常处理;大多数高级框架(Cucumber,TestNG,Robotframework,不同语言中过多的单元测试)都有某种类型的"拆卸"块,通常用于此目的。为什么会这样呢?
当您启动自动化时,操作系统会启动自动化进程;当你示例化一个webdriver对象时,它会为浏览器的驱动程序--在你的例子中是"chromedriver.exe"--产生一个进程。2下一步是打开浏览器示例--"chrome.exe"。
当你的运行结束时,它的进程被关闭,但是,如果你没有显式地调用
quit()
方法-浏览器的驱动程序仍然存在,"保持活动";并且现在是一个孤立的进程(不要被误认为是僵尸进程,这是完全不同的事情)-功能齐全,但是-没有程序来命令它。事实上,在这个阶段-有一个工作的驱动程序进程和一个浏览器,你可以重新连接到它,并在未来的运行中使用。
erhoui1w2#
根据您提供的屏幕截图,您的系统中似乎存在几个Zombie ChromeDriver process。
直接回答,您不能在 * 重复自动化 * 的同时只启动一个ChromeDriver进程,因为您无法重新连接到上一个浏览会话。您可以在如何重新连接到使用selenium的webdriver打开的浏览器中找到详细的讨论?
您的代码试验将使我们更深入地了解ChromeDriver进程未被清理的原因。根据最佳实践,始终在
tearDown(){}
方法中调用driver.quit()
,以正常关闭并销毁 WebDriver 和 Web Client 示例,如下所示:您可以在PhantomJS Web驱动程序驻留在内存中找到详细的讨论
如果ChromeDriver进程仍然没有被销毁和删除,您可能需要从任务列表中删除这些进程。您可以在Selenium中找到详细的讨论:如何停止geckodriver进程影响PC内存,而不调用driver.quit()?
cxfofazt3#
我在测试结束时使用清理例程来清除僵尸进程、临时文件等(Windows、Java)
导入组织文件实用程序;导入java.util.logging.Logger;
导入java.io.文件;导入java.io.IOException;
公共类测试清理{
}