CromeDriver не убивается как процесс

Такая проблема:

Если тест падает сам либо проходит полностью то хромдрайвер убивается нормально и в процессах не висит.

Если же руками стопаю тест - то хромдрайвер висит в процессах и его приходится убивать вручную

Это конечно не критикал проблема - но возникла такая ситуация что на билд агентах при запуске remote run'ом скопились очень много висящих процессов.

Как это можно обойти и сталкивался ли с этим кто-нибудь?

Спасибо!

 

ну понятно что он будет висеть, так как вы убили процесс, который отвечает за его открыие и закрытие

ну тут надо думать, я бы сделал внешнюю программу, которая убивает chrome процессы

или же стартовал chromedriverserver до выполенния тестов и закрывал после выполнения, а само выполнение запускал бы как отдельный процесс

а как вы запускаете chromedriver server на CI?

1 лайк

Сталкивался.  

Я так понимаю, что речь идет о Windows. Что скажу: проводил эксперименты (Windows 7 / 64), и, насколько я помню, то убить ненужные процессы (и даже по маске) получалось с помощью бесплатного командного процессора NirCmd от NirSoft . Из альтернатив ему припоминаю тоже бесплатный Comandiux. 

Гарантий не даю (я остановился на экспериментах), но можете попробовать.

а чем "родные" taskkill/pstools не устраивали?

На каком языке вы автоматизируете? В C# можно убить процесс сразу из теста без использования каких-то вспомогательных и не нужных действий.

Так оно в жизни получилось, что NirCmd дошел до меня раньше, чем информация о taskkill , "ну и вот так и живем".

А можно более конкретно, как это сделать!

Я скажу за python, тут или можно использовать os модуль

import os
os.system("taskkill /im chromedriver.exe")

или сторонний, например psutil Google Code Archive - Long-term storage for Google Code Project Hosting.

import psutil

PROCNAME = "chromedriver.exe"

for proc in psutil.process_iter():
    if proc.name == PROCNAME:
        proc.kill()
1 лайк

А если срабатывает Exception, разве не срабатывает после него tearDown() в котором можно сделать например driver.quit()?

Ну тут смотря как завершается процесс прогона тестов. Просто если java процесс убивают напрямую руками, то никакие методы не вызовутся.

@kerrigan Конечно я бы уточнил, как именно руками стопается тест? Я так понимаю, вы просто не дожидаетесь завершения выполнения тестов на CI останавливаете прогон тестов. Верно?

напишите, пожалуйста, где можно почитать более детально или может у вас есть пример решения этого вопроса на с#

в гугле есть ответ на всё, это раз

вот здесь в конце есть ответ, как искать процессы и уничтожать их