Как выйти из сеанса веб-браузера, когда Python завершает работу? - PullRequest
0 голосов
/ 07 мая 2019

Я пишу код на Python, где мне нужен веб-браузер селена внутри одного из моих классов.Я хочу, чтобы сеанс селена завершался правильно при выходе из python

Я сохраняю переменную webbrowser как поле моего класса.Чтобы выйти из сеанса, я решил вызвать метод quit() веб-браузера внутри метода __del__() моего класса, но он не сработал:

from selenium import webdriver
from sys import stderr

class MyClass:
    def __init__(self):
        opts = webdriver.chrome.options.Options()
        opts.add_argument('--headless')
        opts.add_argument('--no-sandbox')
        opts.add_argument('--disable-dev-shm-usage')
        assert opts.headless
        self.browser = webdriver.Chrome(options=opts)

    def __del__(self):
        self.browser.quit()
        stderr.write("Browser has been closed correctly!\n")

    # Other methods of my class

if __name__ == "__main__":
    a = MyClass()

Если сейчас я вызываю что-то вроде del a, Я получаю сообщение Browser has been closed correctly! и chromedriver исчезает из списка запущенных процессов.Но если я выхожу из Python, я получаю сообщение об ошибке:

Exception ignored in: <bound method MyClass.__del__ of <__main__.MyClass object at 0x7f37eb918898>>
Traceback (most recent call last):
  File "<stdin>", line 11, in __del__
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/chrome/webdriver.py", line 158, in quit
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 151, in stop
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 122, in send_remote_shutdown_command
ImportError: sys.meta_path is None, Python is likely shutting down

1 Ответ

1 голос
/ 07 мая 2019

Несколько других опций:

  • Реализация MyClass в качестве диспетчера контекста .В методе __exit__ выйдите из браузера.Затем используйте with MyClass() as mc..., при этом __exit__ будет вызвано после того, как блок завершится
  • Используйте atexit (я бы назвал это избыточным) - зарегистрируйте экземпляры MyClass дляобласть применения модуля;зарегистрировать функцию выхода, которая вызывает obj.browser.quit() для каждого зарегистрированного экземпляра при выходе из программы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...