Вопрос-ответ

Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?

Selenium : как остановить процесс geckodriver, влияющий на память ПК, без вызова driver.quit()?

Есть тест, что-то вроде:

 import //needed imports

public class TestClass{
WebDriver driver;

@Before
public void setUp() {
//some code
}

@Test
public void test1() {
//some code, including init of driver (geckodriver)
}

//@After
// public void tearDown() {
// driver.quit();
//}
}

Итак, я запустил geckodriver и успешно запустил свои тесты, используя экземпляры firefox.
Но я не хочу закрывать окно firefox после каждого запуска, потому что я просто хочу проанализировать, что у меня есть, и исправить все необходимое после тестового запуска (я собираюсь раскомментировать driver.quit () позже).
В то же время каждый вызов без закрытия драйвера приводит к перегрузке оперативной памяти на моем ПК (и не имеет значения - закрывал я браузер вручную или нет после тестирования):
введите описание изображения здесь

Итак, вопрос: есть ли какой-либо способ закрыть процесс (точнее - сделать что-то, что закроет geckodriver.exe процесс в taskmgr) "geckodriver", но НЕ закроет браузер после завершения теста? например, добавление какого-либо метода в сам тест, что угодно... Это не влияет на мою работу / сам тест, я просто хочу добавить некоторую оптимизацию.

Переведено автоматически
Ответ 1

Согласно вашему вопросу, комментирование driver.quit() just Not to close firefox window after each run, because I just want to analyse what I have не будет частью рекомендаций.

Для любого подробного анализа мы можем создавать записи в журнале и делать моментальные снимки.

При автоматизации через Selenium в соответствии с рекомендациями вы должны вызвать quit() метод внутри tearDown() {}. Вызываем quit() DELETEs текущий сеанс просмотра посредством отправки команды "quit" с {"flags": ["eForceQuit"]} и, наконец, отправляем запрос GET при / завершении работы EndPoint. Вот пример ниже :

1503397488598   webdriver::server   DEBUG   -> DELETE /session/8e457516-3335-4d3b-9140-53fb52aa8b74 
1503397488607 geckodriver::marionette TRACE -> 37:[0,4,"quit",{"flags":["eForceQuit"]}]
1503397488821 webdriver::server DEBUG -> GET /shutdown

Таким образом, при вызове quit() метода Web Browser сеанс и WebDriver экземпляр полностью завершаются. Следовательно, вам не нужно включать какие-либо дополнительные шаги, которые будут накладными расходами.


Решение

Тем не менее, если вы хотите выполнить уничтожение зависших WebDriver экземпляров, например, GeckoDriver.exe экземпляров, вы можете использовать любой из следующих блоков кода, чтобы уничтожить любой из зависших WebDriver экземпляров :


  • Решение Java (Windows):


    import java.io.IOException;

    public class Kill_ChromeDriver_GeckoDriver_IEDriverserver
    {
    public static void main(String[] args) throws Exception
    {
    Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe /T");
    Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
    Runtime.getRuntime().exec("taskkill /F /IM IEDriverServer.exe /T");
    }
    }

  • Решение на Python (Windows):


    import os
    os.system("taskkill /f /im geckodriver.exe /T")
    os.system("taskkill /f /im chromedriver.exe /T")
    os.system("taskkill /f /im IEDriverServer.exe /T")

  • Python Solution(Cross Platform):


    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()

java selenium