ปล่อย Selenium chromedriver.exe จากหน่วยความจำ


104

chromedriver.exeฉันจะตั้งค่ารหัสหลามที่จะเรียกใช้ซีลีเนียม ในตอนท้ายของการรันฉันต้องbrowser.close()ปิดอินสแตนซ์ ( browser = webdriver.Chrome()) ฉันเชื่อว่าควรปล่อยchromedriver.exeจากหน่วยความจำ (ฉันใช้ Windows 7) อย่างไรก็ตามหลังจากการรันแต่ละครั้งจะมีหนึ่งchromedriver.exeอินสแตนซ์ที่ยังคงอยู่ในหน่วยความจำ ฉันหวังว่าจะมีวิธีที่ฉันสามารถเขียนบางอย่างใน python เพื่อฆ่าchromedriver.exeกระบวนการนี้ได้ เห็นได้ชัดbrowser.close()ว่าไม่ได้ผล ขอบคุณ.


บรรทัดล่างสุด ... คุณต้องฆ่ากระบวนการอย่างใดอย่างหนึ่งเนื่องจากนักออกแบบไม่ได้สร้างมันขึ้นมาวิธีอื่น ๆ ทั้งหมดอาจทำให้กระบวนการทำงานอยู่และนั่นก็เพียงพอที่จะรับประกันการฆ่า
Stephen G

คำตอบ:


74

ตาม Selenium API คุณควรเรียกจริงๆbrowser.quit()เพราะวิธีนี้จะปิดหน้าต่างทั้งหมดและฆ่ากระบวนการ คุณยังควรใช้browser.quit().

อย่างไรก็ตาม : ในที่ทำงานของฉันเราสังเกตเห็นปัญหาใหญ่เมื่อพยายามดำเนินการทดสอบ chromedriver ในแพลตฟอร์ม Java โดยที่ chromedriver.exe ยังคงมีอยู่จริงแม้ว่าจะใช้งานbrowser.quit()แล้วก็ตาม เพื่อตอบโต้สิ่งนี้เราได้สร้างไฟล์แบตช์ที่คล้ายกับไฟล์นี้ด้านล่างซึ่งเพียงแค่บังคับให้ปิดกระบวนการ

kill_chromedriver.bat

@echo off
rem   just kills stray local chromedriver.exe instances.
rem   useful if you are trying to clean your project, and your ide is complaining.

taskkill /im chromedriver.exe /f

เนื่องจาก chromedriver.exe ไม่ใช่โปรแกรมขนาดใหญ่และใช้หน่วยความจำไม่มากคุณจึงไม่ควรเรียกใช้ทุกครั้ง แต่จะมีปัญหาเท่านั้น ตัวอย่างเช่นเมื่อรัน Project-> Clean ใน Eclipse


3
ฉันไม่สามารถยอมรับคำตอบใด ๆ ที่แนะนำกระบวนการฆ่าโดยไม่ได้กล่าวถึงวิธีที่ถูกต้องเพื่อให้กระบวนการเหล่านั้นสิ้นสุดลงตามปกติ หากคุณใช้quitวิธีนี้อย่างถูกต้องก็ไม่ควรเป็นปัญหา การบังคับฆ่ากระบวนการควรเป็นทางเลือกสุดท้ายเท่านั้นและคำตอบของคุณควรสะท้อนถึงสิ่งนั้น
JimEvans

17
ดูปัญหาเดียวของสิ่งนี้คือเมื่อคุณดีบักและฆ่าการดำเนินการ - กระบวนการยังคงอยู่ แม้ว่าคุณจะคลิกXมันก็ยังคงอยู่ นั่นเป็นเหตุผลเดียวสำหรับไฟล์แบตช์นี้ เห็นได้ชัดว่าquitเป็นวิธีที่จะไปอย่างไรก็ตามในตัวอย่างของฉันหากคุณดีบักและหยุดการดำเนินการ - มันจะไม่ไปถึงไฟล์quit.
ddavison

3
ฉันกำลังตอบคำถามข้อใดข้อหนึ่ง: I hope there is a way I can write something to kill the chromedriver.exe process.. และใช่นั่นเป็นสิ่งที่ดี! Java ไม่ทำอย่างนั้น
ddavison

3
ขึ้นอยู่กับกรอบการทดสอบที่คุณใช้คุณอาจจบลงด้วยกระบวนการ phantom ที่แฝงอยู่หากการทดสอบล้มเหลวใน "การตั้งค่า" ตัวอย่างเช่น NUnit จะไม่เรียกเมธอด TestFixtureTearDown หากมีบางอย่างในเมธอด TestFixtureSetup ล้มเหลว -> คุณสร้างเบราว์เซอร์ทำบางอย่างแล้วเรียกใช้การทดสอบ หากมีสิ่งผิดปกติเกิดขึ้นเมื่อ "คุณทำบางอย่าง" นั่นล่ะขั้นตอนจะอยู่ที่นั่น
Arran

1
หากคุณใช้อินเทอร์เฟซ DriverService ให้รอจนกว่าคุณจะดำเนินการกับไดรเวอร์เสร็จแล้วโทรหา DriverService.stop () เช่นกัน สำหรับฉัน driver.quit () ไม่เพียงพอเพราะฉันใช้ DriverService ด้วย
Kimball Robinson

39

browser.close() จะปิดเฉพาะหน้าต่าง Chrome ปัจจุบัน

browser.quit() ควรปิดหน้าต่างที่เปิดอยู่ทั้งหมดจากนั้นออกจาก webdriver


9
ขอบคุณ Richard browser.quit()ปิดหน้าต่างที่เปิดอยู่ทั้งหมด แต่ไม่มีการออก chromedriver.exe และมีข้อความแสดงข้อผิดพลาด 'InvalidURL: nonnumeric port:' port ''
KLI

5
ตกลง. ฉันพยายามbrowser = webdriver.Firefox()แล้ว ทั้งสองbrowser.close()และbrowser.quit()จะปิดหน้าต่างทั้งหมดและปล่อยหน่วยความจำ อย่างไรก็ตาม chromedriver จะไม่ทำเช่นเดียวกัน
KLI

สวัสดี KLI ที่ที่ฉันทำงานเราสังเกตเห็นสิ่งเดียวกันที่เกิดขึ้นกับ chromedriver นี่คือเหตุผลที่เรามีไฟล์แบตช์ที่เราเรียกใช้เมื่อเราต้องการเท่านั้น chromedriver.exe ไม่ใช่กระบวนการใหญ่ แต่จะมีปัญหาเมื่อเราพยายามเรียกใช้ Project-> Clean เช่น
ddavison

17

ในทางทฤษฎีการเรียกใช้ browser.Quit จะปิดแท็บเบราว์เซอร์ทั้งหมดและฆ่ากระบวนการ

อย่างไรก็ตามในกรณีของฉันฉันไม่สามารถทำเช่นนั้นได้ - เนื่องจากฉันทำการทดสอบหลายรายการพร้อมกันฉันจึงไม่ต้องการให้การทดสอบหนึ่งปิดหน้าต่างไปยังผู้อื่น ดังนั้นเมื่อการทดสอบของฉันทำงานเสร็จสิ้นกระบวนการ "chromedriver.exe" ยังคงทำงานอยู่อีกมากมาย

เพื่อที่จะเอาชนะสิ่งนั้นฉันได้เขียนรหัสล้างข้อมูลอย่างง่าย (C #):

Process[] chromeDriverProcesses =  Process.GetProcessesByName("chromedriver");

foreach(var chromeDriverProcess in chromeDriverProcesses)
{
     chromeDriverProcess.Kill();
}

มันไม่ได้ช่วยอะไร กระบวนการนี้จะไม่ถูกฆ่าเมื่อทำงานภายใต้ java
Denis Koreyba

@DenisKoreyba: ฉันไม่คิดว่าภาษาในการใช้งานควรเปลี่ยนพฤติกรรม บน Windows OS เมื่อไม่มีใครจับกระบวนการ - คุณสามารถฆ่ามันได้ (แม้ว่าจะถือไว้คุณก็สามารถบังคับและฆ่ามันได้) คุณกำลังพยายามที่จะฆ่ามันหลังจากปิดแท็บเบราว์เซอร์หรือไม่?
Illidan

ฉันใช้ C # ในการทำสิ่งนี้สิ่งที่ฉันบอกกับ java คือกระบวนการของ TeamCity นั้นทำงานภายใต้มัน ตอบคำถามของคุณ: ใช่ก่อนอื่นฉันเรียก Dispose () แล้วตามด้วยรหัสของคุณ
Denis Koreyba

สิ่งนี้ใช้ไม่ได้กับไดรเวอร์ Chrome เวอร์ชัน 2.21 เป็นอย่างน้อย กระบวนการถูกฆ่า แต่หน้าต่างคอนโซลยังคงแสดงอยู่อาจเป็นเพราะกระบวนการย่อยบางอย่างยังคงมีอยู่ คำตอบของ aalhanane ด้านล่างใช้งานได้
Silent Sojourner

ฉันแทรกโค้ดการล้างข้อมูลด้านบนลงในส่วน AssemblyCleanup ของ BaseDriverClass ฉันจะตรวจสอบว่ากระบวนการ chromedriver.exe ถูกฆ่าจริงได้อย่างไร
Monkrus

13
//Calling close and then quit will kill the driver running process.


driver.close();

driver.quit();

สิ่งนี้ไม่ได้ผลสำหรับฉัน เรียก driver.close (); จะปิดเบราว์เซอร์และตั้งค่าไดรเวอร์เป็น null จากนั้นไม่มีจุดเรียก driver.quit (); เนื่องจากจะทำให้เกิดข้อยกเว้นที่เป็นโมฆะ
Priyanka

การใช้งานมีการเปลี่ยนแปลงบางอย่างในซีลีเนียมในปัจจุบันคุณอาจไม่จำเป็นต้องออกจาก () หากกระบวนการถูกฆ่า ตรวจสอบให้แน่ใจว่าเมื่อคุณทำเช่นนั้นตัวจัดการงานของคุณไม่ควรฆ่ากระบวนการเบราว์เซอร์
Shantonu

12

ฉันประสบความสำเร็จเมื่อใช้driver.close()ก่อนหน้าdriver.quit()นี้ ก่อนหน้านี้ฉันใช้เพียงdriver.quit()ไฟล์.


7

มันค่อนข้างแปลก แต่มันก็ใช้ได้สำหรับฉัน ฉันมีปัญหาที่คล้ายกันหลังจากการขุดฉันพบว่ายังคงมีการดำเนินการ UI เกิดขึ้นในเบราว์เซอร์ (การโหลด URL หรือมากกว่านั้น) เมื่อฉันกดWebDriver.Quit()เมื่อฉันตี

วิธีแก้ปัญหาสำหรับฉัน (แม้ว่าน่ารังเกียจมาก) คือเพิ่มเวลาSleep()3 วินาทีก่อนที่จะเรียก Quit ()


3
ขอบคุณสิ่งนี้ใช้ได้ผลสำหรับฉันเช่นกัน ฉันเคยใช้WebDriver.Quit()มาก่อน แต่บางครั้งมันก็ทำให้กระบวนการ chrome.exe มีชีวิตอยู่ นอกจากนี้ฉันเดาว่ามันไม่ได้เกิดขึ้นในทุกระบบปฏิบัติการ
Grengas

1
สิ่งนี้ได้ผลสำหรับฉันเช่นกัน! อาจทำให้คุณรู้สึกสกปรกเล็กน้อย แต่บางครั้งเธรดแบบสุ่มการนอนหลับดูเหมือนจะเป็นสิ่งที่แพทย์สั่งให้ทำการทดสอบ UI
Dan Csharpster

เหมือนกันสำหรับฉันปิดตัวเองหรือปิดเองทิ้งกระบวนการขับไว้ข้างหลัง ทำความสะอาดทั้งสองอย่าง
Mark Ball

เยี่ยมมาก! สิ่งนี้ได้ผลสำหรับฉันด้วย ฉันเพิ่ม Task.Delay (TimeSpan.FromSeconds (3)); ก่อนที่จะเรียก driver.Quit () และจะปิดไฟล์ chromedriver.exe ทั้งหมด
Priyanka

5

คำตอบนี้คือวิธีกำจัดไดรเวอร์ใน C # อย่างถูกต้อง

หากคุณต้องการใช้กลไกที่ 'เหมาะสม' ที่ควรใช้เพื่อ 'จัดระเบียบ' หลังจากทำงานChromeDriver คุณควรใช้ IWebDriver.Dispose();

ดำเนินงานที่กำหนดโดยแอปพลิเคชันที่เกี่ยวข้องกับการปลดปล่อยการปล่อยหรือการรีเซ็ตทรัพยากรที่ไม่มีการจัดการ (รับมาจาก IDisposable)

ฉันมักจะใช้IDisposableในชั้นเรียนที่เกี่ยวข้องกับIWebDriver

public class WebDriverController : IDisposable
{
    public IWebDriver Driver;

    public void Dispose()
    {
        this.Driver.Dispose();
    }
}

และใช้มันเช่น:

using (var controller = new WebDriverController())
{
  //code goes here
}

หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง


6
ฉันสามารถยืนยันได้ว่ายังมีปัญหากับกลยุทธ์นี้! ฉันใช้ Selenium WebDriver API .NET v3.13.1.0 อินสแตนซ์ Chrome ของฉันเป็นรุ่นล่าสุดและ Windows 10 ของฉันก็เช่นกัน ... ฉันใช้ ChromeDriver (ซึ่งใช้ IDisposable โดยการสืบทอด) ดังนี้: using (var driver = new ChromeDriver()) { //my code here } บางครั้งไม่เสมอไป "บางสิ่ง" (ไม่รู้ว่าอะไร ??) เกิดขึ้นและchromedriver.exeยังไม่ได้เผยแพร่ตามที่ Taskmanager ของฉันบอก
Hauns TM

ใช่นี่ไม่ได้แก้ไขข้อบกพร่องให้ฉันเช่นกัน
Pxtl

4

ฆ่าหลายกระบวนการจากบรรทัดคำสั่งสิ่งแรกที่คุณต้องทำคือเปิดพรอมต์คำสั่งจากนั้นใช้คำสั่ง taskkill ด้วยไวยากรณ์ต่อไปนี้:

taskkill /F /IM <processname.exe> /T

พารามิเตอร์เหล่านี้จะบังคับให้ฆ่ากระบวนการใด ๆ ที่ตรงกับชื่อของไฟล์ปฏิบัติการที่คุณระบุ ตัวอย่างเช่นในการฆ่ากระบวนการ iexplore.exe ทั้งหมดเราจะใช้:

taskkill /F /IM iexplore.exe

ป้อนคำอธิบายภาพที่นี่


3

รหัส c #

ใช้ System.Diagnostics;

ใช้ System.Management;

        public void KillProcessAndChildren(string p_name)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher
          ("Select * From Win32_Process Where Name = '"+ p_name +"'");

        ManagementObjectCollection moc = searcher.Get();
        foreach (ManagementObject mo in moc)
        {

            try
            {
                KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
            }
            catch (ArgumentException)
            {
                break;
            }
        }

    }

และฟังก์ชันนี้

        public void KillProcessAndChildren(int pid)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher
         ("Select * From Win32_Process Where ParentProcessID=" + pid);
        ManagementObjectCollection moc = searcher.Get();
        foreach (ManagementObject mo in moc)
        {

            try
            {
                KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
            }
            catch
            {
                break;
            }
        }

        try
        {
            Process proc = Process.GetProcessById(pid);

            proc.Kill();
        }
        catch (ArgumentException)
        {
            // Process already exited.
        }
    }

โทร

                try
            {
                 KillProcessAndChildren("chromedriver.exe");
            }
            catch
            {

            }

ฉันได้ใช้รหัสของคุณเป็นการชำระล้างขั้นสุดท้าย จนถึงตอนนี้ดูเหมือนจะใช้งานได้ เก่งมาก!
Exzile

2

ฉันมีปัญหาเดียวกันเมื่อเรียกใช้ใน Python และฉันต้องเรียกใช้คำสั่ง 'killall' ด้วยตนเองเพื่อฆ่ากระบวนการทั้งหมด อย่างไรก็ตามเมื่อฉันติดตั้งไดรเวอร์โดยใช้โปรโตคอลการจัดการบริบท Pythonกระบวนการทั้งหมดก็หายไป ดูเหมือนว่าล่าม Python จะทำความสะอาดสิ่งต่างๆได้ดีมาก

นี่คือการนำไปใช้:

class Browser:
    def __enter__(self):
        self.options = webdriver.ChromeOptions()
        self.options.add_argument('headless')
        self.driver = webdriver.Chrome(chrome_options=self.options)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.driver.close()
        self.driver.quit()

และการใช้งาน:

with Browser() as browser:
    browser.navigate_to_page()

2

คุณสามารถใช้สิ่งต่อไปนี้:

driver.close()

ปิดเบราว์เซอร์ (เลียนแบบการกดปุ่มปิด)

driver.quit()

ออกจากเบราว์เซอร์ (เลียนแบบการเลือกตัวเลือกการเลิก)

driver.dispose()

ออกจากเบราว์เซอร์ (พยายามปิดทุกแท็บแล้วออก)

อย่างไรก็ตามหากคุณยังคงประสบปัญหาเกี่ยวกับอินสแตนซ์ที่ค้างอยู่ (เหมือนเดิม) คุณอาจต้องการฆ่าอินสแตนซ์ด้วย ในการดำเนินการดังกล่าวคุณต้องมี PID ของอินสแตนซ์ chrome

import os
import signal 
driver = webdriver.Chrome()
driver.get(('http://stackoverflow.com'))

def get_pid(passdriver):
    chromepid = int(driver.service.process.pid)
    return (chromepid)

def kill_chrome(thepid)
    try:
        os.kill(pid, signal.SIGTERM)
        return 1
    except:
        return 0

print ("Loaded thing, now I'mah kill it!")
try:
    driver.close()
    driver.quit()
    driver.dispose()
except:
    pass

kill_chrome(chromepid)

ถ้ามีอินสแตนซ์โครเมี่ยมเหลือหลังจากนั้นฉันจะกินหมวก :(



1

ฉันรู้ว่านี่เป็นคำถามเก่า ๆ แต่ฉันคิดว่าฉันจะแบ่งปันสิ่งที่ได้ผลสำหรับฉัน ฉันมีปัญหากับ Eclipse - มันจะไม่ฆ่ากระบวนการดังนั้นฉันจึงมีกระบวนการ phantom มากมายหลังจากทดสอบโค้ดโดยใช้ Eclipse runner

วิธีแก้ปัญหาของฉันคือเรียกใช้ Eclipse ในฐานะผู้ดูแลระบบ ที่แก้ไขให้ฉัน ดูเหมือนว่า Windows ไม่อนุญาตให้ Eclipse ปิดกระบวนการที่เกิดขึ้น


สิ่งนี้สมเหตุสมผลมาก แต่ในกรณีของฉันมันไม่ได้ผลchromedriver.exeยังคงมองเห็นได้ในกระบวนการจัดการงานไม่ว่าฉันจะเริ่ม Eclipse ในฐานะผู้ดูแลระบบหรือผู้ใช้ปกติ เป็นไปได้ว่าในกรณีของฉันนี่คือปัญหาเพราะchromedriver.exeเป็น 32 บิตและ JRE ของฉันเป็น 64 บิต Eclipse Neon.1a (4.6.1), Windows 8.1 Pro 64 บิต, Java 1.8.0_92-b14
SantiBailors

1

ฉันใช้ด้านล่างนี้ใน nightwatch.js ใน afterEach hooks

afterEach: function(browser, done) {
    // performing an async operation
    setTimeout(function() {
        // finished async duties
        done();
        browser.closeWindow();
        browser.end();
    }, 200);
}

.closeWindow () เพียงแค่ปิดหน้าต่าง (แต่จะใช้ไม่ได้กับการเปิดหลายหน้าต่าง) ในขณะที่. end () สิ้นสุดกระบวนการ Chrome ที่เหลือทั้งหมด


0

ฉันมีปัญหานี้ ฉันสงสัยว่าเป็นเพราะเวอร์ชันของ Serenity BDD และ Selenium กระบวนการ chromedriver จะไม่เผยแพร่จนกว่าชุดทดสอบทั้งหมดจะเสร็จสิ้น มีการทดสอบเพียง 97 ครั้ง แต่การมี 97 กระบวนการจะกินหน่วยความจำของเซิร์ฟเวอร์ที่มีทรัพยากรไม่มากนักอาจส่งผลต่อประสิทธิภาพการทำงาน

เพื่อจัดการกับฉันทำ 2 สิ่ง (สิ่งนี้เฉพาะสำหรับ windows)

  1. ก่อนการทดสอบแต่ละครั้ง (ใส่คำอธิบายประกอบด้วย @Before) รับรหัสกระบวนการ (PID) ของกระบวนการ chromedriver ด้วย:

    List<Integer> pids = new ArrayList<Integer>();
    String out;
    Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq chromedriver.exe*\"");
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((out = input.readLine()) != null) {
        String[] items = StringUtils.split(out, " ");
        if (items.length > 1 && StringUtils.isNumeric(items[1])) {
            pids.add(NumberUtils.toInt(items[1]));
        }
    }
    
  2. หลังจากการทดสอบแต่ละครั้ง (ใส่คำอธิบายประกอบด้วย @After) ฆ่า PID ด้วย:

    Runtime.getRuntime().exec("taskkill /F /PID " + pid);
    

0

ฉันมาที่นี่ตอนแรกคิดว่าจะได้รับคำตอบ / แก้ไข แต่หลังจากอ่านคำตอบทั้งหมดแล้วฉันรู้สึกประหลาดใจเล็กน้อยที่ไม่มีใครพยายามเรียกทั้งสามวิธีเข้าด้วยกัน:

try
{
    blah
}
catch
{
    blah
}
finally
{
    driver.Close(); // Close the chrome window
    driver.Quit(); // Close the console app that was used to kick off the chrome window
    driver.Dispose(); // Close the chromedriver.exe
}

ฉันมาที่นี่เพื่อค้นหาคำตอบและไม่ได้ตั้งใจจะให้คำตอบ ดังนั้นวิธีแก้ปัญหาข้างต้นจึงขึ้นอยู่กับประสบการณ์ของฉันเท่านั้น ฉันใช้ไดรเวอร์ chrome ในแอปคอนโซล C # และฉันสามารถทำความสะอาดกระบวนการที่ค้างอยู่ได้หลังจากเรียกทั้งสามวิธีเข้าด้วยกันเท่านั้น


0

สำหรับผู้ใช้ Ubuntu / Linux: - คำสั่งคือpkillหรือkillall. pkillโดยทั่วไปจะแนะนำเนื่องจากในบางระบบkillallจะฆ่ากระบวนการทั้งหมด


0

ฉันใช้ Protractor กับ directConnect การปิดใช้ตัวเลือก "- ไม่มีแซนด์บ็อกซ์" ช่วยแก้ปัญหาให้ฉันได้

// Capabilities to be passed to the webdriver instance.
capabilities: {
  'directConnect': true,
  'browserName': 'chrome',
  chromeOptions: {
      args: [
        //"--headless",
        //"--hide-scrollbars",
        "--disable-software-rasterizer",
        '--disable-dev-shm-usage',
        //"--no-sandbox",
        "incognito",
        "--disable-gpu",
        "--window-size=1920x1080"]
  }
},

0
  • ตรวจสอบให้แน่ใจว่าคุณได้รับอินสแตนซ์ไดรเวอร์เป็น Singleton
  • จากนั้นใช้ในตอนท้าย
  • driver.close ()
  • driver.quit ()

หมายเหตุ: ตอนนี้ถ้าเราเห็นตัวจัดการงานคุณจะไม่พบว่าไดรเวอร์หรือกระบวนการ Chrome ยังคงค้างอยู่


0

ฉันได้ดูคำตอบทั้งหมดและทดสอบทั้งหมดแล้ว ฉันรวบรวมพวกเขาทั้งหมดเป็น 'การปิดเพื่อความปลอดภัย' สิ่งนี้ใน c #

หมายเหตุคุณสามารถเปลี่ยนพารามิเตอร์จากแอป IModule เป็นไดรเวอร์จริงได้

 public class WebDriverCleaner
{

    public static void CloseWebDriver(IModule app)
    {
        try
        {
            if (app?.GetDriver() != null)
            {
                app.GetDriver().Close();
                Thread.Sleep(3000); // Gives time for everything to close before quiting
                app.GetDriver().Quit();
                app.GetDriver().Dispose();
                KillProcessAndChildren("chromedriver.exe"); // One more to make sure we get rid of them chromedrivers.
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

    public static void KillProcessAndChildren(string p_name)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher
            ("Select * From Win32_Process Where Name = '" + p_name + "'");

        ManagementObjectCollection moc = searcher.Get();
        foreach (ManagementObject mo in moc)
        {
            try
            {
                KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
            }
            catch (ArgumentException)
            {
                break;
            }
        }

    }


    public static void KillProcessAndChildren(int pid)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
        ManagementObjectCollection moc = searcher.Get();

        foreach (ManagementObject mo in moc)
        {
            try
            {
                KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
            }
            catch
            {
                break;
            }
        }

        try
        {
            Process proc = Process.GetProcessById(pid);
            proc.Kill();
        }
        catch (ArgumentException)
        {
            // Process already exited.
        }
    }

}

0

สังเกตในเวอร์ชัน 3.141.0:

หากคุณเริ่มต้น ChromeDriver ด้วย ChromeOptions การปิด () จะไม่ปิด chromedriver.exe

    ChromeOptions chromeOptions = new ChromeOptions();
    ChromeDriver driver = new ChromeDriver(chromeOptions);
    // .. do stuff ..
    driver.quit()

หากคุณสร้างและส่งผ่านใน ChromeDriverService การปิด () จะปิด chromedriver.exe อย่างถูกต้อง

    ChromeDriverService driverService = ChromeDriverService.CreateDefaultService();
    ChromeOptions chromeOptions = new ChromeOptions();
    ChromeDriver driver = new ChromeDriver(driverService, chromeOptions);
    // .. do stuff ..
    driver.quit()

นี่คือวิธีแก้ปัญหาใน java ที่ฉันเชื่อ อย่างน้อยมันก็ใช้ได้สำหรับฉัน
Isabelle T.

0

ฉันใช้ในการทดสอบทุกวิธีการ tearDown () ดังต่อไปนี้และฉันไม่มีปัญหาเลย

@AfterTest
public void tearDown() {
    driver.quit();
    driver = null;
}

หลังจากออกจากอินสแตนซ์ไดรเวอร์แล้วให้ล้างออกจากแคชโดยไดรเวอร์ = null

หวังว่าคำตอบของคำถาม


0

มีอีกวิธีหนึ่งที่ใช้ได้เฉพาะกับ windows แต่ตอนนี้เลิกใช้แล้ว ใช้งานได้กับซีลีเนียมรุ่นก่อนหน้า (ใช้ได้กับรุ่น 3.11.0)

import org.openqa.selenium.os.WindowsUtils;

 WindowsUtils.killByName("chromedriver.exe") // any process name you want

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.