Perbedaan antara webdriver.Dispose (), .Close () dan .Quit ()

285

Apa perbedaannya?

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

Yang mana yang akan digunakan dan kapan?

Puran Joshi
sumber
2
Metode #dispose tampaknya telah diam-diam dihapus dari API WebDriver. Tidak disebutkan di changelog, sebutan terbaru yang bisa saya temukan adalah v2.26 api docs, yang saya tidak dapat menemukan tautannya lagi.
jordanpg
Saya melihat dari mana kebingungan berasal dari jawaban di bawah ini. Saya pikir pertanyaan ini awalnya merupakan pertanyaan C # karena metode di atas (Tutup, Berhenti dan Buang) dimulai dengan huruf kapital (C #) bukan huruf kecil (java). Buang belum dijatuhkan dari ikatan klien C # WebDriver.
rcasady616
Buang adalah pola .Net dan karenanya tidak didokumentasikan dalam dokumen API selenium. Di RemoteWebDriver, Berhenti panggilan Buang, yang mengirimkan perintah Berhenti (HAPUS / session / {sessionId}). Ada beberapa tempat di sisi klien di mana perintah Berhenti dicegat. Implementasi FirefoxDriver .net misalnya akan benar-benar melakukan proses.Kill () panggilan jika proses tidak dimatikan dengan anggun.
Tamir Daniely

Jawaban:

244

Ini adalah pertanyaan bagus yang saya lihat orang menggunakan Close () padahal seharusnya tidak. Saya mencari kode sumber untuk Selenium Client & WebDriver C # Bindings dan menemukan yang berikut ini.

  1. webDriver.Close() - Tutup jendela browser yang menjadi fokus driver
  2. webDriver.Quit() - Panggilan Buang ()
  3. webDriver.Dispose() Menutup semua jendela browser dan mengakhiri sesi dengan aman

Kode di bawah ini akan membuang objek driver, mengakhiri sesi dan menutup semua browser yang dibuka selama tes apakah tes gagal atau lulus.

public IWebDriver Driver;

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

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

Singkatnya memastikan bahwa Berhenti () atau Buang () dipanggil sebelum keluar dari program, dan jangan gunakan metode Tutup () kecuali Anda yakin dengan apa yang Anda lakukan.

Catatan
Saya menemukan pertanyaan ini ketika mencoba untuk mencari tahu masalah terkait mengapa VM saya kehabisan ruang harddisk. Ternyata pengecualian menyebabkan Berhenti () atau Buang () tidak dipanggil setiap kali dijalankan yang kemudian menyebabkan folder appData mengisi hard drive. Jadi kami menggunakan metode Berhenti () dengan benar tetapi kode itu tidak dapat dijangkau. Ringkasan memastikan semua jalur kode akan membersihkan objek yang tidak dikelola dengan menggunakan pola aman pengecualian atau menerapkan IDisposable

Juga
dalam kasus panggilan RemoteDriver Berhenti () atau Buang () juga akan menutup sesi di Server Selenium. Jika sesi tidak ditutup file log untuk sesi itu tetap ada dalam memori.

rcasady616
sumber
Bagaimana Anda memperbarui pengecualian Anda? Cukup buka masing-masing dan tambahkan keluar ()?
Mark Mayo
1
Dalam kerangka kerja tes seperti NUnit, JUnit Anda hanya perlu memastikan bahwa Buang () ada di TestTeardown () atau TestFixtureTeardown (). Dalam C # Anda bisa menggunakan pernyataan "menggunakan" dan Buang selalu dipanggil jika pengecualian muncul. Anda dapat melakukan hal serupa di Jawa dengan menggunakan try catch akhirnya dan buang Buang di akhirnya.
rcasady616
1
@ rcasady616 Ini adalah penjelasan terbaik yang saya dapatkan. Terima kasih untuk itu dan saya pikir itu layak untuk upvote.
RNS
2
@ Mr.Bultitude baik, itu bisa dimengerti, mengingat ada adalah ada perbedaan ^^ Menurut jawaban ini, Quit()adalah redirect keDispose()
PixelMaster
1
@ PixelMaster, Ya 100% benar, pada dasarnya itu adalah pengalihan. Bukan menjadi orang yang menulis kode dalam Selenium, saya hanya bisa menebak mengapa kedua metode ini hadir dalam binding klien C #. Mungkin mereka ingin tetap menggunakan metode umum untuk "Berhenti" di seluruh bahasa klien, tetapi juga ingin menggunakan driver dalam sintaks pernyataan "menggunakan" (penyihir akan membutuhkan metode Buang ()). Itu tebakan terbaik saya, baik itu atau kode perlu dibersihkan.
rcasady616
47

Close() - Digunakan untuk menutup browser atau halaman saat ini yang memiliki fokus.

Quit() - Digunakan untuk mematikan instance driver web atau menghancurkan instance driver web (Tutup semua jendela).

Dispose() - Saya tidak mengetahui metode ini.

Manigandan
sumber
3
Jika Anda menggunakan binding bahasa .NET, Quitdan Disposemetode harus sinonim satu sama lain. Dengan kata lain, Quitpanggilan Dispose.
JimEvans
22

driver.closedan driver.quitdua metode berbeda untuk menutup sesi browser di Selenium WebDriver. Memahami keduanya dan mengetahui kapan harus menggunakan setiap metode adalah penting dalam pelaksanaan pengujian Anda. Karena itu, saya telah mencoba menjelaskan kedua metode ini.

driver.close- Metode ini menutup jendela browser tempat fokus diatur. Meskipun nama akrab untuk metode ini, WebDrivertidak tidak melaksanakan AutoCloseableantarmuka .

driver.quit- Metode ini pada dasarnya memanggil driver.disposemetode sekarang internal yang pada gilirannya menutup semua jendela browser dan mengakhiri sesi WebDriver dengan anggun.

driver.dispose- Seperti disebutkan sebelumnya, adalah metode internal WebDriver yang telah diam-diam dijatuhkan sesuai dengan jawaban lain - Verifikasi diperlukan. Metode ini benar-benar tidak memiliki use-case dalam alur kerja tes normal karena salah satu metode sebelumnya harus bekerja untuk sebagian besar use case.

Penjelasan use case: Anda harus menggunakan driver.quitkapan pun Anda ingin mengakhiri program. Ini akan menutup semua jendela browser yang terbuka dan mengakhiri sesi WebDriver. Jika Anda tidak menggunakan driver.quitdi akhir program, sesi WebDriver tidak akan menutup dengan benar dan file tidak akan dihapus dari memori. Ini dapat menyebabkan kesalahan kebocoran memori.

Penjelasan di atas harus menjelaskan perbedaan antara driver.closedan driver.quitmetode di WebDriver. Saya harap Anda menemukannya bermanfaat.

Situs web berikut memiliki beberapa tips bagus tentang pengujian selenium: Tautan

Anudeep Samaiya
sumber
14

quit(): Keluar dari driver ini, tutup setiap jendela terkait yang terbuka.

close() : Tutup jendela saat ini, keluar dari browser jika itu jendela terakhir saat ini terbuka.

Ran Adler
sumber
jawaban ini melewatkan perbedaan utama: berhenti () akan menghentikan layanan webdriver yang mendasarinya, sementara tutup () tidak. pro-tip: jangan pernah panggil tutup () jika hanya satu jendela yang tersisa
Corey Goldberg
5

close (): - Misalkan Anda telah membuka banyak jendela browser dengan instance driver yang sama, sekarang memanggil close () pada instance driver akan menutup jendela saat ini yang ditunjukkan oleh instance driver. Tetapi instance driver masih tetap ada dalam memori dan dapat digunakan untuk menangani jendela browser lain yang terbuka.

quit (): - Jika Anda memanggil exit () pada instance driver dan ada satu atau lebih jendela browser yang terbuka, itu akan menutup semua jendela browser yang terbuka dan instance driver adalah sampah yang dikumpulkan yaitu dihapus dari memori. Jadi sekarang Anda tidak dapat menggunakan contoh driver ini untuk melakukan operasi lain setelah panggilan berhenti () di atasnya. Jika Anda melakukannya akan mengeluarkan Exception.

dispose (): - Saya rasa tidak ada metode dispose untuk instance WebDriver.

Anda dapat pergi ke tautan java doc resmi selenium ini untuk referensi.

Prasanta Biswas
sumber
"Saya tidak berpikir ada metode buang untuk contoh WebDriver." Tentu ada (setidaknya dalam C #).
EJoshuaS
5

Berdasarkan masalah pada Github dari PhantomJS, berhenti () tidak menghentikan proses PhantomJS. Kamu harus menggunakan:

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

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

tautan

Wesam Na
sumber
5

close () adalah perintah webdriver yang menutup jendela browser yang saat ini sedang dalam fokus. Meskipun nama akrab untuk metode ini, WebDrivertidak tidak melaksanakan AutoCloseableantarmuka .

Selama proses otomatisasi, jika ada lebih dari satu jendela browser dibuka, maka perintah close () hanya akan menutup jendela browser saat ini yang memiliki fokus pada saat itu. Jendela browser yang tersisa tidak akan ditutup. Kode berikut dapat digunakan untuk menutup jendela browser saat ini:

quit () adalah perintah webdriver yang memanggil metode driver.dispose, yang pada gilirannya menutup semua jendela browser dan mengakhiri sesi WebDriver. Jika kita tidak menggunakan berhenti () di akhir program, sesi WebDriver tidak akan ditutup dengan benar dan file tidak akan dihapus dari memori. Ini dapat menyebabkan kesalahan kebocoran memori.

Jika proses Otomatisasi hanya membuka satu jendela browser, perintah tutup () dan keluar () bekerja dengan cara yang sama. Keduanya akan berbeda dalam fungsinya ketika ada lebih dari satu jendela browser dibuka selama Otomasi.

Untuk referensi Above: klik di sini

Buang Perintah Buang () harus memanggil Keluar (), dan tampaknya tidak. Namun, ia juga memiliki masalah yang sama dalam hal tindakan selanjutnya diblokir sampai PhantomJS ditutup secara manual.

Tautan Ref

Dhaval Atri
sumber
3

Perbedaan antara driver.close () & driver.quit ()

driver.close - Menutup jendela browser tempat fokus diatur.

driver.quit - Pada dasarnya memanggil metode driver.dispose yang pada gilirannya menutup semua jendela browser dan mengakhiri sesi WebDriver dengan anggun.

Nagarjuna Yalamanchili
sumber
2

Selenium WebDriver

  1. WebDriver.Close()Metode ini digunakan untuk menutup jendela terbuka saat ini. Itu menutup jendela terbuka saat ini di mana pengemudi memiliki fokus.

  2. WebDriver.Quit()Metode ini digunakan untuk menghancurkan instance WebDriver. Itu menutup semua Browser Windows yang terkait dengan driver itu dan dengan aman mengakhiri sesi. Panggilan WebDriver.Quit () Buang.

  3. WebDriver.Dispose() Metode ini menutup semua jendela Browser dan mengakhiri sesi dengan aman

s10v10s
sumber
4
jika Anda mengutip sesuatu, Anda harus memberikan sumbernya.
Meirion Hughes
2

Pemahaman saya adalah driver.close();akan menutup browser saat ini, dan driver.quit();akan menghentikan semua browser itu.

BIUbiubiu
sumber