2016-09-07 5 views
0

状況は次のとおりです。子プロセスで開かれたSeleniumブラウザを閉じる

WebDriverを開いて処理する子プロセスを作成します。子プロセスは厄介でエラーの可能性があります。その場合、すぐに終了し、メイン関数に制御が戻されます。ただし、この状況では、ブラウザはまだ開いています(子プロセスが完全に終了していないため)。子プロセスで初期化されたブラウザを閉じるにはどうすればよいですか?私がこれまで試した

アプローチ:

1)主な機能にwebdriverを初期化し、引数として子プロセスに渡します。

2)キューを使用して子プロセスと親プロセスの間でwebdriverを渡します。

コード:あなたは、新しいブラウザを開いたときにwebdriverをのプロセスIDを取得し、)(FOOで

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()はmain関数に入れても意味がありませんプロセス。 –

答えて

0

私は解決策を見つけました。プロセスIDをキューに追加します。次にmain関数で、1分待つためにtime.sleep(60)を追加し、キューからプロセスIDを取得し、try-exceptを使用して特定のプロセスIDを試行して終了します。

別のプロセスで実行されているfoo()がハングすると、ブラウザは1分後にmain関数で閉じられます。

関連する問題