KLI*_*KLI 92 selenium selenium-chromedriver selenium-webdriver
我设置了一个python代码来运行Selenium chromedriver.exe.在运行结束时,我必须browser.close()关闭实例.(browser = webdriver.Chrome())我相信它应该chromedriver.exe从内存中释放(我在Windows 7上).但是,每次运行后chromedriver.exe,内存中仍有一个实例.我希望有一种方法可以在python中编写一些东西来杀死chromedriver.exe进程.显然browser.close()不做这项工作.谢谢.
dda*_*son 64
根据Selenium API,你真的应该调用,browser.quit()因为这个方法将关闭所有窗口并杀死进程.你还是应该用browser.quit().
但是:在我的工作场所,我们注意到在Java平台上执行chromedriver测试时遇到了一个很大的问题,即使在使用之后chromedriver.exe仍然存在browser.quit().为了解决这个问题,我们创建了一个类似于下面这个的批处理文件,只是强制关闭进程.
kill_chromedriver.bat
@echo off
rem just kills stray local chromedriver.exe instances.
rem useful if you are trying to clean your project, and your ide is complaining.
taskkill /im chromedriver.exe /f
Run Code Online (Sandbox Code Playgroud)
由于chromedriver.exe不是一个庞大的程序,并且不会占用太多内存,因此您不必每次都运行它,但只有在出现问题时才运行.例如,在Eclipse中运行Project-> Clean时.
Ric*_*ard 33
browser.close() 将仅关闭当前的chrome窗口.
browser.quit() 应该关闭所有打开的窗口,然后退出webdriver.
Ill*_*dan 14
从理论上讲,调用browser.Quit将关闭所有浏览器选项卡并终止进程.
但是,在我的情况下,我无法做到这一点 - 因为我并行运行多个测试,我不想进行一次测试来关闭其他人的窗口.因此,当我的测试完成运行时,仍有许多"chromedriver.exe"进程在运行.
为了克服这个问题,我写了一个简单的清理代码(C#):
Process[] chromeDriverProcesses = Process.GetProcessesByName("chromedriver");
foreach(var chromeDriverProcess in chromeDriverProcesses)
{
chromeDriverProcess.Kill();
}
Run Code Online (Sandbox Code Playgroud)
//Calling close and then quit will kill the driver running process.
driver.close();
driver.quit();
Run Code Online (Sandbox Code Playgroud)
小智 6
从命令行终止多个进程\n您\xe2\x80\x99需要做的第一件事是打开命令提示符,然后使用具有以下语法的taskkill命令:
\n\ntaskkill /F /IM <processname.exe> /T\nRun Code Online (Sandbox Code Playgroud)\n\n这些参数将强制终止与您指定的可执行文件名称匹配的任何进程。例如,要终止所有 iexplore.exe 进程,我们\xe2\x80\x99d 使用:
\n\ntaskkill /F /IM iexplore.exe\nRun Code Online (Sandbox Code Playgroud)\n\n\n
有点奇怪,但对我有用。我遇到了类似的问题,经过一番挖掘后,我发现当我点击时,浏览器中仍在进行UI操作(URL加载左右)WebDriver.Quit()。
对我来说,解决方案(虽然非常讨厌)是Sleep()在调用Quit()之前添加了3秒。
代码 c#
using System.Diagnostics;
using System.Management;
public void KillProcessAndChildren(string p_name)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select * From Win32_Process Where Name = '"+ p_name +"'");
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
try
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
catch (ArgumentException)
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
和这个功能
public void KillProcessAndChildren(int pid)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
try
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
catch
{
break;
}
}
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch (ArgumentException)
{
// Process already exited.
}
}
Run Code Online (Sandbox Code Playgroud)
呼唤
try
{
KillProcessAndChildren("chromedriver.exe");
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)
这个答案是如何在C#中正确处置驱动程序
如果要使用运行后应用于“整理”的“适当”机制,ChromeDriver 则应使用 IWebDriver.Dispose();
执行与释放,释放或重置非托管资源相关的应用程序定义的任务。(继承自IDisposable。)
我通常IDisposable在正在处理的类上实现IWebDriver
public class WebDriverController : IDisposable
{
public IWebDriver Driver;
public void Dispose()
{
this.Driver.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
using (var controller = new WebDriverController())
{
//code goes here
}
Run Code Online (Sandbox Code Playgroud)
希望这可以节省您一些时间
在 Python 中运行它时我遇到了同样的问题,我必须手动运行“killall”命令来终止所有进程。然而,当我使用 Python上下文管理协议实现驱动程序时,所有进程都消失了。看来 Python 解释器在清理方面做得非常好。
这是实现:
from selenium import webdriver
from selenium.webdriver import ChromeOptions
class Browser:
def __enter__(self):
self.options = webdriver.ChromeOptions()
self.options.add_argument('--headless=new')
self.options.add_argument('--no-sandbox')
self.driver = webdriver.Chrome(options=self.options)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.driver.close()
self.driver.quit()
Run Code Online (Sandbox Code Playgroud)
以及用法:
with Browser() as browser:
browser.driver.get("http://www.example.com")
html = browser.driver.page_source
print(html)
Run Code Online (Sandbox Code Playgroud)
小智 5
因此,您可以使用以下内容:
driver.close()
Run Code Online (Sandbox Code Playgroud)
关闭浏览器(模拟点击关闭按钮)
driver.quit()
Run Code Online (Sandbox Code Playgroud)
退出浏览器(模拟选择退出选项)
driver.dispose()
Run Code Online (Sandbox Code Playgroud)
退出浏览器(尝试关闭每个选项卡,然后退出)
但是,如果您仍然遇到挂起实例的问题(就像我一样),您可能还想终止该实例。为此,您需要 chrome 实例的 PID。
driver.close()
Run Code Online (Sandbox Code Playgroud)
如果之后还有剩余的 chrome 实例,我会吃掉我的帽子。:(
| 归档时间: |
|
| 查看次数: |
105618 次 |
| 最近记录: |