Ich habe einen Python-Code eingerichtet, um Selenium auszuführen chromedriver.exe
. Am Ende des Laufs muss ich browser.close()
die Instanz schließen. ( browser = webdriver.Chrome()
) Ich glaube, es sollte chromedriver.exe
aus dem Speicher freigegeben werden (ich bin unter Windows 7). Nach jedem Lauf chromedriver.exe
verbleibt jedoch eine Instanz im Speicher. Ich hoffe, es gibt eine Möglichkeit, etwas in Python zu schreiben, um den chromedriver.exe
Prozess zu beenden . Offensichtlich browser.close()
macht die Arbeit nicht. Vielen Dank.
102
Antworten:
Gemäß der Selenium-API sollten Sie wirklich aufrufen,
browser.quit()
da diese Methode alle Fenster schließt und den Prozess abbricht. Sie sollten immer noch verwendenbrowser.quit()
.Allerdings : An meinem Arbeitsplatz haben wir ein großes Problem festgestellt, als wir versucht haben, Chromedriver-Tests auf der Java-Plattform auszuführen, auf der die chromedriver.exe auch nach der Verwendung noch vorhanden ist
browser.quit()
. Um dem entgegenzuwirken, haben wir eine Batch-Datei ähnlich der folgenden erstellt, die nur das Schließen der Prozesse erzwingt.kill_chromedriver.bat
Da chromedriver.exe kein großes Programm ist und nicht viel Speicher verbraucht, sollten Sie dies nicht jedes Mal ausführen müssen, sondern nur, wenn es ein Problem darstellt. Zum Beispiel, wenn Sie Project-> Clean in Eclipse ausführen.
quelle
quit
Methode ordnungsgemäß verwenden , sollte dies kein Problem sein. Das gewaltsame Abschalten der Prozesse sollte nur ein letzter Ausweg sein, und Ihre Antwort sollte dies widerspiegeln.X
, bleibt es bestehen. Das ist der EINZIGE Grund für diese Batch-Datei. Offensichtlichquit
ist der richtige Weg, aber in meinem Beispiel, wenn Sie debuggen und die Ausführung stoppen - es erreicht nie diequit
.I hope there is a way I can write something to kill the chromedriver.exe process.
. und ja das ist schön Java macht das nichtbrowser.close()
schließt nur das aktuelle Chromfenster.browser.quit()
sollte alle geöffneten Fenster schließen und dann den Webdriver beenden.quelle
browser.quit()
habe alle geöffneten Fenster geschlossen. Aber chromedriver.exe wurde nicht beendet. Und es gab eine Fehlermeldung 'InvalidURL: nicht numerischer Port:' Port ''.browser = webdriver.Firefox()
. Beidesbrowser.close()
undbrowser.quit()
würde alle Fenster schließen und Speicher freigeben. Chromedriver würde jedoch nicht dasselbe tun.Theoretisch werden durch das Aufrufen von browser.Quit alle Browser-Registerkarten geschlossen und der Vorgang abgebrochen.
In meinem Fall war ich jedoch nicht dazu in der Lage - da ich mehrere Tests gleichzeitig ausführte, wollte ich nicht einen Test durchführen, um Fenster für andere zu schließen. Wenn meine Tests beendet sind, werden daher noch viele "chromedriver.exe" -Prozesse ausgeführt.
Um dies zu überwinden, habe ich einen einfachen Bereinigungscode (C #) geschrieben:
quelle
Ich hatte Erfolg bei der Verwendung
driver.close()
vordriver.quit()
. Ich habe vorher nur benutztdriver.quit()
.quelle
quelle
Es ist irgendwie seltsam, aber es funktioniert bei mir. Ich hatte das ähnliche Problem, nach einigem Graben stellte ich fest, dass im Browser noch eine UI-Aktion ausgeführt wurde (URL-Laden oder so), als ich drückte
WebDriver.Quit()
.Die Lösung für mich (obwohl sehr böse) war,
Sleep()
3 Sekunden vor dem Aufruf von Quit () hinzuzufügen .quelle
WebDriver.Quit()
auch schon früher verwendet, aber manchmal hat es einen chrome.exe-Prozess am Leben gelassen. Ich denke auch, dass es nicht auf allen Betriebssystemen passiert.Mit dieser Antwort können Sie den Treiber in C # ordnungsgemäß entsorgen
Wenn Sie einen "richtigen" Mechanismus verwenden möchten, der zum "Aufräumen" nach dem Ausführen verwendet werden
ChromeDriver
sollte, sollten Sie diesen verwendenIWebDriver.Dispose();
Normalerweise implementiere ich eine
IDisposable
Klasse, mit der es zu tun hatIWebDriver
und benutze es wie:
Hoffe das spart dir etwas Zeit
quelle
using (var driver = new ChromeDriver()) { //my code here }
Manchmal, nicht immer, "etwas" (weiß nicht was ??) passiert undchromedriver.exe
ist laut meinem Taskmanager immer noch unveröffentlicht.Mehrere Prozesse über die Befehlszeile beenden Als Erstes müssen Sie eine Eingabeaufforderung öffnen und dann den Befehl taskkill mit der folgenden Syntax verwenden:
Diese Parameter beenden zwangsweise jeden Prozess, der mit dem Namen der von Ihnen angegebenen ausführbaren Datei übereinstimmt. Um beispielsweise alle Prozesse von iexplore.exe zu beenden, verwenden wir:
quelle
Code c #
using System.Diagnostics;
using System.Management;
und diese Funktion
Berufung
quelle
Ich hatte das gleiche Problem beim Ausführen in Python und musste den Befehl 'killall' manuell ausführen, um alle Prozesse zu beenden. Als ich den Treiber jedoch mithilfe des Python- Kontextverwaltungsprotokolls implementierte , waren jedoch alle Prozesse weg. Es scheint, dass der Python-Interpreter wirklich gute Arbeit beim Aufräumen leistet.
Hier ist die Implementierung:
Und die Verwendung:
quelle
Sie können also Folgendes verwenden:
Schließen Sie den Browser (emuliert das Drücken der Schaltfläche zum Schließen)
Beenden Sie den Browser (emuliert die Auswahl der Option zum Beenden)
Beenden Sie den Browser (versucht, jeden Tab zu schließen und dann zu beenden)
Wenn Sie jedoch NOCH auf Probleme mit hängenden Instanzen stoßen (wie ich), möchten Sie möglicherweise auch die Instanz beenden. Dazu benötigen Sie die PID der Chrome-Instanz.
Wenn danach noch eine Chrominstanz übrig ist, esse ich meinen Hut. :((
quelle
Python-Code:
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich dachte, ich würde mitteilen, was für mich funktioniert hat. Ich hatte Probleme mit Eclipse - es würde die Prozesse nicht abbrechen, und so hingen einige Phantomprozesse herum, nachdem ich den Code mit dem Eclipse-Runner getestet hatte.
Meine Lösung bestand darin, Eclipse als Administrator auszuführen. Das hat es für mich behoben. Es scheint, dass Windows Eclipse nicht erlaubt hat, den von ihm erzeugten Prozess zu schließen.
quelle
chromedriver.exe
bleibt in den Task-Manager-Prozessen sichtbar, unabhängig davon, ob ich Eclipse als Administrator oder normaler Benutzer starte. Es ist möglich , dass in meinem Fall das das Problem ist, dachromedriver.exe
ist 32 Bit und meine JRE ist 64 Bit. Eclipse Neon.1a (4.6.1), Windows 8.1 Pro 64 Bit, Java 1.8.0_92-b14.Ich habe das Folgende in nightwatch.js in afterEach hooks verwendet.
.closeWindow () schließt einfach das Fenster. (Funktioniert jedoch nicht für mehrere geöffnete Fenster). Während .end () alle verbleibenden Chrome-Prozesse beendet.
quelle
Ich habe dieses Problem. Ich vermute, es liegt an der Version von Serenity BDD und Selen. Der Chromedriver-Prozess wird erst freigegeben, wenn die gesamte Testsuite abgeschlossen ist. Es gibt nur 97 Tests, aber 97 Prozesse verbrauchen den Speicher eines Servers, der nicht über viele Ressourcen verfügt. Dies kann sich auf die Leistung auswirken.
Um das anzusprechen, habe ich zwei Dinge getan (dies ist spezifisch für Windows).
Vor jedem Test (mit @Before kommentiert) erhalten Sie die Prozess-ID (PID) des Chromedriver-Prozesses mit:
Nach jedem Test (mit @After kommentiert) töten Sie die PID mit:
quelle
Ich kam hierher und dachte anfangs, dass dies sicherlich beantwortet / gelöst worden wäre, aber nachdem ich alle Antworten gelesen hatte, war ich ein bisschen überrascht, dass niemand versuchte, alle drei Methoden zusammenzurufen:
Ich war nur hier, um nach Antworten zu suchen, und hatte nicht vor, eine zu liefern. Die obige Lösung basiert also nur auf meiner Erfahrung. Ich habe den Chrome-Treiber in einer C # -Konsolen-App verwendet und konnte die verbleibenden Prozesse erst bereinigen, nachdem alle drei Methoden zusammen aufgerufen wurden.
quelle
Für Ubuntu / Linux-Benutzer: - Der Befehl lautet entweder
pkill
oderkillall
.pkill
wird allgemein empfohlen, da auf einigen Systemenkillall
tatsächlich alle Prozesse abgebrochen werden.quelle
Ich benutze Protractor mit directConnect. Durch Deaktivieren der Option "--no-sandbox" wurde das Problem für mich behoben.
quelle
Hinweis: Wenn wir jetzt den Task-Manager sehen, hängen noch keine Treiber oder Chrome-Prozesse
quelle
Ich habe mir alle Antworten angesehen und alle getestet. Ich habe sie alle als "Sicherheitsverschluss" zusammengefasst. Dies in c #
HINWEIS Sie können den Parameter von der IModule-App in den des tatsächlichen Treibers ändern.
quelle
Beobachtet in Version 3.141.0:
Wenn Sie Ihren ChromeDriver nur mit ChromeOptions initialisieren, wird quit () chromedriver.exe nicht schließen.
Wenn Sie einen ChromeDriverService erstellen und übergeben, wird quit () chromedriver.exe korrekt schließen.
quelle
Ich benutze einfach in jedem Test eine Methode tearDown () wie folgt und ich habe überhaupt kein Problem.
Löschen Sie die Treiberinstanz nach dem Beenden aus dem Cache mit driver = null
Hoffe die Antwort auf die Frage
quelle
Es gibt einen anderen Weg, der nur für Windows funktioniert, aber jetzt ist er veraltet. Es funktioniert für frühere Selen-Versionen (es funktioniert auf Version 3.11.0).
quelle
Sie sollten sich kurz vor dem Beenden bewerben
quelle