Webdriver.Dispose (), .Close () और .Quit () के बीच अंतर


285

इनमें क्या अंतर है

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

कौन सा इस्तेमाल किया जाए और कब?


2
प्रतीत होता है कि #Dispose विधि वेबड्राइवर एपीआई से चुपचाप हटा दी गई है। चैंज में कोई उल्लेख नहीं, सबसे हाल का उल्लेख मैं पा सकता था v2.26 एपी डॉक्स, जो मुझे अब के लिए लिंक नहीं मिल सकता है।
jordanpg

मैं देखता हूं कि नीचे के उत्तरों में भ्रम कहां से आ रहा है। मुझे लगता है कि यह प्रश्न मूल रूप से एक C # प्रश्न था, क्योंकि ऊपर दिए गए तरीके (क्लोज़, क्विट एंड डिस्पोज़) एक कैपिटल लेटर से शुरू होते हैं (C #) लोअर केस लेटर (जावा) नहीं। निपटान को C # WebDriver क्लाइंट बाइंडिंग से नहीं हटाया गया है।
rcasady616

निपटान एक। नेट पैटर्न है और इसलिए सेलेनियम के एपीआई डॉक्स में प्रलेखित नहीं है। RemoteWebDriver में, Quit Dispose को कॉल करता है, जो एक Quit कमांड (DELETE / session / {sessionIf}) भेजता है। क्लाइंट साइड में कई जगह हैं जहां क्विट कमांड को इंटरसेप्ट किया गया है। फ़ायरफ़ॉक्सड्राइवर .net कार्यान्वयन उदाहरण के लिए वास्तव में एक प्रक्रिया करेगा। किल () कॉल करें यदि प्रक्रिया इनायत से बंद नहीं होती है।
तामीर दानीली

जवाबों:


244

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

  1. webDriver.Close() - उस ब्राउज़र विंडो को बंद करें, जिस पर ड्राइवर का ध्यान है
  2. webDriver.Quit() - कॉल डिस्पोज़ ()
  3. webDriver.Dispose() सभी ब्राउज़र विंडो बंद कर देता है और सत्र को सुरक्षित रूप से समाप्त कर देता है

नीचे दिया गया कोड ड्राइवर ऑब्जेक्ट को डिस्पोज़ करेगा, सत्र को समाप्त करेगा और परीक्षण के दौरान खोले गए सभी ब्राउज़रों को बंद कर देगा चाहे परीक्षण विफल हो या पास।

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

सारांश में सुनिश्चित करें कि प्रोग्राम से बाहर निकलने से पहले क्विट () या डिस्पोज़ () कहा जाता है, और जब तक आप क्या कर रहे हैं, यह सुनिश्चित करने के लिए क्लोज़ () विधि का उपयोग न करें।

नोट
मुझे यह सवाल मिला जब एक संबंधित समस्या का पता लगाने की कोशिश की गई कि मेरे वीएम हार्डड्राइव स्पेस से बाहर क्यों चल रहे थे। एक अपवाद के कारण टर्न आउट हो रहा था () या डिस्पोज़ () को हर रन नहीं कहा जा सकता था, जिसके कारण ऐपडाटा फ़ोल्डर को हार्ड ड्राइव को भरना पड़ता था। इसलिए हम क्विट () पद्धति का सही उपयोग कर रहे थे लेकिन कोड अनुपलब्ध था। सारांश सुनिश्चित करें कि सभी कोड पथ अपवाद सुरक्षित पैटर्न का उपयोग करके या अप्रचलित उपयोग को लागू करके आपकी अप्रबंधित वस्तुओं को साफ करेंगे

साथ ही
रिमोटड्राइव कॉलिंग क्विट () या डिस्पोज़ () के मामले में सेलेनियम सर्वर पर भी सत्र बंद हो जाएगा। यदि सत्र बंद नहीं है, तो उस सत्र के लिए लॉग फ़ाइलें स्मृति में रहती हैं।


आपने अपने अपवादों को कैसे अपडेट किया? बस हर एक के पास जाओ और एक छुट्टी () जोड़ो?
मार्क मेयो

1
NUnit, JUnit जैसे टेस्ट फ्रेम वर्क में, आपको केवल यह सुनिश्चित करना है कि डिस्पोज़ () TestTeardown () या TestFixtureTeardown () में है। C # में आप केवल "उपयोग" कथन का उपयोग कर सकते हैं और यदि अपवाद को उठाया जाता है, तो डिस्पोज़ को हमेशा कहा जाता है। आप अंत में एक कोशिश कैच का उपयोग करके जावा में कुछ ऐसा कर सकते हैं और अंत में डिस्पोज को डाल सकते हैं।
rcasady616

1
@ rcasady616 यह मुझे मिली सबसे अच्छी व्याख्या है। इसके लिए धन्यवाद और मुझे लगता है कि यह उत्थान के योग्य है।
आरएनएस

2
@ Mr.Bultitude अच्छी तरह से, कि समझ में आता है, पर विचार वहाँ है कोई फर्क नहीं ^^ इस जवाब के अनुसार, Quit()एक रीडायरेक्ट करने के लिए हैDispose()
PixelMaster

1
@Pixelaster, हाँ 100% सही हैं, मूल रूप से एक पुनर्निर्देशित हैं। सेलेनियम में कोड लिखने वाले व्यक्ति नहीं होने के कारण मैं केवल यह अनुमान लगा सकता हूं कि दोनों विधियां C # क्लाइंट बाइंडिंग में क्यों मौजूद हैं। संभवतः वे ग्राहक भाषाओं में "छोड़ने" के लिए एक सामान्य विधि के साथ रखना चाहते हैं, लेकिन ड्राइवर को "उपयोग" बयान वाक्यविन्यास में भी उपयोग करना चाहते थे (चुड़ैल को निपटान () विधि की आवश्यकता होगी)। यह मेरा सबसे अच्छा अनुमान है, या तो कोड को साफ करने की आवश्यकता है।
rcasady616

47

Close() - इसका उपयोग वर्तमान में फोकस वाले ब्राउज़र या पेज को बंद करने के लिए किया जाता है।

Quit() - इसका उपयोग वेब ड्राइवर इंस्टेंस को बंद करने या वेब ड्रायवर इंस्टेंस को नष्ट करने के लिए किया जाता है (सभी विंडो बंद करें)।

Dispose() - मुझे इस विधि की जानकारी नहीं है।


3
यदि आप .NET भाषा बाइंडिंग का उपयोग कर रहे हैं, Quitऔर Disposeविधियों को एक दूसरे के लिए समानार्थक होना चाहिए। दूसरे शब्दों में, Quitकॉल Dispose
जिमेवंस

23

driver.closeऔर driver.quitसेलेनियम वेबड्राइवर में ब्राउज़र सत्र को बंद करने के दो अलग-अलग तरीके हैं। दोनों को समझना और यह जानना कि प्रत्येक विधि का उपयोग करना आपके परीक्षण के निष्पादन में महत्वपूर्ण है। इसलिए, मैंने इन दोनों तरीकों पर कुछ प्रकाश डालने की कोशिश की है।

driver.close- यह विधि उस ब्राउज़र विंडो को बंद कर देती है जिस पर ध्यान केंद्रित किया जाता है। इस पद्धति के लिए परिचित नाम के बावजूद, इंटरफ़ेस को लागू नहींWebDriver करता हैAutoCloseable

driver.quit- यह विधि मूल रूप से driver.disposeअब एक आंतरिक विधि कहलाती है जो बदले में सभी ब्राउज़र विंडो को बंद कर देती है और WebDriver सत्र को शान से समाप्त करती है।

driver.dispose- जैसा कि पहले उल्लेख किया गया है, वेबड्राइवर की एक आंतरिक विधि है जो चुपचाप एक और उत्तर के अनुसार गिरा दी गई है - सत्यापन की आवश्यकता है। यह विधि वास्तव में एक सामान्य परीक्षण वर्कफ़्लो में उपयोग-मामला नहीं है क्योंकि पिछले विधियों में से अधिकांश का उपयोग मामलों के लिए करना चाहिए।

स्पष्टीकरण उपयोग मामला: driver.quitजब भी आप कार्यक्रम को समाप्त करना चाहते हैं, तब आपको इसका उपयोग करना चाहिए । यह सभी खोले गए ब्राउज़र विंडो को बंद कर देगा और वेबड्राइवर सत्र को समाप्त कर देगा। यदि आप driver.quitप्रोग्राम के अंत में उपयोग नहीं करते हैं , तो वेबड्राइवर सत्र ठीक से बंद नहीं होगा और मेमोरी से फाइलें क्लियर नहीं होंगी। यह स्मृति रिसाव त्रुटियों में परिणाम हो सकता है।

उपरोक्त विवरण को WebDriver में अंतर driver.closeऔर driver.quitविधियों के बीच का अंतर बताना चाहिए । मुझे उम्मीद है कि आप इसे उपयोगी पाएँ।

निम्नलिखित वेबसाइट में सेलेनियम परीक्षण पर कुछ अच्छे सुझाव दिए गए हैं: लिंक


मैंने यह भी देखा कि IE आधारित स्वचालन के साथ काम करने के लिए उपयोग किए जाने वाले IEDrivers यदि आप Driver.close () पद्धति का उपयोग करते हैं तो बाहर नहीं निकलते हैं। मुझे इसे समाप्त करने के लिए Driver.quit () का उपयोग करना पड़ा। इसका कारण यह है कि पद छोड़ना () विधि भी बंद () के विपरीत संसाधनों को साफ करने के लिए प्रकट होती है, हालांकि, मेरे उदाहरण में, मेरे पास हमेशा एक ही टैब है।
पवन डिटाकावी

14

quit(): इस ड्राइवर को छोड़ देता है, जो खुली हुई हर खिड़की को बंद करता है।

close() : वर्तमान विंडो खुली होने पर ब्राउज़र को छोड़ कर वर्तमान विंडो बंद करें।


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

5

close (): - मान लीजिए कि आपने एक ही ड्राइवर उदाहरण के साथ कई ब्राउज़र विंडो खोली हैं, अब ड्राइवर इंस्टेंस पर कॉलिंग () बंद हो जाएगी और ड्राइवर की ओर इशारा की गई वर्तमान विंडो बंद हो जाएगी। लेकिन ड्राइवर का उदाहरण अभी भी मेमोरी में रहता है और इसका उपयोग अन्य ओपन ब्राउज़र विंडो को संभालने के लिए किया जा सकता है।

छोड़ दिया (): - यदि आप ड्राइवर के उदाहरण पर छोड़ें () कहते हैं और एक या अधिक ब्राउज़र विंडो खुली हैं, तो यह सभी खुली हुई ब्राउज़र विंडो को बंद कर देगा और ड्राइवर का उदाहरण कचरा एकत्र कर लिया जाएगा अर्थात मेमोरी से हटा दिया जाएगा। इसलिए अब आप इस ड्राइवर का उपयोग उस पर कॉल () छोड़ने के बाद अन्य ऑपरेशन करने के लिए नहीं कर सकते हैं। यदि आप ऐसा करते हैं तो यह एक अपवाद फेंक देगा।

डिस्पोज़ (): - मुझे नहीं लगता कि वेबड्राइवर उदाहरण के लिए डिस्पोज़ विधि है।

आप संदर्भ के लिए इस सेलेनियम आधिकारिक जावा डॉक्टर लिंक पर जा सकते हैं ।


"मुझे नहीं लगता कि वेबड्राइवर उदाहरण के लिए एक निपटान विधि है।" यकीन है कि वहाँ है (कम से कम C # में)।
EJoshuaS -

5

फैंटम जेएस के गितुब पर एक मुद्दे के आधार पर, छोड़ो () फैंटमोज की प्रक्रिया को समाप्त नहीं करता है। आपको उपयोग करना चाहिए:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

संपर्क


5

बंद () एक वेबड्राइवर कमांड है जो ब्राउज़र विंडो को बंद करता है जो वर्तमान में फोकस में है। इस पद्धति के लिए परिचित नाम के बावजूद, इंटरफ़ेस को लागू नहींWebDriver करता हैAutoCloseable

स्वचालन प्रक्रिया के दौरान, यदि एक से अधिक ब्राउज़र विंडो खोली जाती हैं, तो क्लोज़ () कमांड केवल वर्तमान ब्राउज़र विंडो को बंद कर देगा जो उस समय फोकस कर रहा है। शेष ब्राउज़र विंडो बंद नहीं होंगी। वर्तमान ब्राउज़र विंडो बंद करने के लिए निम्न कोड का उपयोग किया जा सकता है:

छोड़ने () एक वेबड्राइवर कमांड है जो ड्राइवर.डिजाइन विधि को कॉल करता है, जो बदले में सभी ब्राउज़र विंडो को बंद करता है और वेबड्राइवर सत्र को समाप्त करता है। यदि हम प्रोग्राम के अंत में छोड़ें () का उपयोग नहीं करते हैं, तो वेबड्राइवर सत्र ठीक से बंद नहीं किया जाएगा और मेमोरी बंद नहीं की जाएगी। यह स्मृति रिसाव त्रुटियों में परिणाम हो सकता है।

यदि स्वचालन प्रक्रिया केवल एक ब्राउज़र विंडो खोलती है, तो बंद () और छोड़ें () कमांड उसी तरह से काम करती हैं। स्वचालन के दौरान खोले गए एक से अधिक ब्राउज़र विंडो होने पर दोनों अपनी कार्यक्षमता में भिन्न होंगे।

उपरोक्त रेफरी के लिए: यहां क्लिक करें

डिस्पोज़ कमांड डिसपोज़ () को क्विट () कॉल करना चाहिए, और ऐसा प्रतीत होता है कि यह करता है। हालाँकि, इसमें भी यही समस्या है कि किसी भी बाद की कार्रवाई तब तक अवरुद्ध है जब तक कि फैंटम जेएस मैन्युअल रूप से बंद नहीं हो जाता।

रेफरी लिंक


3

Driver.close () और driver.quit () के बीच अंतर

Driver.close - यह ब्राउज़र विंडो को बंद करता है, जिस पर फ़ोकस सेट किया गया है।

Driver.quit - यह मूल रूप से Driver.dispose विधि को कॉल करता है, जो बदले में सभी ब्राउज़र विंडो को बंद कर देता है और WebDriver सेशन को समाप्त करता है।


2

सेलेनियम वेबड्राइवर

  1. WebDriver.Close()इस पद्धति का उपयोग वर्तमान खुली खिड़की को बंद करने के लिए किया जाता है। यह वर्तमान खुली खिड़की को बंद कर देता है जिस पर चालक का ध्यान केंद्रित है।

  2. WebDriver.Quit()इस विधि का उपयोग WebDriver की आवृत्ति को नष्ट करने के लिए किया जाता है। यह उस ड्राइवर से जुड़े सभी ब्राउज़र विंडोज को बंद कर देता है और सुरक्षित रूप से सत्र को समाप्त कर देता है। WebDriver.Quit () कॉल डिस्पोज़।

  3. WebDriver.Dispose() यह विधि सभी ब्राउज़र विंडो को बंद कर देती है और सत्र को सुरक्षित रूप से समाप्त कर देती है


4
यदि आप कुछ उद्धृत करते हैं तो आपको स्रोत देना चाहिए।
मीरियन ह्यूजेस

2

मेरी समझ driver.close();वर्तमान ब्राउज़र को बंद कर देगी, और driver.quit();सभी ब्राउज़र को समाप्त कर देगी।

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