2

Когда моя программа selenium вылетает из-за некоторой ошибки, она, похоже, оставляет запущенные процессы.Селен оставляет за ходом процессы?

Например, вот мой список процессов:

carol 30186 0.0 0.0 103576 7196 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=51789 
carol 30322 0.0 0.0 102552 7160 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=33409 
carol 30543 0.0 0.0 102552 7104 pts/11 Sl 00:48 0:00 /home/carol/test/chromedriver --port=42567 
carol 30698 0.0 0.0 102552 7236 pts/11 Sl 00:50 0:00 /home/carol/test/chromedriver --port=46590 
carol 30938 0.0 0.0 102552 7496 pts/11 Sl 00:55 0:00 /home/carol/test/chromedriver --port=51930 
carol 31546 0.0 0.0 102552 7376 pts/11 Sl 01:16 0:00 /home/carol/test/chromedriver --port=53077 
carol 31549 0.5 0.0  0  0 pts/11 Z 01:16 0:03 [chrome] <defunct> 
carol 31738 0.0 0.0 102552 7388 pts/11 Sl 01:17 0:00 /home/carol/test/chromedriver --port=55414 
carol 31741 0.3 0.0  0  0 pts/11 Z 01:17 0:02 [chrome] <defunct> 
carol 31903 0.0 0.0 102552 7368 pts/11 Sl 01:19 0:00 /home/carol/test/chromedriver --port=54205 
carol 31906 0.6 0.0  0  0 pts/11 Z 01:19 0:03 [chrome] <defunct> 
carol 32083 0.0 0.0 102552 7292 pts/11 Sl 01:20 0:00 /home/carol/test/chromedriver --port=39083 
carol 32440 0.0 0.0 102552 7412 pts/11 Sl 01:24 0:00 /home/carol/test/chromedriver --port=34326 
carol 32443 1.7 0.0  0  0 pts/11 Z 01:24 0:03 [chrome] <defunct> 
carol 32691 0.1 0.0 102552 7360 pts/11 Sl 01:26 0:00 /home/carol/test/chromedriver --port=36369 
carol 32695 2.8 0.0  0  0 pts/11 Z 01:26 0:02 [chrome] <defunct> 

Вот мой код:

from selenium import webdriver 

browser = webdriver.Chrome("path/to/chromedriver") 
browser.get("http://stackoverflow.com") 
browser.find_element_by_id('...').click() 

browser.close() 

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

Это простой пример для простоты, но с более сложной программой selenium, что является гарантированным чистым способом выхода и не покидать запущенные процессы? Это должно чисто выйти из неожиданного краха и в успешном прогоне.

ответ

0

Происходит то, что ваш код генерирует исключение, останавливая процесс python от продолжения. Таким образом, методы close/quit никогда не вызываются в объекте браузера, поэтому хромированные рельсы просто бесконечно зависают.

Вам нужно использовать блок try/except, чтобы гарантировать, что метод close вызывается каждый раз, даже когда генерируется исключение. Очень упрощенно пример:

from selenium import webdriver 

browser = webdriver.Chrome("path/to/chromedriver") 
try: 
    browser.get("http://stackoverflow.com") 
    browser.find_element_by_id('...').click() 

except: 
    browser.close() 
    browser.quit() # I exclusively use quit 

Есть целый ряд гораздо более сложные подходов, которые можно предпринять здесь, например, как создание менеджера контекста для использования с with заявления, но его трудно рекомендовать один, не имея лучшим понимание вашей кодовой базы.

2

Chromedriver.exe запускает TaskManager (в случае Windows) каждый раз, когда Selenium запускается в Chrome. Иногда он не очищается, даже если браузер не сбой.

Обычно я запускаю файл bat или cmd, чтобы убить все существующие процессы chromedriver.exe перед запуском другого.

Взгляните на это: release Selenium chromedriver.exe from memory

  • Я знаю, что это Unix связанных вопрос, но я уверен, что так оно и было обработано в Windows, могут быть применены там.
+1

Вопрос, как представляется, связан с nix, учитывая пример вывода процесса. –

Смежные вопросы