Diferença entre webdriver.Dispose (), .Close () e .Quit ()

285

Qual é a diferença entre estes

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

Qual usar e quando?

Puran Joshi
fonte
2
O método #dispose parece ter sido eliminado silenciosamente da API WebDriver. Nenhuma menção no changelog, a menção mais recente que encontrei foi a v2.26 api docs, da qual não consigo mais encontrar o link.
Jordanpg
Vejo de onde vem a confusão nas respostas abaixo. Eu acho que essa pergunta era originalmente uma questão de C #, pois os métodos acima (Fechar, Sair e Dispor) começam com uma letra maiúscula (C #) e não minúscula (java). Dispose não foi eliminado das ligações do cliente C # WebDriver.
rcasady616
Dispose é um padrão .Net e, portanto, não está documentado nos documentos de API do selenium. No RemoteWebDriver, Quit chama Dispose, que envia um comando Quit (DELETE / session / {sessionId}). Existem vários locais no lado do cliente em que o comando Quit é interceptado. A implementação do FirefoxDriver .net, por exemplo, fará realmente uma chamada process.Kill () se o processo não for encerrado normalmente.
Tamir Daniely #

Respostas:

244

Esta é uma boa pergunta que eu já vi pessoas usarem Close () quando não deveriam. Procurei no código-fonte as ligações C # do Selenium Client e WebDriver e encontrei o seguinte.

  1. webDriver.Close() - Feche a janela do navegador em que o driver está focado
  2. webDriver.Quit() - Chamadas Dispose ()
  3. webDriver.Dispose() Fecha todas as janelas do navegador e encerra a sessão com segurança

O código abaixo descartará o objeto do driver, encerrará a sessão e fechará todos os navegadores abertos durante um teste, independentemente de o teste falhar ou passar.

public IWebDriver Driver;

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

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

Em resumo, verifique se Quit () ou Dispose () é chamado antes de sair do programa e não use o método Close (), a menos que tenha certeza do que está fazendo.

Observe
que encontrei essa pergunta ao tentar descobrir um problema relacionado por que minhas VMs estavam ficando sem espaço no disco rígido. Acontece que uma exceção estava causando Quit () ou Dispose () a não ser chamado a cada execução, o que fazia com que a pasta appData preenchesse o disco rígido. Então, estávamos usando o método Quit () corretamente, mas o código estava inacessível. Resumo, verifique se todos os caminhos de código limparão seus objetos não gerenciados usando padrões seguros de exceção ou implementarão IDisposable

Também
no caso do RemoteDriver, chamar Quit () ou Dispose () também fechará a sessão no Selenium Server. Se a sessão não estiver fechada, os arquivos de log dessa sessão permanecerão na memória.

rcasady616
fonte
Como você atualizou suas exceções? Basta ir a cada um e adicionar um quit ()?
23413 Mark Mayo
1
Em um quadro de teste, como NUnit, JUnit, você só precisa garantir que Dispose () esteja em TestTeardown () ou TestFixtureTeardown (). Em C #, você pode simplesmente usar uma instrução "using" e Dispose sempre é chamado se uma exceção for gerada. Você pode fazer algo semelhante em Java usando um try catch finalmente e colocar o Dispose no finalmente.
rcasady616
1
@ rcasady616 Esta é a melhor explicação que tenho. Obrigado por isso e acho que vale a pena votar.
RNS 4/17
2
@ Mr.Bultitude bem, isso é compreensível, considerando que não é nenhuma diferença ^^ De acordo com esta resposta, Quit()é um redirecionamento paraDispose()
PixelMaster
1
@PixelMaster, Sim, estão 100% corretos, é basicamente um redirecionamento. Não sendo quem escreveu o código no Selenium, só posso adivinhar por que os dois métodos estão presentes nas ligações do cliente C #. Provavelmente, eles desejam manter um método comum para "Sair" nos idiomas do cliente, mas também desejam usar o driver em uma sintaxe de instrução "using" (isso exigiria o método Dispose ()). Esse é o meu melhor palpite, ou isso ou o código precisa ser limpo.
precisa saber é o seguinte
47

Close() - É usado para fechar o navegador ou a página atualmente em foco.

Quit() - É usado para desligar a instância do driver da web ou destruir a instância do driver da web (Feche todas as janelas).

Dispose() - Não conheço esse método.

Manigandan
fonte
3
Se você estiver usando as ligações de idioma do .NET, os métodos Quite Disposedeverão ser sinônimos um para o outro. Em outras palavras, Quitchamadas Dispose.
21713 JimEvans
22

driver.closee driver.quitsão dois métodos diferentes para fechar a sessão do navegador no Selenium WebDriver. Compreender os dois e saber quando usar cada método é importante na execução do seu teste. Portanto, tentei lançar alguma luz sobre esses dois métodos.

driver.close- Este método fecha a janela do navegador na qual o foco está definido. Apesar do nome familiar para este método, WebDriverse não implementar a AutoCloseableinterface de .

driver.quit- Esse método basicamente chama driver.disposeum método agora interno que, por sua vez, fecha todas as janelas do navegador e encerra a sessão do WebDriver normalmente.

driver.dispose- Como mencionado anteriormente, é um método interno do WebDriver que foi eliminado silenciosamente de acordo com outra resposta - É necessária a verificação. Esse método realmente não possui um caso de uso em um fluxo de trabalho de teste normal, pois um dos métodos anteriores deve funcionar na maioria dos casos de uso.

Explicação: Caso de uso: Você deve usar driver.quitsempre que quiser finalizar o programa. Ele fechará todas as janelas abertas do navegador e encerrará a sessão do WebDriver. Se você não usar driver.quitno final do programa, a sessão do WebDriver não será fechada corretamente e os arquivos não serão limpos da memória. Isso pode resultar em erros de vazamento de memória.

A explicação acima deve explicar a diferença entre driver.closee driver.quitmétodos no WebDriver. Espero que você ache útil.

O site a seguir tem algumas boas dicas sobre o teste de selênio: Link

Anudeep Samaiya
fonte
14

quit(): Fecha este driver, fechando todas as janelas associadas que estavam abertas.

close() : Feche a janela atual, fechando o navegador se for a última janela aberta no momento.

Ran Adler
fonte
esta resposta perde a principal diferença: quit () interrompe o serviço subjacente do driver da web, enquanto close () não. dica profissional: nunca ligue para close () se apenas uma janela permanecer #
Corey Goldberg
5

close (): - Suponha que você tenha aberto várias janelas do navegador com a mesma instância do driver, agora, chamando close () na instância do driver fechará a janela atual para a qual a instância do driver está apontada. Mas a instância do driver ainda permanece na memória e pode ser usada para lidar com outras janelas abertas do navegador.

quit (): - Se você chamar quit () na instância do driver e houver uma ou mais janelas abertas, ele fechará todas as janelas abertas e a instância do driver será coletada como lixo, ou seja, removida da memória. Portanto, agora você não pode usar esta instância do driver para executar outra operação depois de chamar quit () nela. Se você fizer isso, lançará uma exceção.

dispose (): - Não acho que exista um método de descarte para uma instância do WebDriver.

Você pode acessar o link deste documento oficial do selênio em java para referência.

Prasanta Biswas
fonte
"Não acho que exista um método de descarte para uma instância do WebDriver." Claro que existe (pelo menos em C #).
EJoshuaS - Restabelece Monica
5

Com base em um problema no Github do PhantomJS, o quit () não finaliza o processo do PhantomJS. Você deveria usar:

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

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

ligação

Wesam Na
fonte
5

close () é um comando webdriver que fecha a janela do navegador que está atualmente em foco. Apesar do nome familiar para este método, WebDriverse não implementar a AutoCloseableinterface de .

Durante o processo de automação, se houver mais de uma janela do navegador aberta, o comando close () fechará apenas a janela atual do navegador que está sendo focada naquele momento. As janelas restantes do navegador não serão fechadas. O código a seguir pode ser usado para fechar a janela atual do navegador:

quit () é um comando webdriver que chama o método driver.dispose, que por sua vez fecha todas as janelas do navegador e encerra a sessão do WebDriver. Se não usarmos quit () no final do programa, a sessão do WebDriver não será fechada corretamente e os arquivos não serão apagados da memória. Isso pode resultar em erros de vazamento de memória.

Se o processo de automação abrir apenas uma janela do navegador, os comandos close () e quit () funcionarão da mesma maneira. Ambos diferem em sua funcionalidade quando houver mais de uma janela do navegador aberta durante a automação.

Para Acima Ref: clique aqui

Comando Dispose Dispose () deve chamar Quit () e parece que sim. No entanto, ele também tem o mesmo problema, pois as ações subseqüentes são bloqueadas até o PhantomJS ser fechado manualmente.

Ref Link

Dhaval Atri
fonte
3

Diferença entre driver.close () e driver.quit ()

driver.close - Fecha a janela do navegador na qual o foco está definido.

driver.quit - basicamente chama o método driver.dispose que, por sua vez, fecha todas as janelas do navegador e encerra a sessão do WebDriver normalmente.

Nagarjuna Yalamanchili
fonte
2

Selenium WebDriver

  1. WebDriver.Close()Este método é usado para fechar a janela aberta atual. Fecha a janela aberta atual na qual o driver está focado.

  2. WebDriver.Quit()Este método é usado para destruir a instância do WebDriver. Ele fecha todas as janelas do navegador associadas a esse driver e encerra a sessão com segurança. WebDriver.Quit () chama Dispose.

  3. WebDriver.Dispose() Este método fecha todas as janelas do navegador e termina com segurança a sessão

s10v10s
fonte
4
se você citar algo, deve fornecer a fonte.
Meirion Hughes
2

Meu entendimento é driver.close();que fechará o navegador atual e driver.quit();encerrará todo o navegador que.

BIUbiubiu
fonte