2

Wenn mein Selen-Programm aufgrund eines Fehlers abstürzt, scheint es laufende Prozesse zurückzulassen.Selen hinterlässt laufende Prozesse?

Zum Beispiel, hier ist meine Prozessliste:

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> 

Hier ist mein Code:

from selenium import webdriver 

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

browser.close() 

Manchmal macht der Browser schnell genug, um die Webseitenelemente nicht geladen werden, so stürzt Selenium, wenn es versucht auf etwas zu klicken, das es nicht gefunden hat. Zu anderen Zeiten funktioniert es gut.

Dies ist ein einfaches Beispiel der Einfachheit halber, aber mit einem komplexeren Selen-Programm, was ist ein garantiert sauberer Weg, um laufende Prozesse zu verlassen und nicht zu verlassen? Es sollte sauber bei einem unerwarteten Absturz und bei einem erfolgreichen Lauf beendet werden.

Antwort

0

Was passiert, ist, dass Ihr Code eine Ausnahme auslöst, was den Python-Prozess daran hindert weiterzumachen. Daher werden die close/quit-Methoden niemals für das Browser-Objekt aufgerufen, sodass die Chrom-Driver nur auf unbestimmte Zeit abhängen.

Sie müssen einen try/except-Block verwenden, um sicherzustellen, dass die close-Methode jedes Mal aufgerufen wird, auch wenn eine Ausnahme ausgelöst wird. Ein sehr einfaches Beispiel ist:

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 

Es gibt eine Reihe von viel anspruchsvollere Ansätze sind Sie hier nehmen können, wie zum Beispiel einen Kontextmanager die Erstellung mit der with Anweisung zu verwenden, aber es ist schwer zu empfehlen, ohne eine besser mit Verständnis Ihrer Codebasis.

2

Chromedriver.exe zerstört den TaskManager (im Falle von Windows) jedes Mal, wenn Selenium auf Chrome läuft. Manchmal wird es nicht gelöscht, auch wenn der Browser nicht abstürzt.

Normalerweise führe ich eine Fledermausdatei oder einen Cmd aus, um alle vorhandenen Prozesse von chromedriver.exe zu beenden, bevor ich einen anderen starte.

Werfen Sie einen Blick auf diese: release Selenium chromedriver.exe from memory

  • Ich weiß, dass dies ein Unix-bezogene Frage ist, aber ich bin sicher, so wie es in Windows behandelt wurde dort angewendet werden kann.
+1

Die Frage scheint * nix bezogen auf die Ausgabe des Beispielprozesses zu sein. –