Python «с» инструкцией для драйвера Selenium

#python #python-3.x #selenium #selenium-webdriver #with-statement

#python #python-3.x #selenium #selenium-webdriver #с помощью инструкции

Вопрос:

Часть моего скрипта удаляет результаты из Selenium WebDriver, и поскольку предполагается, что мой код будет выполняться вечно (пока я его не закрою) На самом деле у меня нет способа реализовать driver.quit() метод. Я пытался сделать это с помощью инструкции «with», но драйвер просто закрывается после init_driver() выполнения:

 from selenium import webdriver

def init_driver():
    driver = webdriver.Firefox(executable_path='geckodriver.exe')
    driver.get('https://www.lsbet.com/live')

    return driver

while True:
    with init_driver() as driver:
        ... # Do something
  

Ответ №1:

Может быть, это

 with init_driver() as driver:
    while True:
        #...Do stuff
        if condition == False:
            driver.quit()
            break
  

Ответ №2:

Я думаю, вы можете, в частности, использовать contextlib из стандартной библиотеки, чтобы фактически реализовать свою init_driver функцию в качестве менеджера контекста.

Например, используя простейший способ с @contextlib.contextmanager декоратором, это может быть что-то вроде :

 from contextlib import contextmanager

@contextmanager
def init_driver(options, profile):
    try:
        driver = webdriver.Firefox(executable_path='geckodriver.exe')
        driver.get('https://www.lsbet.com/live')
        yield driver
    finally:
        # code to close/quit your driver
        pass
  

(обратите внимание на использование yield вместо return )

Ответ №3:

Вы можете использовать диспетчер контекста.

 class SeleniumManager:
    def __init__(self):
        pass

    def __enter__(self):
        # Setup logic goes here...
        print('I have started...')

    def __exit__(self, exc_type, exc_val, exc_tb):
        # Teardown logic goes here...
        print('I am finished...')

with SeleniumManager() as sm:
    # Your logic here...
    print('I am working on something...')
  

После завершения вашей логики в инструкции with диспетчер контекста автоматически вызовет метод exit().