Differenza tra webdriver.Dispose (), .Close () e .Quit ()


285

Qual è la differenza tra questi

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

Quale da usare e quando?


2
Il metodo #dispose sembra essere stato eliminato in silenzio dall'API WebDriver. Nessuna menzione nel log delle modifiche, la menzione più recente che ho trovato è stata v2.26 api docs, per la quale non riesco più a trovare il collegamento.
jordanpg,

Vedo da dove viene la confusione nelle risposte di seguito. Penso che questa domanda fosse originariamente una domanda C # poiché i metodi sopra (Chiudi, Esci e Disponi) iniziano con una lettera maiuscola (C #) non con una lettera minuscola (java). Dispose non è stato eliminato dai bind client WebDriver di C #.
rcasady616,

Dispose è un modello .Net e quindi non è documentato nei documenti API del selenio. In RemoteWebDriver, Quit chiama Dispose, che invia un comando Quit (DELETE / session / {sessionId}). Esistono diversi punti sul lato client in cui viene intercettato il comando Esci. L'implementazione .net di FirefoxDriver, ad esempio, eseguirà effettivamente una chiamata process.Kill () se il processo non si arresta correttamente.
Tamir Daniely,

Risposte:


244

Questa è una buona domanda che ho visto che le persone usano Close () quando non dovrebbero. Ho cercato nel codice sorgente i collegamenti Selenio Client & WebDriver C # e ho trovato quanto segue.

  1. webDriver.Close() - Chiudere la finestra del browser su cui è focalizzato il driver
  2. webDriver.Quit() - Calls Dispose ()
  3. webDriver.Dispose() Chiude tutte le finestre del browser e termina in modo sicuro la sessione

Il codice seguente eliminerà l'oggetto driver, termina la sessione e chiude tutti i browser aperti durante un test, indipendentemente dal fatto che il test fallisca o superi.

public IWebDriver Driver;

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

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

In breve, assicurati che sia chiamato Quit () o Dispose () prima di uscire dal programma e non utilizzare il metodo Close () a meno che tu non sia sicuro di ciò che stai facendo.

Nota
Ho trovato questa domanda quando ho cercato di capire un problema correlato perché la mia VM stava esaurendo lo spazio sul disco rigido. Si scopre che un'eccezione stava impedendo a Quit () o Dispose () di non essere chiamato ad ogni esecuzione, causando quindi il riempimento del disco rigido nella cartella appData. Quindi stavamo usando correttamente il metodo Quit () ma il codice era irraggiungibile. Riepilogo assicurarsi che tutti i percorsi del codice puliscano gli oggetti non gestiti utilizzando schemi sicuri delle eccezioni o implementando IDisposable

Inoltre,
nel caso di RemoteDriver, la chiamata a Quit () o Dispose () chiuderà anche la sessione sul server Selenium. Se la sessione non è chiusa, i file di registro per quella sessione rimangono in memoria.


Come hai aggiornato le tue eccezioni? Basta andare a ciascuno e aggiungere un quit ()?
Mark Mayo,

1
In un frame di test come NUnit, JUnit devi solo assicurarti che Dispose () sia in TestTeardown () o TestFixtureTeardown (). In C # puoi semplicemente usare un'istruzione "using" e Dispose viene sempre chiamato se viene sollevata un'eccezione. Puoi fare qualcosa di simile in Java usando un tentativo try finalmente e metti il ​​Dispose nel finalmente.
rcasady616,

1
@ rcasady616 Questa è la migliore spiegazione che ho. Grazie per questo e penso che sia degno di essere votato.
RNS,

2
@ Mr.Bultitude bene, che è comprensibile, considerando che c'è alcuna differenza ^^ Secondo questa risposta, Quit()è un redirect aDispose()
pixelmaster

1
@PixelMaster, Sì, sono corretti al 100%, in pratica è un reindirizzamento. Non essendo quello che ha scritto il codice in Selenio, posso solo immaginare il motivo per cui entrambi i metodi sono presenti nei collegamenti client C #. Probabilmente vogliono mantenere un metodo comune per "uscire" tra le lingue client, ma vogliono anche usare il driver in una sintassi dell'istruzione "using" (witch richiederebbe il metodo Dispose ()). Questa è la mia ipotesi migliore, sia quella che il codice devono essere ripuliti.
rcasady616

47

Close() - Viene utilizzato per chiudere il browser o la pagina che sta avendo lo stato attivo.

Quit() - Viene utilizzato per chiudere l'istanza del driver Web o distruggere l'istanza del driver Web (Chiudere tutte le finestre).

Dispose() - Non sono a conoscenza di questo metodo.


3
Se si utilizzano i collegamenti al linguaggio .NET, i metodi Quite Disposedevono essere sinonimi l'uno per l'altro. In altre parole, Quitchiama Dispose.
JimEvans,

23

driver.closee driver.quitsono due metodi diversi per chiudere la sessione del browser in Selenium WebDriver. Comprendere entrambi e sapere quando utilizzare ciascun metodo è importante per l'esecuzione del test. Pertanto, ho cercato di far luce su entrambi questi metodi.

driver.close- Questo metodo chiude la finestra del browser su cui è impostato lo stato attivo. Nonostante il nome familiare per questo metodo, WebDrivernon senza implementare l' AutoCloseableinterfaccia .

driver.quit- Questo metodo in sostanza chiama driver.disposeun metodo ora interno che a sua volta chiude tutte le finestre del browser e termina la sessione WebDriver con grazia.

driver.dispose- Come accennato in precedenza, è un metodo interno di WebDriver che è stato eliminato in silenzio in base a un'altra risposta. - È necessaria la verifica. Questo metodo in realtà non ha un caso d'uso in un normale flusso di lavoro di test poiché uno dei metodi precedenti dovrebbe funzionare per la maggior parte dei casi d'uso.

Spiegazione del caso d'uso: utilizzare driver.quitogni volta che si desidera terminare il programma. Chiuderà tutte le finestre del browser aperte e termina la sessione WebDriver. Se non si utilizza driver.quitalla fine del programma, la sessione WebDriver non si chiuderà correttamente e i file non verrebbero cancellati dalla memoria. Ciò può causare errori di perdita di memoria.

La spiegazione sopra dovrebbe spiegare la differenza tra driver.closee driver.quitmetodi in WebDriver. Spero che lo trovi utile.

Il seguente sito web ha alcuni buoni consigli sui test del selenio: Link


Ho anche notato che gli IEDriver utilizzati per lavorare con l'automazione basata su IE non si chiudono se si utilizza il metodo driver.close (). Ho dovuto usare driver.quit () per terminarlo. È perché il metodo quit () sembra anche ripulire le risorse a differenza di close (), anche se, nel mio esempio, ho sempre una singola scheda.
Pavan Dittakavi

14

quit(): Chiude questo driver, chiudendo tutte le finestre associate aperte.

close() : Chiude la finestra corrente, chiudendo il browser se è l'ultima finestra attualmente aperta.


questa risposta manca la differenza chiave: quit () interromperà il servizio webdriver sottostante, mentre close () no. suggerimento: non chiamare mai close () se rimane solo una finestra
Corey Goldberg,

5

close (): - Supponiamo di aver aperto più finestre del browser con la stessa istanza del driver, ora chiamando close () sull'istanza del driver si chiuderà la finestra corrente a cui è puntata l'istanza del driver. Ma l'istanza del driver rimane ancora in memoria e può essere utilizzata per gestire altre finestre del browser aperte.

quit (): - Se si chiama quit () sull'istanza del driver e sono aperte una o più finestre del browser, si chiuderanno tutte le finestre del browser aperte e l'istanza del driver verrà raccolta in modo inutile, ovvero rimossa dalla memoria. Quindi ora non puoi usare questa istanza del driver per fare altre operazioni dopo aver chiamato quit () su di essa. Se lo fai genererà un'eccezione.

dispose (): - Non credo che esista un metodo dispose per un'istanza WebDriver.

Puoi consultare questo link al java doc ufficiale di selenio come riferimento.


"Non credo che esista un metodo di eliminazione per un'istanza di WebDriver." Certo che c'è (almeno in C #).
EJoshuaS - Ripristina Monica il

5

Sulla base di un problema su Github di PhantomJS, quit () non termina il processo PhantomJS. Dovresti usare:

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

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

collegamento


5

close () è un comando webdriver che chiude la finestra del browser che è attualmente attiva. Nonostante il nome familiare per questo metodo, WebDrivernon senza implementare l' AutoCloseableinterfaccia .

Durante il processo di automazione, se è aperta più di una finestra del browser, il comando close () chiuderà solo la finestra del browser corrente che è attiva in quel momento. Le restanti finestre del browser non verranno chiuse. Il seguente codice può essere utilizzato per chiudere la finestra del browser corrente:

quit () è un comando webdriver che chiama il metodo driver.dispose, che a sua volta chiude tutte le finestre del browser e termina la sessione WebDriver. Se non usiamo quit () alla fine del programma, la sessione WebDriver non verrà chiusa correttamente e i file non verranno cancellati dalla memoria. Ciò può causare errori di perdita di memoria.

Se il processo di automazione apre solo una singola finestra del browser, i comandi close () e quit () funzionano allo stesso modo. Entrambi differiranno nella loro funzionalità quando ci sono più finestre del browser aperte durante l'automazione.

Per sopra Ref: clicca qui

Il comando Dispose Dispose () dovrebbe chiamare Quit () e sembra che lo faccia. Tuttavia, presenta anche lo stesso problema in quanto eventuali azioni successive vengono bloccate fino alla chiusura manuale di PhantomJS.

Rif link


3

Differenza tra driver.close () e driver.quit ()

driver.close - Chiude la finestra del browser su cui è impostato lo stato attivo.

driver.quit - Praticamente chiama il metodo driver.dispose che a sua volta chiude tutte le finestre del browser e termina la sessione WebDriver con grazia.


2

Selenium WebDriver

  1. WebDriver.Close()Questo metodo viene utilizzato per chiudere la finestra aperta corrente. Chiude la finestra aperta corrente su cui si concentra il driver.

  2. WebDriver.Quit()Questo metodo viene utilizzato per distruggere l'istanza di WebDriver. Chiude tutti i browser Windows associati a quel driver e termina in modo sicuro la sessione. WebDriver.Quit () chiama Dispose.

  3. WebDriver.Dispose() Questo metodo chiude tutte le finestre del browser e termina in modo sicuro la sessione


4
se citi qualcosa dovresti dare la fonte.
Meirion Hughes,

2

La mia comprensione è driver.close();chiudere il browser corrente e driver.quit();terminerà tutto il browser.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.