মেমরি থেকে সেলেনিয়াম chromedriver.exe মুক্তি


107

সেলেনিয়াম চালানোর জন্য আমি পাইথন কোড সেট আপ করেছি chromedriver.exe। রান শেষে আমাকে browser.close()উদাহরণটি বন্ধ করতে হবে। ( browser = webdriver.Chrome()) আমি বিশ্বাস করি এটি chromedriver.exeমেমরি থেকে মুক্তি দেওয়া উচিত (আমি উইন্ডোজ 7 এ আছি)। তবে প্রতিটি রান করার পরে chromedriver.exeমেমোরিতে একটি উদাহরণ থাকে। আমি আশা করি chromedriver.exeপ্রক্রিয়াটি মেরে ফেলার জন্য অজগরটিতে কিছু লেখার উপায় আছে । স্পষ্টতই browser.close()কাজটি করে না। ধন্যবাদ


নীচের লাইন ... আপনাকে কোনওভাবে প্রক্রিয়াটি হারাতে হবে কারণ ডিজাইনাররা এটি তৈরি করেনি other
স্টিফেন জি

উত্তর:


75

সেলেনিয়াম এপিআই অনুসারে, আপনাকে সত্যিই কল browser.quit()করা উচিত কারণ এই পদ্ধতিটি সমস্ত উইন্ডো বন্ধ করে দেবে এবং প্রক্রিয়াটিকে মেরে ফেলবে। আপনার এখনও ব্যবহার করা উচিত browser.quit()

তবে : আমার কর্মক্ষেত্রে, জাভা প্ল্যাটফর্মে ক্রোমড্রাইভার পরীক্ষা চালানোর চেষ্টা করার সময় আমরা একটি বিশাল সমস্যা লক্ষ্য করেছি, যেখানে ক্রোমড্রাইভার.এক্সই বাস্তবে ব্যবহারের পরেও রয়েছে browser.quit()। এটির মোকাবিলা করতে, আমরা নীচের মতো একটি ব্যাচ ফাইল তৈরি করেছি, এটি কেবল প্রক্রিয়াগুলি বন্ধ করে দেয়।

কিল_ক্রোমড্রাইভার.বাট

@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 একটি বিশাল প্রোগ্রাম নয় এবং খুব বেশি মেমরি গ্রাস করে না, তাই আপনার এটি প্রতিবার চালানো উচিত নয়, তবে কেবল যখন এটি কোনও সমস্যা উপস্থাপন করে। উদাহরণস্বরূপ, যখন প্রকল্পটি চলবে -> Eclipse এ পরিষ্কার করুন।


4
এই প্রক্রিয়াগুলি স্বাভাবিকভাবে শেষ হওয়ার সঠিক উপায় উল্লেখ না করেই আমি কোনও উত্তরই ক্ষমা করতে পারি না যা হত্যা প্রক্রিয়াগুলির প্রস্তাব দেয়। আপনি যদি quitপদ্ধতিটি সঠিকভাবে ব্যবহার করেন তবে এটি কোনও সমস্যা হওয়া উচিত নয়। প্রক্রিয়াগুলিকে জোর করে হত্যা করা কেবলমাত্র একটি শেষ অবলম্বন হওয়া উচিত এবং আপনার উত্তরের বিষয়টি প্রতিফলিত হওয়া উচিত।
জিমএভান্স

17
এটির সাথে একমাত্র ইস্যুটি দেখুন, আপনি যখন ডিবাগ করেন এবং মৃত্যুদণ্ড কার্যকর করেন - প্রক্রিয়াটি এখনও রয়ে যায়। এমনকি আপনি ক্লিক করলেও Xএটি এখনও রয়ে যায়। যে শুধুমাত্র এই ব্যাচটি ফাইলের জন্য কারণ। স্পষ্টতই quitযাওয়ার উপায় হ'ল তবে আমার উদাহরণে আপনি যদি ডিবাগ করেন এবং সম্পাদন বন্ধ করেন - এটি কখনই পৌঁছায় না quit
ডিডিসন

4
আমি প্রশ্নগুলির একটির উত্তর করছি: I hope there is a way I can write something to kill the chromedriver.exe process.। এবং হ্যাঁ, এটি দুর্দান্ত! জাভা এটি করে না
ডিডভিসন

4
আপনি যে টেস্ট ফ্রেমওয়ার্কটি ব্যবহার করেন তার উপর নির্ভর করে আপনি পরীক্ষাগুলি "সেটআপ" এ ব্যর্থ হলে আশেপাশে থাকা ভুত প্রক্রিয়াগুলিও শেষ করতে পারেন। উদাহরণস্বরূপ, নুনিট যদি টেস্টফাইচারসেটআপ পদ্ধতির কোনও কিছু ব্যর্থ হয় -> আপনি ব্রাউজারটি তৈরি করেন, কিছু স্টাফ করেন, এবং তারপরে পরীক্ষা চালান তবে টেস্টফাইচারটাইয়ারডাউন পদ্ধতিকে কল করবে না । "আপনি কিছু জিনিস করেন" যখন কিছু ভুল হয়ে যায়, তবে এটি প্রক্রিয়াটি সেখানেই থাকে।
Arran

4
আপনি যদি ড্রাইভার সার্ভিস ইন্টারফেস ব্যবহার করেন তবে ড্রাইভারের সাথে কাজ শেষ না হওয়া অবধি পরিষেবাটি ধরে রাখুন এবং পাশাপাশি ড্রাইভারসওয়ার্স.স্টপকে কল করুন ()। আমার জন্য, ড্রাইভার.কুইট () যথেষ্ট ছিল না কারণ আমি চালক সেবাও ব্যবহার করছিলাম।
কিমবল রবিনসন

39

browser.close() শুধুমাত্র বর্তমান ক্রোম উইন্ডোটি বন্ধ করবে।

browser.quit() সমস্ত খোলা উইন্ডো বন্ধ করা উচিত, তারপরে ওয়েবড্রাইভার থেকে প্রস্থান করুন।


9
ধন্যবাদ রিচার্ড browser.quit()সমস্ত খোলা উইন্ডো বন্ধ করে দিয়েছে। তবে chromedriver.exe প্রস্থান করা হয়নি। এবং সেখানে একটি ত্রুটি বার্তা ছিল 'অবৈধ ইউআরএল: সংখ্যাসূচক পোর্ট:' পোর্ট '।
কেবিআই

5
ঠিক আছে. চেষ্টা করেছি browser = webdriver.Firefox()। উভয় browser.close()এবং browser.quit()সমস্ত উইন্ডো বন্ধ করে মেমরি ছেড়ে দেবে। তবে ক্রোমড্রাইভার একই কাজ করবে না।
KLI

আরে কে এল আই এখানে আমি যেখানে কাজ করি, আমরা ক্রোমড্রাইভারের সাথে একই ঘটনা ঘটছে তা লক্ষ্য করেছি। এ কারণেই আমাদের একটি ব্যাচ ফাইল রয়েছে যা আমরা কেবল তখনই চালিত করি যখন আমাদের প্রয়োজন হয়। chromedriver.exe কোনও বড় প্রক্রিয়া নয়, তবে আমরা যখন প্রজেক্টটি চালানোর চেষ্টা করি তখন সমস্যাটি উপস্থিত
হয়-

18

তাত্ত্বিকভাবে, কলিং ব্রাউজার.কুইট সমস্ত ব্রাউজারের ট্যাবগুলি বন্ধ করে দেবে এবং প্রক্রিয়াটি মেরে ফেলবে।

তবে, আমার ক্ষেত্রে আমি তা করতে সক্ষম হইনি - যেহেতু আমি সমান্তরালে একাধিক পরীক্ষা চালাচ্ছি, তাই অন্যের উইন্ডো বন্ধ করার জন্য আমি একটি পরীক্ষা করতে চাইনি। অতএব, যখন আমার পরীক্ষাগুলি চলমান শেষ হয়, তখনও অনেকগুলি "ক্রোমড্রাইভার.এক্স্সি" প্রক্রিয়া চলমান রয়েছে।

এটি কাটিয়ে উঠতে, আমি একটি সাধারণ ক্লিনআপ কোড (সি #) লিখেছি:

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

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

এটি সাহায্য করেনি। প্রক্রিয়াটি
জাভার

@ ডেনিসকোরিয়াবা: আমি মনে করি না যে বাস্তবায়নের ভাষার ব্যবহারের পরিবর্তন হওয়া উচিত। উইন্ডোজ ওএসে, যখন প্রক্রিয়া কারও হাতে না থাকে - আপনি এটিকে হত্যা করতে পারেন (এমনকি এটি অনুষ্ঠিত হলেও আপনি এটি জোর করে হত্যা করতে পারেন)। ব্রাউজার ট্যাব (গুলি) বন্ধ হয়ে যাওয়ার পরে আপনি কি এটি হত্যা করার চেষ্টা করছেন?
ইলিডান

আমি এটি করার জন্য সি # ব্যবহার করছি, যা আমি জাউটকে বললাম যে টিমসিটির প্রক্রিয়াটি এর অধীনে চলছে। আপনার প্রশ্নের উত্তরের: হ্যাঁ, প্রথমে আমি ডিসপোজ () এবং তারপরে আপনার কোডটি প্রার্থনা করি।
ডেনিস কোরেইবা

এটি ক্রোম ড্রাইভার, কমপক্ষে 2.21 সংস্করণে কাজ করে না। প্রক্রিয়াটি মারা গেছে তবে কনসোল উইন্ডোটি এখনও প্রদর্শিত হচ্ছে, সম্ভবত কিছু শিশু প্রক্রিয়া এখনও অব্যাহত রয়েছে। নীচে অলহনের উত্তর কাজ করে।
নিরব Sojourner

আমি বেসড্রাইভারক্লাসের এসেম্বলি ক্লিনআপ বিভাগে উপরে বর্ণিত ক্লিনআপ কোড sertedোকালাম। Chromedriver.exe প্রক্রিয়াটি আসলে নিহত হয়েছিল কীভাবে আমি যাচাই করতে পারি?
monkrus

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


driver.close();

driver.quit();

এটি আমার পক্ষে কাজ করে না। ড্রাইভার কল করা হচ্ছে (কল) (); ব্রাউজারটি বন্ধ করবে এবং ড্রাইভারকে বাতিল করে দেবে। এবং তারপরে ড্রাইভার.কুইট () কল করার কোনও মানে নেই; এটি নাল ব্যতিক্রম নিক্ষেপ করবে।
প্রিয়াঙ্কা

বাস্তবায়নের বর্তমান সেলেনিয়ামে কিছু পরিবর্তন রয়েছে, প্রক্রিয়াটি মারা গেলে আপনার প্রস্থান () ছাড়ার প্রয়োজন হতে পারে না। আপনি যখন এটি করেন তা নিশ্চিত হয়ে নিন, আপনার টাস্ক ম্যানেজারের ব্রাউজার প্রক্রিয়াটি নিহত না হওয়া উচিত।
শান্তোনু

12

driver.close()আগে ব্যবহার করার সময় আমার সাফল্য ছিল driver.quit()। আমি আগে শুধুমাত্র ব্যবহার ছিল driver.quit()


8

এটি বিস্ময়কর তবে এটি আমার পক্ষে কাজ করে। আমার অনুরূপ সমস্যা ছিল, কিছু খননের পরে আমি দেখতে পেলাম যে আমি যখন আঘাত করব তখন ব্রাউজারে (ইউআরএল লোডিং বা তাই) একটি ইউআই অ্যাকশন চলছে WebDriver.Quit()

আমার জন্য সমাধানটি (অতিমাত্রায় খুব খারাপ লাগা) ছিলো Sleep()ছাড়ার () কল করার আগে 3 সেকেন্ডের যোগ করা ।


4
ধন্যবাদ, এটি আসলে আমার জন্যও কাজ করেছিল। আমি আগেও ব্যবহার করছিলাম WebDriver.Quit()তবে কখনও কখনও এটি একটি ক্রোম.এক্সএক্স প্রক্রিয়াটি জীবিত রেখে চলেছিল। এছাড়াও আমি অনুমান করি যে এটি সমস্ত অপারেটিং সিস্টেমে ঘটছে না।
গ্রেঙ্গাস

4
এটি আমার পক্ষেও কাজ করেছিল! এটি আপনাকে কিছুটা নোংরা অনুভব করতে পারে তবে কখনও কখনও এলোমেলো থ্রেড S ঘুমগুলি মনে হয় চিকিত্সকটি ইউআই পরীক্ষার জন্য যা আদেশ করেছিলেন।
ড্যান চিশার্পস্টার

আমার জন্য একই, নিজে থেকে বন্ধ করুন বা নিজেই ছাড়ুন ড্রাইভার প্রসেসটি পিছনে। দুজনেই সুন্দরভাবে পরিষ্কার হয়ে গেছে।
মার্ক বল

দুর্দান্ত! এটি আমার জন্যও কাজ করেছিল। আমি Task.Delay (টাইমস্প্যান.ফ্রমসেকেন্ডস (3)) যুক্ত করেছি; ড্রাইভার.কুইট () কল করার আগে এবং এটি সমস্ত ক্রোমড্রাইভার.এক্সই ফাইলগুলি বন্ধ করে দিচ্ছে
প্রিয়াঙ্কা

5

এই উত্তরটি কীভাবে সি # তে ড্রাইভারকে সঠিকভাবে নিষ্পত্তি করতে হয়

আপনি যদি চালানোর পরে 'পরিপাটি' করার জন্য একটি 'যথাযথ' প্রক্রিয়া ব্যবহার করতে চান তবে আপনার ব্যবহার করা 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
আমি নিশ্চিত করতে পারি যে এই কৌশলটিতে এখনও সমস্যা আছে! আমি সেলেনিয়াম ওয়েবড্রাইভার এপিআই। নেট v3.13.1.0 ব্যবহার করছি, আমার ক্রোম উদাহরণটি আপ টু ডেট এবং আমার উইন্ডোজ 10 ... আমি ক্রোমড্রাইভার (যা উত্তরাধিকারসূত্রে আইডিজিপোজেবল প্রয়োগ করে) এর মতো ব্যবহার করি: using (var driver = new ChromeDriver()) { //my code here } কখনও কখনও, সর্বদা না, "কিছু" (কী জানেন ??) ঘটে এবং chromedriver.exeএখনও আমার টাস্ক ম্যানেজার অনুসারে অপ্রকাশিত।
হানস টিএম

হ্যাঁ, এটি আমার জন্যও বাগটি ঠিক করে না।
Pxtl

4

কোড সি #

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
            {

            }

আমি আপনার কোডটিকে চূড়ান্ত সাফাই হিসাবে প্রয়োগ করেছি। এখনও পর্যন্ত এটি কাজ বলে মনে হচ্ছে। সাবাশ!
এক্সিজাইল

4

কমান্ড লাইন থেকে একাধিক প্রক্রিয়া কিল করুন আপনার প্রথমে যে কাজটি করা দরকার তা হ'ল কমান্ড প্রম্পট খুলুন এবং তারপরে নিম্নলিখিত সিনট্যাক্স সহ টাস্কিল কমান্ডটি ব্যবহার করুন:

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

এই প্যারামিটারগুলি আপনার নির্ধারিত কার্যকর সম্পাদকের নামের সাথে মিলে এমন কোনও প্রক্রিয়া জোর করে হত্যা করবে। উদাহরণস্বরূপ, সমস্ত iexplore.exe প্রক্রিয়াগুলিকে হত্যা করতে, আমরা ব্যবহার করব:

taskkill /F /IM iexplore.exe

এখানে চিত্র বর্ণনা লিখুন


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()

ব্রাউজার থেকে প্রস্থান করুন (প্রতিটি ট্যাব বন্ধ করার চেষ্টা করুন, তারপরে প্রস্থান করুন)

যাইহোক, যদি আপনি হয় এখনও (যেমন আমি ছিলাম) ঝুলন্ত দৃষ্টান্ত দিয়ে সমস্যার সম্মুখিন হতে হচ্ছে.আপনি, এছাড়াও আপনি উদাহরণস্বরূপ হত্যা করতে চাইতে পারেন। এটি করার জন্য আপনার ক্রোম দৃষ্টান্তের পিআইডি দরকার।

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 চালানো। এটা আমার জন্য এটি স্থির। দেখে মনে হচ্ছে যে উইন্ডোজ গ্রহণের প্রক্রিয়াটি বন্ধ করার জন্য গ্রহণের অনুমতি দিচ্ছিল না।


এটি অনেক অর্থবোধ করে, তবে আমার ক্ষেত্রে এটি কাজ করে না, chromedriver.exeআমি প্রশাসক বা সাধারণ ব্যবহারকারীরূপে গ্রহনটি শুরু করি না কেন, টাস্ক ম্যানেজারের প্রক্রিয়াগুলির মধ্যে দৃশ্যমান থাকে। এটা যে আমার ক্ষেত্রে সম্ভব এই , সমস্যা কারণ chromedriver.exeহয় 32 বিট এবং আমার JRE 64 বিট হয়। নিগ্রহ নিওন .১ এ (৪.6.১), উইন্ডোজ 8.1 প্রো 64 বিট, জাভা 1.8.0_92-বি 14।
সান্টিবাইলર્સ

1

নীচের নাইটওয়াচ.জেএস-এ হিটার-এ হুক্স ব্যবহার করেছি।

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

.closeWindow () কেবল উইন্ডোটি বন্ধ করে দেয়। (তবে একাধিক উইন্ডো খোলা হবে না)। যেখানে .end () বাকি সমস্ত ক্রোম প্রক্রিয়া শেষ করে।


1

আমি সমস্ত প্রতিক্রিয়া তাকিয়েছি এবং তাদের সব পরীক্ষা করেছি। আমি এগুলি সমস্তগুলিকে একটি 'সেফটি ক্লোজার' হিসাবে সংকলিত করেছি। এটি সি # তে

দ্রষ্টব্য আপনি ইমোডুল অ্যাপ থেকে প্যারামটিকে প্রকৃত ড্রাইভারের মতো পরিবর্তন করতে পারবেন।

 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.
        }
    }

}

আমার জন্য এটি আসল সমাধান
জর্জি রডরিগস ডস সান্টোস

1

ছাড়ার আগে আপনার কাছাকাছি আবেদন করা উচিত

driver.close()
driver.quit()

4
- সম্পাদনা -> "ড্রাইভারক্লস ()" সরানো হয়েছে এবং এটি কাজ করেছে
পেড্রো

0

আমার এই সমস্যা আছে। সেরেনিটি বিডিডি এবং সেলেনিয়ামের সংস্করণের কারণে আমি সন্দেহ করি। ক্রোমড্রাইভার প্রক্রিয়া পুরো টেস্ট স্যুট শেষ না হওয়া পর্যন্ত কখনই প্রকাশ হয় না। এখানে কেবলমাত্র 97 টি পরীক্ষা রয়েছে, তবে 97 টি প্রক্রিয়াধীন একটি সার্ভারের স্মৃতি খায় যা খুব বেশি সংস্থান নেই তার কার্য সম্পাদনে প্রভাব ফেলতে পারে।

সম্বোধনের জন্য আমি 2 টি কাজ করেছি (এটি উইন্ডোগুলির সাথে নির্দিষ্ট)।

  1. প্রতিটি পরীক্ষার আগে (@ পূর্বে বর্ণিত) ক্রোমড্রাইভার প্রক্রিয়াটির প্রসেস আইডি (পিআইডি) পাবেন:

    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. প্রতিটি পরীক্ষার পরে (@ পরে বর্ণিত) পিআইডি মেরে এতে:

    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
}

আমি কেবল উত্তরগুলি খুঁজতে এখানে এসেছি এবং কোনও জবাব দেওয়ার ইচ্ছা নেই। সুতরাং উপরের সমাধানটি কেবল আমার অভিজ্ঞতার ভিত্তিতে। আমি একটি সি # কনসোল অ্যাপে ক্রোম ড্রাইভার ব্যবহার করছিলাম এবং তিনটি পদ্ধতি একসাথে কল করার পরেই আমি অলস প্রক্রিয়াগুলি পরিষ্কার করতে সক্ষম হয়েছি।


0

উবুন্টু / লিনাক্স ব্যবহারকারীদের জন্য: - কমান্ডটি হয় হয় pkillবা হয় killallpkillসাধারণত প্রস্তাবিত হয়, যেহেতু কিছু সিস্টেমে killallপ্রকৃতপক্ষে সমস্ত প্রক্রিয়া মারা যায়।


0

আমি সরাসরি সংযোগ সহ প্রটেক্টর ব্যবহার করছি। "--No-Sandbox" বিকল্পটি অক্ষম করা আমার জন্য সমস্যাটি স্থির করে।

// 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
  • নিশ্চিত করুন যে আপনি ড্রাইভারটি সিঙ্গলটন হিসাবে পেয়েছেন
  • তারপরে শেষে প্রয়োগ করুন
  • ড্রাইভার.ক্লোজ ()
  • ড্রাইভার.উইউটি ()

দ্রষ্টব্য: এখন আমরা যদি টাস্ক ম্যানেজারটি দেখি তবে আপনি কোনও ড্রাইভার বা ক্রোম প্রক্রিয়া এখনও ঝুলন্ত দেখতে পাবেন না


0

সংস্করণে পর্যবেক্ষণ 3.141.0:

আপনি যদি ক্রোমড্রাইভারকে কেবল ক্রোমঅ্যাপশন দিয়ে সূচনা করেন তবে () ছাড়ুন ক্রোমড্রাইভার.এক্সেক্স বন্ধ হবে না।

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

আপনি যদি কোনও ক্রোমড্রাইভার সার্ভিস তৈরি করেন এবং পাস করেন তবে ছেড়ে দিন () 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;
}

ড্রাইভার ছাড়ার পরে ড্রাইভারটি ক্যাশ থেকে এটি ক্লিয়ার করুন = নাল দ্বারা

প্রশ্নের উত্তর আশা করি


0

আর একটি উপায় রয়েছে যা কেবল উইন্ডোজের জন্যই কাজ করে তবে এখন এটি অবহেলা করা হয়েছে। এটি পূর্ববর্তী সেলেনিয়াম রিলিজের জন্য কাজ করে (এটি 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.