Я установил код python для запуска Selenium chromedriver.exe
. В конце выполнения у меня есть browser.close()
, чтобы закрыть экземпляр. (browser = webdriver.Chrome()
) Я считаю, что он должен выпустить chromedriver.exe
из памяти (я на Windows 7). Однако после каждого запуска в памяти остается один экземпляр chromedriver.exe
. Я надеюсь, что есть способ написать что-нибудь в python, чтобы убить процесс chromedriver.exe
. Очевидно, что browser.close()
не выполняет эту работу. Спасибо.
Освободить Selenium chromedriver.exe из памяти
Ответ 1
для API Selenium, вы действительно должны называть browser.quit()
, поскольку этот метод закрывает все окна и убивает процесс. Вы должны использовать browser.quit()
.
Тем не менее: на моем рабочем месте мы заметили огромную проблему при попытке выполнить тесты хромирования на платформе Java, где 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
Так как chromedriver.exe не является огромной программой и не потребляет много памяти, вам не нужно запускать ее каждый раз, но только тогда, когда возникает проблема. Например, при запуске Project- > Clean в Eclipse.
Ответ 2
browser.close()
закрывает только текущее хромированное окно.
browser.quit()
должен закрыть все открытые окна, а затем выйти из webdriver.
Ответ 3
Теоретически, вызов browser.Quit закрывает все вкладки браузера и убивает процесс.Однако в моем случае я не смог этого сделать - поскольку параллельно выполнял несколько тестов, я не хотел, чтобы один тест закрывал окна другим. Поэтому, когда мои тесты закончатся, все еще осталось много процессов "chromedriver.exe".
Чтобы преодолеть это, я написал простой код очистки (С#):
Process[] chromeDriverProcesses = Process.GetProcessesByName("chromedriver");
foreach(var chromeDriverProcess in chromeDriverProcesses)
{
chromeDriverProcess.Kill();
}
Ответ 4
У меня был успех при использовании driver.close()
до driver.quit()
. Раньше я использовал только driver.quit()
.
Ответ 5
//Calling close and then quit will kill the driver running process.
driver.close();
driver.quit();
Ответ 6
Этот ответ как правильно утилизировать драйвер в С#
Если вы хотите использовать "правильный" механизм, который следует использовать для " ChromeDriver
" после запуска ChromeDriver
вам следует использовать IWebDriver.Dispose();
Выполняет определенные пользователем задачи, связанные с освобождением, освобождением или сбросом неуправляемых ресурсов. (Унаследовано от IDisposable.)
Я обычно реализую IDisposable
на классе, который имеет дело с IWebDriver
public class WebDriverController : IDisposable
{
public IWebDriver Driver;
public void Dispose()
{
this.Driver.Dispose();
}
}
и используйте это как:
using (var controller = new WebDriverController())
{
//code goes here
}
Надеюсь, это сэкономит вам время
Ответ 7
Это странно, но это работает для меня. У меня была аналогичная проблема, после некоторого рытья я обнаружил, что в браузере все еще есть действие пользовательского интерфейса (загрузка URL-адреса или так), когда я нажал WebDriver.Quit()
.
Решение для меня (весьма противное) заключалось в том, чтобы добавить Sleep()
за 3 секунды до вызова Quit().
Ответ 8
Код С#
с использованием System.Diagnostics;
с использованием 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;
}
}
}
и эта функция
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.
}
}
Вызов
try
{
KillProcessAndChildren("chromedriver.exe");
}
catch
{
}
Ответ 9
У меня была такая же проблема при запуске в Python, и мне пришлось вручную запустить команду killall, чтобы убить все процессы. Однако, когда я реализовал драйвер, используя протокол Python протокол управления контекстом, все процессы исчезли. Похоже, что интерпретатор Python делает действительно хорошую работу по очистке вещей.
Вот реализация:
class Browser:
def __enter__(self):
self.options = webdriver.ChromeOptions()
self.options.add_argument('headless')
self.driver = webdriver.Chrome(chrome_options=self.options)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.driver.close()
self.driver.quit()
И использование:
with Browser() as browser:
browser.navigate_to_page()
Ответ 10
Я использовал ниже в nightwatch.js в ловушках afterEach.
afterEach: function(browser, done) {
// performing an async operation
setTimeout(function() {
// finished async duties
done();
browser.closeWindow();
browser.end();
}, 200);
}
.closeWindow() просто закрывает окно. (Но не будет работать для нескольких открытых окон). Принимая во внимание, что .end() завершает все оставшиеся процессы Chrome.
Ответ 11
Код Python:
try:
# do my automated tasks
except:
pass
finally:
driver.close()
driver.quit()
Ответ 12
Итак, вы можете использовать следующее:
driver.close()
Закройте браузер (эмулирует нажатие кнопки закрытия)
driver.quit()
Выйти из браузера (эмулирует выбор опции выхода)
driver.dispose()
Выйдите из браузера (попытайтесь закрыть каждую вкладку и выйти)
Тем не менее, если у вас все еще возникают проблемы с зависанием экземпляров (как я), вы можете также убить экземпляр. Для этого вам понадобится PID экземпляра Chrome.
import os
import signal
driver = webdriver.Chrome()
driver.get(('http://stackoverflow.com'))
def get_pid(passdriver):
chromepid = int(driver.service.process.pid)
return (chromepid)
def kill_chrome(thepid)
try:
os.kill(pid, signal.SIGTERM)
return 1
except:
return 0
print ("Loaded thing, now I'mah kill it!")
try:
driver.close()
driver.quit()
driver.dispose()
except:
pass
kill_chrome(chromepid)
Если после этого останется экземпляр Chrome, я съем свою шляпу. :(
Ответ 13
Я знаю, что это несколько старый вопрос, но я думал, что делюсь тем, что сработало для меня. У меня возникли проблемы с Eclipse - это не убьет процессы, и поэтому у меня возникла куча phantom процессов, зависающих после тестирования кода с помощью бегуна Eclipse.
Моим решением было запустить Eclipse в качестве администратора. Это исправило это для меня. Похоже, что Windows не разрешала Eclipse закрыть процесс, который он породил.
Ответ 14
У меня есть эта проблема. Я подозреваю, что это связано с версией Serenity BDD и Selenium. Процесс хромирования никогда не выпускается до тех пор, пока весь комплект тестов не завершится. Есть только 97 тестов, но 97 процессов съедают память сервера, у которого не так много ресурсов, может повлиять на производительность.
Для адресации я сделал 2 вещи (это касается окон).
-
перед каждым тестом (аннотируется с @Before) получает идентификатор процесса (PID) процесса хромирования с помощью:
List<Integer> pids = new ArrayList<Integer>(); String out; Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq chromedriver.exe*\""); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((out = input.readLine()) != null) { String[] items = StringUtils.split(out, " "); if (items.length > 1 && StringUtils.isNumeric(items[1])) { pids.add(NumberUtils.toInt(items[1])); } }
-
после каждого теста (аннотируется с @After) убивает PID с помощью:
Runtime.getRuntime().exec("taskkill /F /PID " + pid);
Ответ 15
Я пришел сюда изначально, думая наверняка, что это было бы отвечено/разрешено, но после прочтения всех ответов я был немного удивлен, никто не пытался назвать все три метода вместе:
try
{
blah
}
catch
{
blah
}
finally
{
driver.Close(); // Close the chrome window
driver.Quit(); // Close the console app that was used to kick off the chrome window
driver.Dispose(); // Close the chromedriver.exe
}
Я был только здесь, чтобы искать ответы и не собирался его предоставлять. Таким образом, вышеупомянутое решение основано только на моем опыте. Я использовал драйвер chrome в приложении консоли С#, и я смог очистить затяжные процессы только после вызова всех трех методов вместе.
Ответ 16
Для пользователей Ubuntu/Linux: - это либо pkill
либо killall
. Обычно рекомендуется использовать pkill
, так как в некоторых системах killall
фактически убивает все процессы.
Ответ 17
Убить несколько процессов из командной строки Первое, что вам нужно сделать, это открыть командную строку, а затем использовать команду taskkill со следующим синтаксисом:
taskkill /F /IM <processname.exe> /T
Эти параметры принудительно уничтожат любой процесс, соответствующий имени исполняемого файла, который вы укажете. Например, чтобы убить все процессы iexplore.exe, используйте:
taskkill /F /IM iexplore.exe
Ответ 18
Я использую транспортир с DirectConnect. Отключение опции --no-sandbox решило проблему для меня.
// Capabilities to be passed to the webdriver instance.
capabilities: {
'directConnect': true,
'browserName': 'chrome',
chromeOptions: {
args: [
//"--headless",
//"--hide-scrollbars",
"--disable-software-rasterizer",
'--disable-dev-shm-usage',
//"--no-sandbox",
"incognito",
"--disable-gpu",
"--window-size=1920x1080"]
}
},
Ответ 19
- Убедитесь, что вы получаете экземпляр Driver как Singleton
- затем применить в конце
- driver.close()
- driver.quit()
Примечание. Теперь, если мы увидим диспетчер задач, вы не найдете ни одного драйвера или процесса chrome, который по-прежнему зависает.
Ответ 20
Я посмотрел на все ответы и проверил их все. Я в значительной степени скомпилировал их все в один как "Закрытие безопасности". Это в С#
Обратите внимание, что вы можете изменить параметр из приложения IModule на параметр фактического драйвера.
public class WebDriverCleaner
{
public static void CloseWebDriver(IModule app)
{
try
{
if (app?.GetDriver() != null)
{
app.GetDriver().Close();
Thread.Sleep(3000); // Gives time for everything to close before quiting
app.GetDriver().Quit();
app.GetDriver().Dispose();
KillProcessAndChildren("chromedriver.exe"); // One more to make sure we get rid of them chromedrivers.
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
public static 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;
}
}
}
public static 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.
}
}
}
Ответ 21
В нижней строке... вам нужно как-то убить процесс, потому что дизайнеры не ввели его. Все остальные способы могут привести к запуску процесса, и этого достаточно, чтобы гарантировать убийство. Я открыт для вариантов.