webdriver listeners selenium
O que são ouvintes WebDriver? Por que precisamos de ouvintes no teste de automação do Selenium? Este tutorial responde a essas perguntas em detalhes com exemplos de código de amostra:
Os ouvintes, como o nome sugere, “ouvem” qualquer evento prescrito no código do Selenium. Por exemplo, se você quiser saber o que acontece antes de clicar em qualquer elemento; antes e depois de navegar para um elemento, ou o que acontece quando uma exceção é lançada e o teste falha, os Ouvintes são úteis.
O uso prático dos Ouvintes no teste de automação do Selenium pode ser registrar a ordem das ações e fazer a captura de tela quando uma exceção é lançada. Isso facilita a depuração em estágios posteriores da execução do teste.
=> Verifique TODOS os tutoriais do Selenium aqui.
O que você aprenderá:
Implementação de ouvintes Webdriver
Existem basicamente dois tipos de ouvintes:
- Ouvintes do Webdriver
- Ouvintes TestNG
Vamos primeiro entender como funcionam os Webdriver Listeners. Neste tutorial, nosso foco estará no Webdriver Event Listener.
Por que usamos o ouvinte de eventos Webdriver?
Com a ajuda do Webdriver, podemos acionar muitos eventos no navegador e nos elementos da web. Ele mantém um registro de todos os eventos que são acionados durante a execução e pode nos ajudar na depuração quando a execução é concluída.
Existem duas maneiras de implementar os ouvintes de eventos Webdriver:
- WebDriverEventListener que é uma interface que possui alguns métodos predefinidos para rastrear os eventos do Webdriver. Requer que implementemos TODO os métodos predefinidos na Interface.
- Classe AbstractWebDriverEventListener o que nos fornece a facilidade de implementar apenas aqueles métodos nos quais estamos interessados.
# 1) Interface WebDriverEventListener
Métodos predefinidos usados para implementar a interface WebDriverEventListener são listados abaixo:
(i) void beforeChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence () arg2)
Este método é acionado quando executamos a operação sendKeys () ou clear () no Web Element. (Por exemplo, driver.findElement (By.id (“Login”)). Clear ()), e é disparado ANTES realizar a operação no Web Element.
Parâmetros:
arg0= Web Element arg1=driver
(ii) void afterChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence () arg2)
Este método é acionado quando executamos a operação sendKeys () ou clear () no Web Element. (Por exemplo, driver.findElement (By.id (“Login”)). Clear ()), e é disparado DEPOIS DE realizar a operação no Web Element.
Parâmetros:
arg0= Web Element arg1=driver
(iii) void beforeClickOn (WebElement arg0, WebDriver arg1)
Este método é acionado ANTES clicamos em qualquer elemento da web.
Parâmetros:
arg0= Web Element arg1=driver
(iv) void afterClickOn (WebElement arg0, WebDriver arg1)
como posso abrir o arquivo xml
Este método é acionado DEPOIS DE clicamos em qualquer elemento da web.
Parâmetros:
arg0= Web Element arg1=driver
(v) void beforeNavigateTo (String arg0, WebDriver arg1)
Este método é acionado quando usamos navigate (). To (String URL) (Por exemplo, navigate (). To (“https: // www.google.com ”)), E é acionado ANTES navegando para o URL.
Parâmetros:
arg0= URL arg1=driver
(vi) void afterNavigateTo (String arg0, WebDriver arg1)
Este método é acionado quando usamos navigate (). To (String URL) (Por exemplo, navigate (). To (“https: // www.google.com ”)), E é acionado DEPOIS DE navegando para o URL.
Parâmetros:
arg0= URL arg1=driver
(vii) void beforeNavigateBack (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Back (). Se situa ANTES redirecionando o usuário para a página anterior.
Parâmetros:
arg0=driver
(viii) void afterNavigateBack (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Back (). Se situa DEPOIS DE redirecionando o usuário para a página anterior.
Parâmetros:
arg0=driver
(ix) void beforeNavigateForward (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Forward (). Se situa ANTES redirecionando o usuário para a próxima página.
Parâmetros:
arg0=driver
(x) void afterNavigateBack (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Forward (). Se situa DEPOIS DE redirecionando o usuário para a próxima página.
Parâmetros:
arg0=driver
(xi) void beforeNavigateRefresh (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Refresh (). Se situa ANTES atualizando a página atual.
Parâmetros:
arg0=driver
(xii) void afterNavigateRefresh (WebDriver arg0)
Este método é acionado quando usamos o comando navigate (). Refresh (). Se situa DEPOIS DE atualizando a página atual.
Parâmetros:
arg0=driver
(xiii) void beforeFindBy (Por arg0, WebElement arg1, WebDriver arg2)
Este método é acionado quando usamos o comando driver.findElement (By.id (“Algum id ou qualquer outro localizador”)) . Se situa ANTES encontre o Web Element.
Parâmetros:
arg0=locator arg1=Web Element arg2=driver
(xiv) void afterFindBy (Por arg0, WebElement arg1, WebDriver arg2)
Este método é acionado quando usamos o comando driver.findElement (By.id (“Algum id ou qualquer outro localizador”)) . Se situa DEPOIS DE encontre o Web Element.
Parâmetros:
arg0=locator arg1=Web Element arg2=driver
(xv) void onException (Throwable arg0, WebDriver arg1)
Este método é lançado sempre que uma exceção é lançada. Por exemplo, se o Webdriver não for capaz de encontrar o elemento, ele acionará esse método e executará qualquer código que esteja escrito nele.
Parâmetros:
arg0=Exception arg1= driver
(xvi) void beforeAlertAccept (WebDriver arg0)
Este método é acionado sempre que houver uma caixa de alerta exibida na tela e é acionado à direita ANTES clicando no botão “OK ou ACEITAR”.
Parâmetros:
arg0=driver
(xvii) void afterAlertAccept (WebDriver arg0)
Este método é acionado sempre que houver uma caixa de alerta exibida na tela e é acionado à direita DEPOIS DE clicando no botão “OK ou ACEITAR”.
Parâmetros:
arg0=driver
(xviii) void beforeAlertDismiss (WebDriver arg0)
Este método é acionado sempre que houver uma caixa de alerta exibida na tela e é acionado à direita ANTES clicando no botão “CANCELAR”.
Parâmetros:
arg0=driver
(xix) void afterAlertDismiss (WebDriver arg0)
Este método é acionado sempre que houver uma caixa de alerta exibida na tela e é acionado à direita DEPOIS DE clicando no botão “CANCELAR”.
Parâmetros:
arg0=driver
Estes são todos os métodos disponíveis com WebDriverEventListener. Existem outros dois métodos beforeScript e afterScript, mas não iremos abordá-los neste tutorial.
Etapas para implementar ouvintes com a ajuda da interface “WebDriverEventListener” no Eclipse:
Passo 1: Crie um pacote com o nome “Ouvintes”. Dentro desse pacote, crie uma classe chamada “ WebdriverListeners ”E deixe-o implementar “WebDriverEventListener” .
A IU deve ser semelhante a abaixo:
como abrir um arquivo .jar no Windows 10
Passe o mouse sobre a linha vermelha com Error, o Eclipse deve lançar a sugestão abaixo para importar “WebDriverEventListener”. Clique em Importar.
O erro no WebDriverEventListener foi encerrado, mas você verá o erro abaixo na classe “WebDriverListeners”. Mova o cursor sobre o erro e você verá uma sugestão para adicionar métodos não implementados. Clique nele e você verá que todos os métodos estão listados e descritos acima.
Observe que adicionamos a linha System.out.println a todos os métodos para fins de demonstração.
Amostra de código-1
package Listeners; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.events.WebDriverEventListener; public class WebDriverListeners implements WebDriverEventListener { @Override public void afterAlertAccept(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Alert Accept '+arg0.toString() ); } @Override public void afterAlertDismiss(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Alert Dismiss '+ arg0); } @Override public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('After value change of' +arg0); } @Override public void afterClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After clicked'+arg0); } @Override public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('After Find By'+arg1); } @Override public void afterNavigateBack(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Navigate Back'); } @Override public void afterNavigateForward(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Navigate Forward'); } @Override public void afterNavigateRefresh(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('On Navigating Refresh'); } @Override public void afterNavigateTo(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('On Navigating To'+arg0); } @Override public void afterScript(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After Script'); } @Override public void beforeAlertAccept(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Alert Accept'); } @Override public void beforeAlertDismiss(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Alert Dismiss'); } @Override public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('Before Change Value of'+arg0); } @Override public void beforeClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Click on'+arg0); } @Override public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('Before Find By'+arg0); } @Override public void beforeNavigateBack(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Back'); } @Override public void beforeNavigateForward(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Forward'); } @Override public void beforeNavigateRefresh(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Refresh'); } @Override public void beforeNavigateTo(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Navigate To'+arg0); } @Override public void beforeScript(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Script'); } @Override public void onException(Throwable arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('On Exception'+arg0); } }
Passo 2: Crie a classe Listeners_Tests e certifique-se de que ela possui o método principal dentro da classe. Deixe que ele estenda a classe WebDriverListeners para que a classe do ouvinte possa executar uma operação nos comandos do navegador prescritos para determinados eventos.
Copie e cole o código abaixo na classe Listeners_Tests. Execute o código abaixo como o aplicativo Java.
Amostra de código-2
package Listeners; import java.util.Arrays; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Proxy; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.events.EventFiringWebDriver; public class Listeners_Tests extends WebDriverListeners{ static WebElement e; static ChromeDriver driver; public static void main(String() args) throws InterruptedException { // TODO Auto-generated method stub System.setProperty('webdriver.chrome.driver', 'E:\chromedriver.exe'); /*Setting the capabilities of Chrome Driver*/ try { DesiredCapabilities capabilities = DesiredCapabilities.chrome(); Proxy proxy = new Proxy(); String proxyServer = String.format('AProxyIDontWantToDisplay', System.getenv('proxy.username'), System.getenv('proxy.password')); proxy.setHttpProxy(proxyServer); capabilities.setCapability('proxy', proxy); ChromeOptions options = new ChromeOptions(); options.addArguments(Arrays.asList ('--no-sandbox','--ignore-certificate-errors','--homepage=about:blank','--no-first-run')); options.addArguments('disable-infobars'); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(capabilities); } catch (Exception e) { throw new Error(e); } /*---- Creating the instance of EventFiringWebDriver Class----*/ EventFiringWebDriver eventRecorder = new EventFiringWebDriver(driver); /*---- Creating the instance of parent class 'WebdriverListeners' class----*/ WebDriverListeners eCapture = new WebDriverListeners(); /* The below step registers the listeners for logging purpose*/ eventRecorder.register(eCapture); //Event One System.out.println('This is recording Event-One'); eventRecorder.navigate().to('https://www.google.com'); //Event Two System.out.println('This is recording Event-Two'); eventRecorder.findElement(By.xpath('//a(text()='Sign in')')).click(); //Event Three System.out.println('This is recording Event-Three'); eventRecorder.findElement(By.id('identifierId')).clear(); Thread.sleep(5000); //Event Four System.out.println('This is recording Event-Four'); eventRecorder.findElement(By.id('identifierId')).sendKeys('abc@gmail.com'); Thread.sleep(5000); //Event Five System.out.println('This is recording Event-Five'); eventRecorder.navigate().back(); //Event Six System.out.println('This is recording Event-Six'); eventRecorder.navigate().forward(); //Event Seven System.out.println('This is recording Event-Seven'); eventRecorder.navigate().refresh(); //Event Eight System.out.println('This is recording Event-Eight'); eventRecorder.get('https://www.irctc.co.in/eticketing/loginHome.jsf'); //Event Nine System.out.println('This is recording Event-Nine'); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Ten System.out.println('This is recording Event-Ten'); alert.accept(); } catch (Exception e) { } Thread.sleep(3000); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Eleven System.out.println('This is recording Event-Eleven'); alert.dismiss(); } catch (Exception e) { } //Intentionally giving wrong id so it triggers onException Listener--> Event Twelve System.out.println('This is recording Event-Twelve'); eventRecorder.findElement(By.id('loginbutn')).click(); } }
Depois que a execução for concluída com êxito, verifique o conteúdo registrado no console. Estaremos presentes em todos os eventos listados no código acima.
Snippet # 1 do console
Evento-1: Isso registra o evento beforeNavigateTo e afterNavigateTo e executa as ações escritas nos dois blocos de acordo.
Evento-2: Isso registra o evento beforeFindBy e afterFindBy, e executa as ações escritas nos dois blocos de acordo. O evento após esses dois eventos abrange os eventos beforeClick e afterClick.
Evento-3: Isso registra o beforeChangeValueOf e afterChangeValue dos eventos.
Evento-4: Este é o mesmo que Evento-3
Evento-5: Isso registra os eventos beforeNavigateBack e afterNavigateBack.
como eu abro arquivos swf
Evento-6: Isso registra os eventos beforeNavigateForward e afterNavigateForward.
Evento-7: Isso registra os eventos beforeNavigateRefresh e afterNavigateRefresh.
Evento-8: Este é o mesmo que Evento-1
Evento-9: Este é o mesmo que Evento-2
Snippet # 2 do console
Evento-10: Isso registra os eventos como beforeAlertAccept e afterAlertAccept.
Evento-11: Isso registra os eventos como beforeAlertDismiss e afterAlertDismiss.
Evento-12: Isso registra os eventos como onException e lança a mensagem.
Espero que a breve descrição dos ouvintes dê a você uma ideia sobre como funcionam os Ouvintes do Webdriver. Como já dissemos, com a ajuda de WebDriverEventListener, devemos implementar todos os métodos disponíveis com esta interface.
Entretanto, com a ajuda da classe AbstractWebDriverEventListener, podemos escolher quais eventos queremos implementar.
# 2) Classe AbstractWebDriverEventListener
Etapas para implementar ouvintes usando a classe “AbstractWebDriverEventListener”:
Passo 1
Crie uma classe “ AbstractWebDriverListener ”E deixá-lo estender a aula“ AbstractWebDriverEventListener '
Como você pode ver, ao contrário de “ WebDriverEventListener ”, Esta classe quando estendida não lança um erro para adicionar métodos não implementados. Você pode selecionar os métodos que deseja implementar em seu projeto.
Copie e cole o código abaixo:
Amostra de código-3
package Listeners; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.events.AbstractWebDriverEventListener; public class AbstractWebDriverListeners extends AbstractWebDriverEventListener{ public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('After value change of' +arg0); } public void afterClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After clicked'+arg0); } public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('After Find By'+arg1); } public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('Before Change Value of'+arg0); } public void beforeClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Click on'+arg0); } public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('Before Find By'+arg0); } }
Passo 2
Crie uma nova classe com o nome “ AbstractListeners_Test ”E dentro dele, crie a instância de“ AbstractWebDriverListeners ' aula.
Copie e cole o código abaixo dentro desta classe.
Amostra de código-4
package Listeners; import java.util.Arrays; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Proxy; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.events.EventFiringWebDriver; public class AbstractListeners_Tests extends WebDriverListeners{ static WebElement e; static ChromeDriver driver; public static void main(String() args) throws InterruptedException { // TODO Auto-generated method stub System.setProperty('webdriver.chrome.driver', 'E:\chromedriver.exe'); /*Setting the capabilities of Chrome Driver*/ try { DesiredCapabilities capabilities = DesiredCapabilities.chrome(); Proxy proxy = new Proxy(); String proxyServer = String.format('AProxyIDontWantToDisplay', System.getenv('proxy.username'), System.getenv('proxy.password')); proxy.setHttpProxy(proxyServer); capabilities.setCapability('proxy', proxy); ChromeOptions options = new ChromeOptions(); options.addArguments(Arrays.asList ('--no-sandbox','--ignore-certificate-errors','--homepage=about:blank','--no-first-run')); options.addArguments('disable-infobars'); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(capabilities); } catch (Exception e) { throw new Error(e); } /*---- Creating the instance of EventFiringWebDriver Class----*/ EventFiringWebDriver eventRecorder = new EventFiringWebDriver(driver); /*---- Creating the instance of parent class 'AbstractWebdriverListeners' class----*/ AbstractWebDriverListeners eCapture = new AbstractWebDriverListeners(); /* The below step registers the listeners for logging purpose*/ eventRecorder.register(eCapture); //Event One System.out.println('This is recording Event-One'); eventRecorder.navigate().to('https://www.google.com'); //Event Two System.out.println('This is recording Event-Two'); eventRecorder.findElement(By.xpath('//a(text()='Sign in')')).click(); //Event Three System.out.println('This is recording Event-Three'); eventRecorder.findElement(By.id('identifierId')).clear(); Thread.sleep(5000); //Event Four System.out.println('This is recording Event-Four'); eventRecorder.findElement(By.id('identifierId')).sendKeys('abc@gmail.com'); Thread.sleep(5000); //Event Five System.out.println('This is recording Event-Five'); eventRecorder.navigate().back(); //Event Six System.out.println('This is recording Event-Six'); eventRecorder.navigate().forward(); //Event Seven System.out.println('This is recording Event-Seven'); eventRecorder.navigate().refresh(); //Event Eight System.out.println('This is recording Event-Eight'); eventRecorder.get('https://www.irctc.co.in/eticketing/loginHome.jsf'); //Event Nine System.out.println('This is recording Event-Nine'); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Ten System.out.println('This is recording Event-Ten'); alert.accept(); } catch (Exception e) { } Thread.sleep(3000); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Eleven System.out.println('This is recording Event-Eleven'); alert.dismiss(); } catch (Exception e) { } //Intentionally giving wrong id so it triggers onException Listener--> Event Twelve System.out.println('This is recording Event-Twelve'); eventRecorder.findElement(By.id('loginbutn')).click(); } }
Essa classe também tem os eventos registrados anteriormente, mas como limitamos nossa classe Listener para implementar apenas seis eventos, ela descartará outros e exibirá apenas o log dos mencionados.
Visualização da janela do console
Como você pode ver as áreas marcadas em amarelo na imagem acima, apenas os métodos que foram implementados no AbstractWebDriverListeners A aula foi acionada.
Conclusão
Ouvintes WebDriver são as interfaces que ouvem um evento do navegador e respondem a ele de acordo. Se você implementá-lo com a ajuda de WebDriverEventListener, você deve implementar todos os métodos envolvidos com esta interface
Se você implementar o WebDriver Listener com a ajuda da classe AbstractWebDriverEventListener, poderá escolher os métodos que deseja implementar.
=> Visite aqui para aprender o selênio do zero.
Leitura recomendada
- Tutorial Cucumber Selenium: Cucumber Java Selenium WebDriver Integration
- Introdução ao Selenium WebDriver - Selenium Tutorial # 8
- Tutorial do ChromeDriver Selenium: testes do Selenium Webdriver no Chrome
- Implementação do nosso primeiro script WebDriver - Selenium WebDriver Tutorial # 10
- 30+ Melhores Tutoriais de Selênio: Aprenda Selênio com Exemplos Reais
- Selenium FAQs
- Como lidar com alertas / pop-ups no Selenium WebDriver - Tutorial do Selenium nº 16
- Espera implícita e explícita no Selenium WebDriver (tipos de esperas de selênio)