Python Chromedriver End Task раздражает мерцание - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю приложение Tkinter с python, которое инициализирует несколько веб-драйверов селена. Первоначальной проблемой было то, что множество экземпляров chromedriver.exe заполняли пользовательскую память, даже после использования driver.quit() (иногда). Поэтому, чтобы избавиться от этой проблемы, при закрытии приложения tkinter я написал эту строку os.system("taskkill /f /im chromedriver.exe /T"), которая решает мою проблему, но, используя это, запускается экземпляр командной строки, который сам убивает почти мгновенно. Проблема в том, что пользователь может видеть это, и я нахожу это немного тревожным. Есть ли способ, которым я мог бы это скрыть? Или есть обходной путь для моей первоначальной проблемы, который удобен для пользователя?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Чтобы уменьшить объем памяти, вы должны использовать ChromeDriver-Service:

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

Поместите приведенный ниже код в chrome_factory.py, а затем:

  • при запуске программы chrome_factory.start_service ()
  • для создания нового вызова драйвера chrome_factory.create_driver ()
  • служба и драйверы будут автоматически остановлены / завершены при выходе из программы.

Использование этого подхода приведет к тому, что когда-либо будет только один процесс chromedriver.exe.

# chrome_factory.py
import atexit
from os.path import expanduser
from typing import Optional

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

EXECUTABLE = expanduser("~/bin/chromedriver")

_chrome_service: Optional[Service] = None


def start_service():
    global _chrome_service
    _chrome_service = Service(EXECUTABLE)
    _chrome_service.start()
    atexit.register(_chrome_service.stop)


def create_driver() -> webdriver.Remote:
    global _chrome_service

    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless")

    driver = webdriver.Remote(_chrome_service.service_url,
                              desired_capabilities=opts.to_capabilities())

    atexit.register(driver.quit)
    return driver


def main():
    start_service()
    for _ in range(20):
        create_driver()


if __name__ == '__main__':
    main()
0 голосов
/ 24 апреля 2020

Используйте в коде как driver.close (), так и driver.quit (), чтобы освободить память.

driver.close()
driver.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...