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()
DELETE
s текущий сеанс просмотра посредством отправки команды "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()