स्मृति से सेलेनियम chromedriver.exe जारी करें


102

मैंने सेलेनियम को चलाने के लिए एक अजगर कोड स्थापित किया chromedriver.exe। रन के अंत में मुझे browser.close()उदाहरण बंद करना होगा। ( browser = webdriver.Chrome()) मेरा मानना ​​है कि यह chromedriver.exeमेमोरी से जारी होना चाहिए (मैं विंडोज 7 पर हूं)। हालाँकि प्रत्येक रन के बाद chromedriver.exeमेमोरी में एक उदाहरण मौजूद रहता है। मुझे उम्मीद है कि एक तरीका है कि मैं इस chromedriver.exeप्रक्रिया को मारने के लिए अजगर में कुछ लिख सकता हूं । जाहिर है browser.close()काम नहीं करता है। धन्यवाद।


नीचे पंक्ति ... आपको किसी तरह प्रक्रिया को मारना होगा क्योंकि डिजाइनरों ने इसे नहीं बनाया है। अन्य सभी तरीके एक प्रक्रिया को छोड़ सकते हैं और जो कि वार को मारने के लिए पर्याप्त है।
स्टीफन जी

जवाबों:


73

सेलेनियम एपीआई के अनुसार, आपको वास्तव में कॉल करना चाहिए browser.quit()क्योंकि यह विधि सभी विंडो बंद कर देगी और प्रक्रिया को मार देगी। आपको अभी भी उपयोग करना चाहिए browser.quit()

हालाँकि : मेरे कार्यस्थल पर, हमने जावा प्लेटफ़ॉर्म में क्रोमेड्रिवर परीक्षणों को निष्पादित करने की कोशिश करते समय एक बड़ी समस्या देखी है, जहां क्रोमेड्रिवर। 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 एक बहुत बड़ा कार्यक्रम नहीं है और यह बहुत अधिक मेमोरी का उपभोग नहीं करता है, इसलिए आपको इसे हर बार नहीं चलाना चाहिए, लेकिन केवल तब जब यह कोई समस्या प्रस्तुत करे। उदाहरण के लिए, प्रोजेक्ट चलाते समय-> ग्रहण में साफ।


3
मैं उन किसी भी उत्तर की निंदा नहीं कर सकता जो उन प्रक्रियाओं को मारने की सिफारिश करता है, जो उन प्रक्रियाओं को सामान्य रूप से समाप्त करने के सही तरीके का उल्लेख किए बिना। यदि आप सही तरीके से quitविधि का उपयोग करते हैं , तो यह एक मुद्दा नहीं होना चाहिए। प्रक्रियाओं को बलपूर्वक मारना केवल एक अंतिम उपाय होना चाहिए, और आपके उत्तर को प्रतिबिंबित करना चाहिए।
जिमेवान्स

17
इसके साथ एकमात्र मुद्दा देखें, क्या यह है कि जब आप डिबग करते हैं, और निष्पादन को मारते हैं - प्रक्रिया अभी भी बनी हुई है। अगर आप Xइसे क्लिक करते हैं तो भी यह बना रहता है। इस बैच फ़ाइल का एकमात्र कारण है। स्पष्ट रूप quitसे जाने का रास्ता है, हालांकि, मेरे उदाहरण में, यदि आप डिबग करते हैं और निष्पादन को रोकते हैं - यह कभी भी नहीं पहुंचता है quit
ddavison

3
मैं एक सवाल का जवाब दे रहा हूँ I hope there is a way I can write something to kill the chromedriver.exe process.:। और हाँ, यह अच्छा है! जावा ऐसा नहीं करता है
ddavison

3
आपके द्वारा उपयोग किए जाने वाले परीक्षण के ढांचे के आधार पर, आप प्रेत प्रक्रियाओं के साथ समाप्त हो सकते हैं यदि परीक्षण "सेटअप" में विफल रहता है। उदाहरण के लिए, NUnit, TestFixtureTearDown विधि का परीक्षण नहीं करेगा, यदि TestFixtureSetup पद्धति में कुछ विफल है -> आप ब्राउज़र बनाते हैं, कुछ सामान बनाते हैं, और फिर परीक्षण चलाते हैं। यदि कुछ गलत हो जाता है जब "आप कुछ सामान करते हैं", बस, यह प्रक्रिया वहां रह रही है।
अरन

1
यदि आप DriverService इंटरफ़ेस का उपयोग करते हैं, तो जब तक आप ड्राइवर के साथ काम नहीं करते हैं, तब तक सेवा पर पकड़ रखें और DriverService.stop () भी कॉल करें। मेरे लिए, Driver.quit () पर्याप्त नहीं था क्योंकि मैं DriverService का उपयोग कर रहा था।
किमबॉल रॉबिन्सन

38

browser.close() केवल वर्तमान क्रोम विंडो बंद कर देगा।

browser.quit() सभी खुली खिड़कियों को बंद करना चाहिए, फिर वेबड्राइवर से बाहर निकलें।


9
धन्यवाद रिचर्ड। browser.quit()सभी खुली खिड़कियां बंद कर दीं। लेकिन chromedriver.exe बाहर नहीं किया गया था। और एक त्रुटि संदेश था 'InvalidURL: nonnumeric port:' port ''।
केएलआई

5
ठीक है। मैंने कोशिश की browser = webdriver.Firefox()। दोनों browser.close()और browser.quit()सभी खिड़कियां और रिहाई स्मृति को बंद होगा। हालाँकि क्रोमेड्राइवर ऐसा नहीं करेंगे।
KLI

हे केएलआई। यहाँ जहाँ मैं काम करता हूँ, हमने वही सटीक चीजें देखीं हैं जो क्रोमेड्रिवर के साथ हो रही हैं। यही कारण है कि हमारे पास एक बैच फ़ाइल है जिसे हम केवल तब चलाते हैं जब हमें आवश्यकता होती है। chromedriver.exe एक बड़ी प्रक्रिया नहीं है, लेकिन जब हम प्रोजेक्ट चलाने की कोशिश करते हैं तो यह एक समस्या पेश करता
ddavison

17

सैद्धांतिक रूप से, कॉलिंग ब्राउज़र। क्यूइट सभी ब्राउज़र टैब को बंद कर देगा और प्रक्रिया को मार देगा।

हालांकि, मेरे मामले में मैं ऐसा करने में सक्षम नहीं था - जब से मैं समानांतर में कई परीक्षण चला रहा हूं, मैं दूसरों के लिए विंडोज़ बंद करने के लिए एक परीक्षण नहीं करना चाहता था। इसलिए, जब मेरे परीक्षण चल रहे हैं, तो अभी भी कई "क्रोमेड्राइवर। Exe" प्रक्रियाएं चल रही हैं।

उस पर काबू पाने के लिए, मैंने एक सरल सफाई कोड (C #) लिखा:

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

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

यह मदद नहीं की। प्रक्रिया को तब नहीं मारा जाता जब इसे जावा के तहत चलाया जाता है
डेनिस कोरेयबा

@DenisKoreyba: मुझे नहीं लगता कि कार्यान्वयन की भाषा को व्यवहार में बदलाव करना चाहिए। विंडोज ओएस पर, जब प्रक्रिया किसी के पास नहीं होती है - आप इसे मार सकते हैं (भले ही यह आयोजित हो, आप इसे मजबूर कर सकते हैं और मार सकते हैं)। क्या आप ब्राउज़र टैब के बंद होने के बाद इसे मारने की कोशिश कर रहे हैं?
इलिदान

मैं यह करने के लिए C # का उपयोग कर रहा हूं, मैंने जो बाउट जावा को बताया था, वह यह है कि TeamCity की प्रक्रिया इसके अंतर्गत चलाई जाती है। आपके प्रश्न का उत्तर देते हुए: हां, पहले मैं डिस्पोज़ () और फिर आपका कोड लागू करता हूं।
डेनिस कोरेयबा

यह क्रोम ड्राइवर पर काम नहीं करता है, कम से कम 2.21 संस्करण। प्रक्रिया को मार दिया जाता है, लेकिन कंसोल विंडो अभी भी प्रदर्शित होती है, शायद इसलिए कि कुछ बच्चे प्रक्रिया अभी भी बनी हुई है। aalhanane का जवाब नीचे काम करता है।
मूक सोजॉर्नर

मैंने बेसड्राइवरक्लास के असेंबली क्लीयनप सेक्शन में उपरोक्त क्लीनअप कोड डाला। मैं वास्तव में कैसे मारे गए chromedriver.exe प्रक्रिया को सत्यापित कर सकता हूं?
भिक्षु

12

driver.close()पहले इस्तेमाल करने पर मुझे सफलता मिली driver.quit()। मैं पहले केवल उपयोग कर रहा था driver.quit()


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


driver.close();

driver.quit();

यह मेरे लिए काम नहीं किया। ड्राइवर बुलाना (); ब्राउज़र को बंद करेगा और ड्राइवर को अशक्त करने के लिए सेट करेगा। और फिर ड्राइवर को कॉल करने का कोई मतलब नहीं है। क्विट (); के रूप में यह अशक्त अपवाद फेंक देंगे।
प्रियंका

कार्यान्वयन में वर्तमान सेलेनियम में कुछ बदलाव हैं, यदि प्रक्रिया को मार दिया जाता है, तो आपको पद छोड़ने की आवश्यकता नहीं हो सकती है। सुनिश्चित करें कि जब आप ऐसा करते हैं, तो आपके कार्य प्रबंधक को ब्राउज़र प्रक्रिया को मारना नहीं चाहिए।
शांतनु

7

यह थोड़े अजीब है लेकिन यह मेरे लिए काम करता है। मेरे पास समान मुद्दा था, कुछ खुदाई के बाद मैंने पाया कि जब मैं हिट कर रहा था तब भी ब्राउज़र (URL लोडिंग या तो) में एक यूआई कार्रवाई चल रही थी WebDriver.Quit()

मेरे लिए समाधान (पूरी तरह से बहुत बुरा) Sleep()क्विट () को कॉल करने से पहले 3 सेकंड का जोड़ना था ।


3
धन्यवाद, यह वास्तव में मेरे लिए भी काम किया। मैं WebDriver.Quit()पहले भी उपयोग कर रहा था , लेकिन कभी-कभी यह एक chrome.exe प्रक्रिया को जीवित छोड़ रहा था। इसके अलावा, मुझे लगता है कि यह सभी ऑपरेटिंग सिस्टम पर नहीं हो रहा है।
ग्रेंगस

1
यह मेरे लिए भी काम किया! यह आपको थोड़ा गंदा महसूस कर सकता है लेकिन कभी-कभी रैंडम थ्रेड। नींद ऐसा लगता है कि डॉक्टर ने यूआई परीक्षण के लिए आदेश दिया था।
डेन सेशरपस्टर

मेरे लिए भी, अपने आप ही बंद हो जाना या अपने आप से पीछे हट जाना ड्राइवर प्रक्रिया को पीछे छोड़ देता है। कर दोनों ने बारीक से सफाई की।
मार्क बॉल

महान! इसने मेरे लिए भी काम किया। मैंने Task.Delay (TimeSpan.FromSeconds (3)) को जोड़ा; ड्राइवर को बुलाने से पहले। क्यू () और यह सभी chromedriver.exe फ़ाइलों को बंद कर रहा है
प्रियंका

5

यह उत्तर है कि C # में ड्राइवर का ठीक से निपटान कैसे करें

यदि आप एक 'उचित' तंत्र का उपयोग करना चाहते हैं जिसका उपयोग आपको चलाने के बाद 'सुव्यवस्थित' करने के लिए किया ChromeDriver जाना चाहिए IWebDriver.Dispose();

अप्रबंधित संसाधनों को मुक्त करने, जारी करने या रीसेट करने से जुड़े एप्लिकेशन-परिभाषित कार्य करता है। (आईडीसिसोप्लिक से प्राप्त किया गया।)

मैं आम तौर IDisposableपर उस वर्ग पर लागू करता हूं जो इससे निपट रहा हैIWebDriver

public class WebDriverController : IDisposable
{
    public IWebDriver Driver;

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

और इसका उपयोग करें:

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

आशा है कि यह आपको कुछ समय बचाता है


6
मैं पुष्टि कर सकता हूं कि इस रणनीति के साथ अभी भी समस्याएं हैं! मैं सेलेनियम वेबड्राइवर एपीआई .NET v3.13.1.0 का उपयोग कर रहा हूं, मेरा क्रोम उदाहरण आज तक है, और इसलिए मेरा विंडोज 10 है ... मैं क्रोमड्राइवर का उपयोग कर रहा हूं (जो कि विरासत के आधार पर आईडीआईसोपोलेट को लागू करता है) इस तरह: using (var driver = new ChromeDriver()) { //my code here } कभी-कभी, हमेशा नहीं, "कुछ" (जो पता नहीं है ??) होता है और chromedriver.exeअभी भी मेरे taskmanager के अनुसार अप्रकाशित है।
Hauns TM

हाँ, यह मेरे लिए बग को ठीक नहीं करता है।
Pxtl

4

कमांड लाइन से कई प्रक्रियाओं को मारें पहली चीज जो आपको करने की आवश्यकता है वह है कमांड प्रॉम्प्ट खोलें, और फिर निम्न सिंटैक्स के साथ टास्किल कमांड का उपयोग करें:

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

ये पैरामीटर आपके द्वारा निर्दिष्ट निष्पादन योग्य के नाम से मेल खाती किसी भी प्रक्रिया को जबरन मार देंगे। उदाहरण के लिए, सभी iexplore.exe प्रक्रियाओं को मारने के लिए, हम उपयोग करेंगे:

taskkill /F /IM iexplore.exe

यहां छवि विवरण दर्ज करें


3

कोड c #

System.Diagnostics का उपयोग करना;

सिस्टम का उपयोग कर रहा है।

        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
            {

            }

मैंने अंतिम सफाई के रूप में आपका कोड लागू कर दिया है। अब तक यह काम करने लगता है। बहुत बढ़िया!
निर्गमन

2

पायथन में इसे चलाते समय मेरे पास एक ही मुद्दा था और मुझे सभी प्रक्रियाओं को मारने के लिए मैन्युअल रूप से 'किलॉल' कमांड चलाना था। हालाँकि जब मैंने पायथन संदर्भ प्रबंधन प्रोटोकॉल का उपयोग करके ड्राइवर को लागू किया तो सभी प्रक्रियाएँ समाप्त हो गईं। ऐसा लगता है कि पायथन दुभाषिया चीजों को साफ करने का एक बहुत अच्छा काम करता है।

यहाँ कार्यान्वयन है:

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 की आवश्यकता है।

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

मुझे पता है कि यह कुछ हद तक एक पुराना सवाल है, लेकिन मुझे लगा कि मैं वह काम करूंगा जो मेरे लिए काम करता है। मुझे एक्लिप्स के साथ समस्या हो रही थी - यह प्रक्रियाओं को नहीं मारता, और इसलिए मेरे पास एक्लिपर रनर का उपयोग करके कोड का परीक्षण करने के बाद प्रेत प्रक्रियाओं का एक गुच्छा था।

मेरा समाधान प्रशासक के रूप में ग्रहण को चलाने के लिए था। उसने मेरे लिए इसे हल कर दिया। ऐसा लगता है कि विंडोज ग्रहण की प्रक्रिया को बंद करने की अनुमति नहीं दे रही थी।


यह बहुत मायने रखता है, लेकिन मेरे मामले में यह काम नहीं किया, chromedriver.exeकार्य प्रबंधक प्रक्रियाओं के बीच दिखाई देता है कोई फर्क नहीं पड़ता कि मैं प्रशासक या सामान्य उपयोगकर्ता के रूप में ग्रहण शुरू करता हूं। यह संभव है कि मेरे मामले में यह समस्या है, क्योंकि chromedriver.exe32 बिट है और मेरा जेआरई 64 बिट है। ग्रहण नियोन.1 ए (4.6.1), विंडोज 8.1 प्रो 64 बिट, जावा 1.8.0_92-बी 14।
संतिबेलर्स

1

मैं रात के नीचे का उपयोग किया है। बाद के हुक में js।

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

.closeWindow () बस विंडो को बंद कर देता है। (लेकिन कई खिड़कियों के लिए अभ्यस्त काम खोला)। जबकि .end () शेष सभी क्रोम प्रक्रियाओं को समाप्त करता है।


0

मेरे पास यह मुद्दा है। मुझे इसके सीनियर्स बीडीडी और सेलेनियम के संस्करण के कारण संदेह है। क्रोमेड्रिवर प्रक्रिया कभी भी जारी नहीं होती है जब तक कि पूरा परीक्षण सूट खत्म नहीं हो जाता। केवल 97 परीक्षण हैं, लेकिन 97 प्रक्रियाएं सर्वर की मेमोरी को खा जाती हैं जो कि अधिक संसाधन नहीं हैं प्रदर्शन पर प्रभाव पड़ सकता है।

संबोधित करने के लिए मैंने 2 चीजें कीं (यह विंडोज़ के लिए विशिष्ट है)।

  1. प्रत्येक परीक्षण से पहले (@Before के साथ एनोटेट) के साथ क्रोमेड्रिवर प्रक्रिया की प्रक्रिया आईडी (पीआईडी) प्राप्त करें:

    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
}

मैं केवल यहाँ जवाब देखने के लिए था और एक प्रदान करने का इरादा नहीं था। तो उपरोक्त समाधान केवल मेरे अनुभव पर आधारित है। मैं C # कंसोल ऐप में क्रोम ड्राइवर का उपयोग कर रहा था और मैं सभी तीन तरीकों को एक साथ कॉल करने के बाद ही लिंग प्रक्रियाओं को साफ करने में सक्षम था।


0

उबंटू / लिनक्स उपयोगकर्ताओं के लिए: - कमांड pkillया तो है killallpkillआमतौर पर सिफारिश की जाती है, क्योंकि कुछ प्रणालियों पर, killallवास्तव में सभी प्रक्रियाओं को मार देगा।


0

मैं डायरेक्टकनेक्ट के साथ प्रोट्रैक्टर का उपयोग कर रहा हूं। "-नो-सैंडबॉक्स" विकल्प को अक्षम करने से मेरे लिए समस्या ठीक हो गई।

// 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
  • सुनिश्चित करें कि आपको सिंग्लटन के रूप में ड्राइवर का उदाहरण मिलता है
  • फिर अंत में आवेदन करें
  • driver.close ()
  • driver.quit ()

नोट: अब अगर हम टास्क मैनेजर देखते हैं तो आपको कोई ड्राइवर या क्रोम प्रोसेस नहीं मिलेगा


0

मैंने सभी प्रतिक्रियाओं को देखा है और उन सभी का परीक्षण किया है। मैंने बहुत ज्यादा उन सभी को एक 'सेफ्टी क्लोजर' के रूप में संकलित किया। यह सी # में

ध्यान दें कि आप वास्तविक ड्राइवर के लिए 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()

मेरा मानना ​​है कि जावा में यह समाधान है। कम से कम, इसने मेरे लिए काम किया
इसाबेल टी।

0

मैं बस प्रत्येक परीक्षण में एक विधि आंसू का उपयोग करता हूं () निम्नलिखित के रूप में और मुझे कोई समस्या नहीं है।

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

ड्राइवर के उदाहरण को छोड़ने के बाद इसे चालक = null द्वारा कैश से साफ़ करें

आशा है कि प्रश्न का उत्तर मिलेगा


0

एक और तरीका है जो केवल खिड़कियों के लिए काम कर रहा है, लेकिन अब इसे हटा दिया गया है। यह पिछले सेलेनियम रिलीज के लिए काम करता है (यह 3.11.0 संस्करण पर काम करता है)।

import org.openqa.selenium.os.WindowsUtils;

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

0

आपको पद छोड़ने से पहले पास आवेदन करना चाहिए

driver.close()
driver.quit()

काम नहीं करता है, chromedriver.exe अभी भी खुला है
पेड्रो

1
--Edit -> हटाए गए "ड्राइवर.क्लोज़ ()" और इसने काम किया
पेड्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.