Подтвердить что ты не робот

Освободить Selenium chromedriver.exe из памяти

Я установил код python для запуска Selenium chromedriver.exe. В конце выполнения у меня есть browser.close(), чтобы закрыть экземпляр. (browser = webdriver.Chrome()) Я считаю, что он должен выпустить chromedriver.exe из памяти (я на Windows 7). Однако после каждого запуска в памяти остается один экземпляр chromedriver.exe. Я надеюсь, что есть способ написать что-нибудь в python, чтобы убить процесс chromedriver.exe. Очевидно, что browser.close() не выполняет эту работу. Спасибо.

4b9b3361

Ответ 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

enter image description here

Ответ 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

В нижней строке... вам нужно как-то убить процесс, потому что дизайнеры не ввели его. Все остальные способы могут привести к запуску процесса, и этого достаточно, чтобы гарантировать убийство. Я открыт для вариантов.