Skonfigurowałem kod Pythona, aby uruchomić Selenium chromedriver.exe
. Pod koniec biegu muszę browser.close()
zamknąć instancję. ( browser = webdriver.Chrome()
) Uważam, że powinien zwolnić się chromedriver.exe
z pamięci (pracuję na Windows 7). Jednak po każdym uruchomieniu chromedriver.exe
w pamięci pozostaje jedna instancja. Mam nadzieję, że jest sposób, w jaki mogę napisać coś w Pythonie, aby zabić chromedriver.exe
proces. Oczywiście browser.close()
nie działa. Dzięki.
102
Odpowiedzi:
zgodnie z API Selenium, naprawdę powinieneś wywołać,
browser.quit()
ponieważ ta metoda zamknie wszystkie okna i zabije proces. Nadal powinieneś używaćbrowser.quit()
.Jednak : w moim miejscu pracy zauważyliśmy ogromny problem podczas próby wykonania testów chromedriver na platformie Java, gdzie plik chromedriver.exe nadal istnieje nawet po użyciu
browser.quit()
. Aby temu przeciwdziałać, stworzyliśmy plik wsadowy podobny do tego poniżej, który po prostu wymusza zamknięcie procesów.kill_chromedriver.bat
Ponieważ chromedriver.exe nie jest dużym programem i nie zużywa dużo pamięci, nie powinieneś go uruchamiać za każdym razem, ale tylko wtedy, gdy stwarza problem. Na przykład podczas uruchamiania Project-> Clean in Eclipse.
źródło
quit
metodę, nie powinno to stanowić problemu. Zabijanie procesów na siłę powinno być tylko ostatecznością, a twoja odpowiedź powinna to odzwierciedlać.X
, nadal pozostaje. to JEDYNY powód dla tego pliku wsadowego. Oczywiściequit
jest to droga do zrobienia, jednak w moim przykładzie, jeśli debugujesz i zatrzymasz wykonywanie - nigdy nie osiągniequit
.I hope there is a way I can write something to kill the chromedriver.exe process.
. i tak, to jest miłe! Java tego nie robibrowser.close()
zamknie tylko bieżące okno chrome.browser.quit()
powinien zamknąć wszystkie otwarte okna, a następnie zamknąć sterownik sieciowy.źródło
browser.quit()
zamknął wszystkie otwarte okna. Ale chromedriver.exe nie został zamknięty. Pojawił się komunikat o błędzie „Nieprawidłowy adres URL: nieliczbowy port:„ port ””.browser = webdriver.Firefox()
. Obiebrowser.close()
ibrowser.quit()
zamkną wszystkie okna i zwolnią pamięć. Jednak chromedriver nie zrobiłby tego samego.Teoretycznie wywołanie browser.Quit zamknie wszystkie karty przeglądarki i zakończy proces.
Jednak w moim przypadku nie byłem w stanie tego zrobić - skoro równolegle prowadziłem wiele testów, nie chciałem, aby jeden test zamykał okna dla innych. Dlatego po zakończeniu testów nadal działa wiele procesów „chromedriver.exe”.
Aby temu zaradzić, napisałem prosty kod porządkujący (C #):
źródło
Miałem sukces, używając
driver.close()
wcześniejdriver.quit()
. Wcześniej używałem tylkodriver.quit()
.źródło
źródło
To trochę dziwne, ale dla mnie działa. Miałem podobny problem, po pewnym kopaniu odkryłem, że w przeglądarce nadal trwa akcja interfejsu użytkownika (ładowanie adresu URL lub coś podobnego), kiedy trafiłem
WebDriver.Quit()
.Rozwiązaniem dla mnie (choć bardzo paskudnym) było dodanie
Sleep()
3 sekund przed wywołaniem Quit ().źródło
WebDriver.Quit()
również wcześniej, ale czasami było to pozostawiając jeden proces chrome.exe żyje. Wydaje mi się, że nie dzieje się to we wszystkich systemach operacyjnych.Ta odpowiedź brzmi, jak prawidłowo pozbyć się sterownika w C #
Jeśli chcesz użyć „właściwego” mechanizmu, którego należy użyć do „uporządkowania” po uruchomieniu
ChromeDriver
, powinieneś użyćIWebDriver.Dispose();
Zwykle wdrażam
IDisposable
na zajęciach, z którymi mam do czynieniaIWebDriver
i używaj go jak:
Mam nadzieję, że zaoszczędzi ci to trochę czasu
źródło
using (var driver = new ChromeDriver()) { //my code here }
Czasami, nie zawsze, „coś” (nie wiem co ??) dzieje się ichromedriver.exe
według mojego menedżera zadań nadal nie zostało wydane.Zabij wiele procesów z wiersza poleceń Pierwszą rzeczą, którą musisz zrobić, to otworzyć wiersz polecenia, a następnie użyć polecenia taskkill z następującą składnią:
Te parametry wymuszą zabicie każdego procesu pasującego do nazwy pliku wykonywalnego, który określisz. Na przykład, aby zabić wszystkie procesy iexplore.exe, użylibyśmy:
źródło
Kod c #
using System.Diagnostics;
using System.Management;
i ta funkcja
Powołanie
źródło
Miałem ten sam problem podczas uruchamiania go w Pythonie i musiałem ręcznie uruchomić polecenie „killall”, aby zabić wszystkie procesy. Jednak kiedy zaimplementowałem sterownik przy użyciu protokołu zarządzania kontekstem Pythona wszystkie procesy zniknęły. Wygląda na to, że interpreter Pythona naprawdę dobrze radzi sobie z porządkowaniem rzeczy.
Oto realizacja:
I użycie:
źródło
Możesz więc użyć następujących:
Zamknij przeglądarkę (emuluje naciśnięcie przycisku zamykania)
Zamknij przeglądarkę (emuluje wybranie opcji wyjścia)
Zamknij przeglądarkę (próbuje zamknąć każdą kartę, a następnie zamknij)
Jeśli jednak NADAL masz problemy z zawieszonymi instancjami (tak jak ja), możesz również chcieć zabić instancję. Aby to zrobić, potrzebujesz PID instancji chrome.
Jeśli po tym pozostanie chromowana instancja, zjem kapelusz. :(
źródło
Kod Pythona:
źródło
Wiem, że jest to trochę stare pytanie, ale pomyślałem, że podzielę się tym, co zadziałało. Miałem problemy z Eclipse - nie zabijało to procesów, więc po przetestowaniu kodu przy użyciu Eclipse runner kręciło się kilka procesów fantomowych.
Moim rozwiązaniem było uruchomienie Eclipse jako administrator. To naprawiło to dla mnie. Wygląda na to, że system Windows nie pozwolił Eclipse na zamknięcie uruchomionego procesu.
źródło
chromedriver.exe
pozostaje widoczne wśród procesów Menedżera zadań bez względu na to, czy uruchamiam Eclipse jako administrator czy zwykły użytkownik. Jest możliwe, że w moim przypadku to jest problem, bochromedriver.exe
jest 32 bitowy i mój JRE jest 64-bitowy. Eclipse Neon.1a (4.6.1), Windows 8.1 Pro w wersji 64-bitowej, Java 1.8.0_92-b14.Użyłem poniższego w nightwatch.js w afterEach hooków.
.closeWindow () po prostu zamyka okno. (Ale nie będzie działać dla wielu otwartych okien). Natomiast .end () kończy wszystkie pozostałe procesy chrome.
źródło
Mam ten problem. Podejrzewam, że jest to spowodowane wersją Serenity BDD i Selenium. Proces chromedriver nigdy nie jest zwalniany, dopóki cały zestaw testów nie zostanie zakończony. Jest tylko 97 testów, ale fakt, że 97 procesów pochłania pamięć serwera, który nie ma zbyt wielu zasobów, może mieć wpływ na wydajność.
Aby rozwiązać problem, zrobiłem 2 rzeczy (jest to specyficzne dla systemu Windows).
przed każdym testem (z adnotacją @Before) pobierz identyfikator procesu (PID) procesu chromedriver z:
po każdym teście (z adnotacją @After) zabij PID za pomocą:
źródło
Przyszedłem tutaj początkowo myśląc, że z pewnością byłoby to odpowiedź / rozwiązane, ale po przeczytaniu wszystkich odpowiedzi byłem nieco zaskoczony, że nikt nie próbował połączyć wszystkich trzech metod razem:
Byłem tu tylko po to, by szukać odpowiedzi i nie zamierzałem ich udzielać. Zatem powyższe rozwiązanie bazuje wyłącznie na moim doświadczeniu. Używałem sterownika Chrome w aplikacji konsolowej C # i udało mi się wyczyścić utrzymujące się procesy dopiero po wywołaniu wszystkich trzech metod razem.
źródło
Dla użytkowników Ubuntu / Linux: - komenda jest albo
pkill
albokillall
.pkill
jest ogólnie zalecany, ponieważ w niektórych systemachkillall
faktycznie zabija wszystkie procesy.źródło
Używam Protractor z directConnect. Wyłączenie opcji „--no-sandbox” rozwiązało problem.
źródło
Uwaga: teraz, jeśli zobaczymy menedżera zadań, nie znajdziesz żadnego sterownika ani procesu chrome, który nadal się zawiesił
źródło
Przejrzałem wszystkie odpowiedzi i przetestowałem je wszystkie. Prawie zebrałem je wszystkie w jeden jako „Zamknięcie bezpieczeństwa”. To w c #
UWAGA, możesz zmienić parametr z aplikacji IModule na parametr aktualnego sterownika.
źródło
Obserwowane w wersji 3.141.0:
Jeśli zainicjujesz ChromeDriver tylko przy użyciu ChromeOptions, quit () nie zamknie chromedriver.exe.
Jeśli utworzysz i przekażesz usługę ChromeDriverService, quit () zamknie poprawnie plik chromedriver.exe.
źródło
Po prostu używam w każdym teście metody tearDown () jak następuje i nie mam żadnego problemu.
Po zamknięciu instancji sterownika wyczyść ją z pamięci podręcznej przez driver = null
Mam nadzieję, że odpowiem na pytanie
źródło
Jest inny sposób, który działa tylko w systemie Windows, ale teraz jest przestarzały. działa z wcześniejszymi wersjami selenu (działa z wersją 3.11.0).
źródło
Powinieneś złożyć wniosek przed zakończeniem
źródło