2

セレンプログラムが何らかのエラーでクラッシュすると、実行中のプロセスの後ろに残っているようです。セレンは実行中のプロセスの後ろに残っていますか?

たとえば、ここに私のプロセスのリストは、次のとおりです。ここで

carol 30186 0.0 0.0 103576 7196 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=51789 
carol 30322 0.0 0.0 102552 7160 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=33409 
carol 30543 0.0 0.0 102552 7104 pts/11 Sl 00:48 0:00 /home/carol/test/chromedriver --port=42567 
carol 30698 0.0 0.0 102552 7236 pts/11 Sl 00:50 0:00 /home/carol/test/chromedriver --port=46590 
carol 30938 0.0 0.0 102552 7496 pts/11 Sl 00:55 0:00 /home/carol/test/chromedriver --port=51930 
carol 31546 0.0 0.0 102552 7376 pts/11 Sl 01:16 0:00 /home/carol/test/chromedriver --port=53077 
carol 31549 0.5 0.0  0  0 pts/11 Z 01:16 0:03 [chrome] <defunct> 
carol 31738 0.0 0.0 102552 7388 pts/11 Sl 01:17 0:00 /home/carol/test/chromedriver --port=55414 
carol 31741 0.3 0.0  0  0 pts/11 Z 01:17 0:02 [chrome] <defunct> 
carol 31903 0.0 0.0 102552 7368 pts/11 Sl 01:19 0:00 /home/carol/test/chromedriver --port=54205 
carol 31906 0.6 0.0  0  0 pts/11 Z 01:19 0:03 [chrome] <defunct> 
carol 32083 0.0 0.0 102552 7292 pts/11 Sl 01:20 0:00 /home/carol/test/chromedriver --port=39083 
carol 32440 0.0 0.0 102552 7412 pts/11 Sl 01:24 0:00 /home/carol/test/chromedriver --port=34326 
carol 32443 1.7 0.0  0  0 pts/11 Z 01:24 0:03 [chrome] <defunct> 
carol 32691 0.1 0.0 102552 7360 pts/11 Sl 01:26 0:00 /home/carol/test/chromedriver --port=36369 
carol 32695 2.8 0.0  0  0 pts/11 Z 01:26 0:02 [chrome] <defunct> 

は私のコードです:

from selenium import webdriver 

browser = webdriver.Chrome("path/to/chromedriver") 
browser.get("http://stackoverflow.com") 
browser.find_element_by_id('...').click() 

browser.close() 

ときにセレンがクラッシュしたので時々、ブラウザが十分に迅速にWebページ要素をロードしません。見つからなかったものをクリックしようとします。それ以外の時間はうまく動作します。

これは簡単な例ですが、より複雑なセレン​​プログラムでは、実行中のプロセスを残すことなく、正常に終了することが保証されていますか?予期せぬクラッシュや成功した実行できれいに終了する必要があります。

答えて

0

あなたのコードでは例外がスローされ、Pythonプロセスが続行されなくなります。そのため、close/quitメソッドはブラウザーオブジェクトに対して呼び出されることはありません。そのため、クロムドライバーは無期限にハングアウトします。

try/exceptブロックを使用すると、例外がスローされた場合でも、いつでもcloseメソッドが呼び出されるようにする必要があります。非常に単純化した例は以下のとおりです。

from selenium import webdriver 

browser = webdriver.Chrome("path/to/chromedriver") 
try: 
    browser.get("http://stackoverflow.com") 
    browser.find_element_by_id('...').click() 

except: 
    browser.close() 
    browser.quit() # I exclusively use quit 

良くしなくても、1を推奨するなどwith文で使用するコンテキストマネージャを作成するなどあなたがここに取ることができますはるかに洗練されたアプローチの数が、その困難があります。あなたのコードベースの理解。

2

Chromedriver.exeは、Chromeが動作するたびにTaskManager(Windowsの場合)に参加します。ブラウザがクラッシュしなくてもクリアされないことがあります。

私は通常、別のものを起動する前に、既存のchromedriver.exeプロセスをすべて終了させるために、batファイルまたはcmdを実行します。

はこれを見てみましょう:release Selenium chromedriver.exe from memory

  • 私は、これはUnixの関連質問ですが、私はそれがWindows上で処理された方法が適用されると確信して知っています。
+1

例のプロセス出力では、* nix関連の問題があるようです。 –

関連する問題