Webdriver.Dispose (), .Close () ve .Quit () arasındaki fark


285

Bunlar arasındaki fark nedir

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

Hangisi ne zaman kullanılacak?


2
#Dispose yönteminin WebDriver API'sından sessizce kaldırıldığı görülüyor. Değişim günlüğünde bir söz yok, bulabildiğim en son söz, artık bağlantıyı bulamadığım v2.26 api dokümanlardı.
jordanpg

Aşağıdaki cevaplarda karışıklığın nereden geldiğini görüyorum. Bence bu soru başlangıçta bir C # sorusuydu (yukarıdaki gibi, Kapat, Çık ve At) küçük harfle değil, büyük harfle (C #) başlar İmha C # WebDriver istemci bağlarından kaldırılmadı.
rcasady616

Dispose bir .Net kalıbıdır ve bu nedenle selenyum'un API belgelerinde belgelenmemiştir. RemoteWebDriver'da, bir Quit komutu (DELETE / session / {sessionId}) gönderen Quit çağrıları Dispose. İstemci tarafında Quit komutunun durdurulduğu birkaç yer vardır. Örneğin FirefoxDriver .net uygulaması, işlem zarif bir şekilde kapanmazsa aslında bir process.Kill () çağrısı yapar.
Tamir Daniely

Yanıtlar:


244

Bu insanların Close () kullandıklarını gördüklerinde gördükleri iyi bir soru. Selenium Client & WebDriver C # Bindings için kaynak koduna baktım ve aşağıdakileri buldum.

  1. webDriver.Close() - Sürücünün odaklandığı tarayıcı penceresini kapatın
  2. webDriver.Quit() - Dispose Çağrıları ()
  3. webDriver.Dispose() Tüm tarayıcı pencerelerini kapatır ve oturumu güvenli bir şekilde sonlandırır

Aşağıdaki kod, sürücü nesnesini atar, oturumu sonlandırır ve bir test sırasında testin başarısız olup olmadığını veya geçip geçmediğini tüm tarayıcıları kapatır.

public IWebDriver Driver;

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

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

Özetle, programdan çıkmadan önce Quit () veya Dispose () öğesinin çağrıldığından emin olun ve ne yaptığınızdan emin değilseniz Close () yöntemini kullanmayın.

Not
Sanal makinemde neden sabit disk alanı tükeniyor diye ilgili bir sorunu çözmeye çalışırken bu soruyu buldum. İstisna, Quit () veya Dispose () işlevinin her çalıştırmada çağrılmamasına neden oldu ve bu da appData klasörünün sabit sürücüyü doldurmasına neden oldu. Bu yüzden Quit () yöntemini doğru bir şekilde kullanıyorduk ancak koda ulaşılamıyordu. Özet, tüm kod yollarının, istisna güvenli kalıplar kullanarak veya yönetilmeyen nesneleri kullanarak yönetilmeyen nesnelerinizi temizleyeceğinden emin olun

Ayrıca
RemoteDriver'ın çağrılması durumunda Quit () veya Dispose () de Selenium Sunucusundaki oturumu kapatır. Oturum kapatılmazsa, o oturumun günlük dosyaları bellekte kalır.


İstisnalarınızı nasıl güncellediniz? Her birine gidin ve bir quit () ekleyin?
Mark Mayo

1
NUnit, JUnit gibi bir test çerçevesinde yalnızca Dispose () öğesinin TestTeardown () veya TestFixtureTeardown () içinde olduğundan emin olmanız gerekir. C # 'da sadece bir "using" deyimi kullanabilirsiniz ve bir istisna ortaya çıkarsa Dispose her zaman çağrılır. Sonunda bir try catch kullanarak ve sonunda Dispose koyarak Java'da benzer bir şey yapabilirsiniz.
rcasady616

1
@ rcasady616 Bu elimdeki en iyi açıklama. Bunun için teşekkürler ve bence oy için layık.
RNS

2
Orada göz önüne alındığında anlaşılabilir iyi Mr.Bultitude, @ olduğu bu cevaba göre hiçbir fark ^^, Quit()bir yönlendirme etmektirDispose()
PixelMaster

1
@PixelMaster, Evet% 100 doğru, temelde bir yönlendirme. Selenium kod yazan biri olmak değil, sadece neden her iki yöntem C # istemci bağlamaları mevcut olarak tahmin edebilirsiniz. Muhtemelen, istemci dilleri arasında "Çıkmak" için ortak bir yöntemle devam etmek istiyorlar, ancak sürücüyü "using" deyimi sözdiziminde kullanmak istiyorlardı (cadı Dispose () yöntemini gerektirir). Bu benim en iyi tahminim, ya da kodun temizlenmesi gerekiyor.
rcasady616

47

Close() - Şu anda odağı olan tarayıcıyı veya sayfayı kapatmak için kullanılır.

Quit() - Web sürücüsü örneğini kapatmak veya web sürücüsü örneğini yok etmek için kullanılır (Tüm pencereleri kapatın).

Dispose() - Bu yöntemin farkında değilim.


3
.NET dil bağlamaları kullanıyorsanız, Quitve Disposeyöntemleri birbirlerinin eş anlamlıları olmalıdır. Başka bir deyişle, Quitaramalar Dispose.
JimEvans

23

driver.closeve driver.quitSelenium WebDriver'da tarayıcı oturumunu kapatmak için iki farklı yöntemdir. Her ikisini de anlamak ve her yöntemi ne zaman kullanacağınızı bilmek test yürütmenizde önemlidir. Bu nedenle, bu yöntemlerin her ikisine de ışık tutmaya çalıştım.

driver.close- Bu yöntem, odağın ayarlandığı tarayıcı penceresini kapatır. Bu yöntem için tanıdık isim rağmen, WebDriveryok değil uygulamak AutoCloseablearabirimi .

driver.quit- Bu yöntem temel olarak driver.disposeşimdi tüm tarayıcı pencerelerini kapatan ve WebDriver oturumunu zarif bir şekilde sonlandıran dahili bir yöntemi çağırır .

driver.dispose- Daha önce de belirtildiği gibi, başka bir cevaba göre sessizce düşürülen dahili bir WebDriver yöntemidir - Doğrulama gerekli. Önceki yöntemlerden çoğu çoğu kullanım durumunda çalışması gerektiğinden, bu yöntemin normal bir test iş akışında gerçekten bir kullanım durumu yoktur.

Açıklama kullanım örneği: driver.quitProgramı sonlandırmak istediğinizde kullanmalısınız . Açık olan tüm tarayıcı pencerelerini kapatır ve WebDriver oturumunu sonlandırır. driver.quitProgramın sonunda kullanmazsanız , WebDriver oturumu düzgün kapanmaz ve dosyalar bellekten silinmez. Bu, bellek sızıntısı hatalarına neden olabilir.

Yukarıdaki açıklama WebDriver'daki driver.closeve driver.quityöntem arasındaki farkı açıklamalıdır . Umarım faydalı bulursunuz.

Aşağıdaki web sitesinde selenyum testi ile ilgili bazı ipuçları bulunmaktadır: Link


Ben de driver.close () yöntemi kullanırsanız IE tabanlı otomasyon ile çalışmak için kullanılan IEDrivers çıkmaz fark ettim. Sonlandırmak için driver.quit () kullanmak zorunda kaldım. Benim örneğimde, her zaman tek bir sekme olmasına rağmen, quit () yöntemi de close () aksine kaynakları temizlemek gibi görünüyor çünkü.
Pavan Dittakavi

14

quit(): Açık olan ilgili tüm pencereleri kapatarak bu sürücüden çıkar.

close() : Geçerli pencereyi kapatın, o anda açık olan son pencere ise tarayıcıdan çıkın.


bu cevap temel farkı kaçırır: quit (), temel webdriver hizmetini durdurur, close () ise durmaz. pro-tip: sadece bir pencere kalırsa asla close () öğesini çağırma
Corey Goldberg

5

close (): - Aynı sürücü örneğiyle birden çok tarayıcı penceresi açtığınızı varsayalım, şimdi sürücü örneğinde close () çağrısı sürücü örneğinin işaret ettiği geçerli pencereyi kapatacaktır. Ancak sürücü örneği hala bellekte kalır ve diğer açık tarayıcı pencerelerini işlemek için kullanılabilir.

quit (): - Sürücü örneğinde quit () öğesini çağırırsanız ve açık bir veya daha fazla tarayıcı penceresi varsa, tüm açık tarayıcı pencerelerini kapatır ve sürücü örneği toplanan çöptür, yani bellekten kaldırılır. Şimdi bu sürücü örneğini, üzerinde quit () çağırdıktan sonra başka işlemler yapmak için kullanamazsınız. Bunu yaparsanız bir istisna atar.

dispose (): - Bir WebDriver örneği için bir dispose yöntemi olduğunu düşünmüyorum.

Referans için bu selenyum resmi java doc bağlantısına gidebilirsiniz .


"WebDriver örneği için bir imha yöntemi olduğunu düşünmüyorum." Elbette var (en azından C #).
EJoshuaS - Monica'yı

5

PhantomJS'nin Github'undaki bir soruna dayanarak quit (), PhantomJS işlemini sonlandırmaz. Kullanmalısın:

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

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

bağlantı


5

close () , şu anda odakta olan tarayıcı penceresini kapatan bir webdriver komutudur. Bu yöntem için tanıdık isim rağmen, WebDriveryok değil uygulamak AutoCloseablearabirimi .

Otomasyon işlemi sırasında, birden fazla tarayıcı penceresi açılmışsa, close () komutu yalnızca o sırada odağı olan geçerli tarayıcı penceresini kapatır. Kalan tarayıcı pencereleri kapatılmaz. Geçerli tarayıcı penceresini kapatmak için aşağıdaki kod kullanılabilir:

quit () , tüm tarayıcı pencerelerini kapatan ve WebDriver oturumunu sonlandıran driver.dispose yöntemini çağıran bir webdriver komutudur. Programın sonunda quit () kullanmazsak, WebDriver oturumu düzgün kapatılmaz ve dosyalar bellekten silinmez. Bu, bellek sızıntısı hatalarına neden olabilir.

Otomasyon işlemi yalnızca tek bir tarayıcı penceresi açarsa close () ve quit () komutları aynı şekilde çalışır. Otomasyon sırasında birden fazla tarayıcı penceresi açıldığında her ikisi de işlevlerinde farklılık gösterir.

Ref Üstü için: buraya tıklayın

Dispose Komutu Dispose () öğesi Quit () öğesini çağırmalıdır ve öyle görünür. Ancak, PhantomJS manuel olarak kapatılana kadar sonraki eylemlerin engellenmesi de aynı soruna sahiptir.

Ref Link


3

Driver.close () ve driver.quit () arasındaki fark

driver.close - Odağın ayarlandığı tarayıcı penceresini kapatır.

driver.quit - Temel olarak driver.dispose yöntemini çağırır, bu da tüm tarayıcı pencerelerini kapatır ve WebDriver oturumunu zarif bir şekilde sonlandırır.


2

Selenyum Web Sürücüsü

  1. WebDriver.Close()Bu yöntem geçerli açık pencereyi kapatmak için kullanılır. Sürücünün odaklandığı geçerli açık pencereyi kapatır.

  2. WebDriver.Quit()Bu yöntem WebDriver örneğini yok etmek için kullanılır. Bu sürücü ile ilişkili tüm Tarayıcı Pencerelerini kapatır ve oturumu güvenli bir şekilde sonlandırır. WebDriver.Quit () Dispose çağırır.

  3. WebDriver.Dispose() Bu yöntem tüm Tarayıcı pencerelerini kapatır ve oturumu güvenli bir şekilde sonlandırır


4
eğer bir şey teklif ederseniz kaynağı vermelisiniz.
Meirion Hughes

2

Anladığım kadarıyla driver.close();mevcut tarayıcı kapanacak ve driver.quit();tüm tarayıcı sona erecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.