2016-09-07 1 views
0

Вот ситуация:Закрытие Селен Браузер, который был открыт в дочернем процессе

создать дочерний процесс, который открывает и занимается с WebDriver. Детский процесс является исчерпывающим и может привести к ошибке, и в этом случае он будет немедленно закрыт, и управление будет возвращено основной функции. Однако в этой ситуации браузер все равно будет открыт (так как дочерний процесс никогда не завершался полностью). Как закрыть браузер, который инициализируется в дочернем процессе?

подходов я пытался до сих пор:

1) Инициализация WebDriver в основной функции и передавая ее дочерний процесс в качестве аргумента.

2) Передача webdriver между дочерним и родительским процессом с использованием очереди.

Код:

import multiprocessing 

def foo(queue): 
    driver = webdriver.Chrome() 
    queue.put(driver) 
    # Do some other stuff 

    # If finicky stuff happens, this driver.close() will not run 
    driver.close() 

if __name__ == '__main__': 

    queue = multiprocessing.Queue() 
    p = multiprocessing.Process(target=foo, name='foo', args=(queue,)) 

    # Wait for process to finish 

    # Try to close the browser if still open 
    try: 
     driver = queue.get() 
     driver.close() 
    except: 
     pass 
+0

вы можете использовать метод driver.quit() для закрытия браузера – Piyush

+0

Нет, это не закроет браузер. Драйвер инициализируется в дочернем процессе, который иногда «зависает». Это означает, что 1) driver.quit() не всегда будет достигнут, если я положу его в foo(), 2) driver.quit() будет бессмысленным, если я поместил его в основную функцию, поскольку драйвер был инициализирован в отдельном обработать. –

ответ

0

Я нашел решение:

В Foo(), получить идентификатор процесса WebDriver при открытии нового браузера. Добавьте идентификатор процесса в очередь. Затем в основной функции добавьте time.sleep (60), чтобы подождать минуту, затем получите идентификатор процесса из очереди и используйте try-except, чтобы попытаться закрыть конкретный идентификатор процесса.

Если foo() работает в отдельном процессе, то через одну минуту браузер будет закрыт в основной функции.