webdriver listeners selenium
Què són els oients de WebDriver? Per què necessitem oients a les proves d’automatització de seleni? Aquest tutorial respon a aquestes preguntes detalladament amb exemples de codi de mostra:
Els oients, com el seu nom indica, “escolten” qualsevol esdeveniment prescrit al codi Selenium. Per exemple, si voleu saber què passa abans de fer clic a qualsevol element; abans i després de navegar cap a un element, o què passa quan es produeix una excepció i falla la prova, els oients són útils.
L’ús pràctic dels oients a les proves d’automatització de Selenium podria ser registrar l’ordre de les accions i fer la captura de pantalla quan es llança una excepció. Això facilita la depuració fàcil en fases posteriors de l'execució de la prova.
=> Consulteu TOTS els tutorials de Selenium aquí.
Què aprendreu:
Implementació de Webdriver Listeners
Hi ha principalment dos tipus d’oients:
- Oients de controladors web
- Oients de TestNG
Primer entendrem com funcionen els oients de Webdriver. En aquest tutorial, ens centrarem en l'oient d'esdeveniments de Webdriver.
Per què fem servir l'oient d'esdeveniments de Webdriver?
Amb l’ajuda de Webdriver, podem desencadenar molts esdeveniments al navegador i als elements web. Realitza un seguiment de tots els esdeveniments que es desencadenen durant l'execució i ens pot ajudar a depurar quan l'execució s'hagi completat.
Hi ha dues maneres en què podem implementar els oients d'esdeveniments de Webdriver:
- WebDriverEventListener que és una interfície que té alguns mètodes predefinits per al seguiment dels esdeveniments de Webdriver. Ens requereix la implementació TOTS els mètodes predefinits a la interfície.
- Classe AbstractWebDriverEventListener cosa que ens proporciona la possibilitat d’implementar només aquells mètodes que ens interessin.
# 1) Interfície WebDriverEventListener
A continuació es detallen els mètodes predefinits que s’utilitzen per implementar la interfície WebDriverEventListener:
(i) void beforeChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence [] arg2)
Aquest mètode s'activa quan realitzem l'operació sendKeys () o clear () a l'element web. [Per exemple, driver.findElement (By.id ('Inici de sessió')). Clear ()], i s'activa ABANS realitzant l'operació a l'element web.
Paràmetres:
arg0= Web Element arg1=driver
(ii) void afterChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence [] arg2)
Aquest mètode s'activa quan realitzem l'operació sendKeys () o clear () a l'element web. [Per exemple, driver.findElement (By.id ('Inici de sessió')). Clear ()], i s'activa DESPRÉS realitzant l'operació a l'element web.
Paràmetres:
arg0= Web Element arg1=driver
(iii) void beforeClickOn (WebElement arg0, WebDriver arg1)
Aquest mètode s'activa ABANS fem clic a qualsevol element web.
Paràmetres:
arg0= Web Element arg1=driver
(iv) buit després de ClickOn (WebElement arg0, WebDriver arg1)
llista d'adreces de correu electrònic falses per utilitzar
Aquest mètode s'activa DESPRÉS fem clic a qualsevol element web.
Paràmetres:
arg0= Web Element arg1=driver
(v) void beforeNavigateTo (String arg0, WebDriver arg1)
Aquest mètode s’activa quan fem servir navigate (). To (URL de cadena) [Per exemple, navigate (). To (“https: // www.google.com ”)], I s’activa ABANS navegant a l’URL.
Paràmetres:
arg0= URL arg1=driver
(vi) void afterNavigateTo (String arg0, WebDriver arg1)
Aquest mètode s’activa quan fem servir navigate (). To (URL de cadena) [Per exemple, navigate (). To (“https: // www.google.com ”)], I s’activa DESPRÉS navegant a l’URL.
Paràmetres:
arg0= URL arg1=driver
(vii) void beforeNavigateBack (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Back (). Té lloc ABANS redirigint l'usuari a la pàgina anterior.
Paràmetres:
arg0=driver
(viii) void afterNavigateBack (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Back (). Té lloc DESPRÉS redirigint l'usuari a la pàgina anterior.
Paràmetres:
arg0=driver
(ix) void beforeNavigateForward (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Forward (). Té lloc ABANS redirigint l'usuari a la pàgina següent.
Paràmetres:
arg0=driver
(x) void afterNavigateBack (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Forward (). Té lloc DESPRÉS redirigint l'usuari a la pàgina següent.
Paràmetres:
arg0=driver
(xi) void beforeNavigateRefresh (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Refresh (). Té lloc ABANS actualitzant la pàgina actual.
Paràmetres:
arg0=driver
(xii) void afterNavigateRefresh (WebDriver arg0)
Aquest mètode s'activa quan fem servir l'ordre navigate (). Refresh (). Té lloc DESPRÉS actualitzant la pàgina actual.
Paràmetres:
arg0=driver
(xiii) void beforeFindBy (Per arg0, WebElement arg1, WebDriver arg2)
Aquest mètode s'activa quan fem servir l'ordre driver.findElement (By.id ('Alguns identificadors o qualsevol altre localitzador')) . Té lloc ABANS cerqueu l'element web.
Paràmetres:
arg0=locator arg1=Web Element arg2=driver
(xiv) void afterFindBy (Per arg0, WebElement arg1, WebDriver arg2)
Aquest mètode s'activa quan fem servir l'ordre driver.findElement (By.id ('Alguns identificadors o qualsevol altre localitzador')) . Té lloc DESPRÉS cerqueu l'element web.
Paràmetres:
arg0=locator arg1=Web Element arg2=driver
(xv) void onException (Throwable arg0, WebDriver arg1)
Aquest mètode es genera sempre que es produeix una excepció. Per exemple, si el Webdriver no és capaç de trobar l'element, activarà aquest mètode i executaria qualsevol codi que hi hagi escrit.
Paràmetres:
arg0=Exception arg1= driver
(xvi) void beforeAlertAccept (WebDriver arg0)
Aquest mètode s'activa sempre que apareix un quadre d'alerta a la pantalla i s'activa a la dreta ABANS fent clic al botó 'D'acord o ACCEPTA'.
Paràmetres:
arg0=driver
(xvii) void afterAlertAccept (WebDriver arg0)
Aquest mètode s'activa sempre que apareix un quadre d'alerta a la pantalla i s'activa a la dreta DESPRÉS fent clic al botó 'D'acord o ACCEPTA'.
Paràmetres:
arg0=driver
(xviii) void beforeAlertDismiss (WebDriver arg0)
Aquest mètode s'activa sempre que apareix un quadre d'alerta a la pantalla i s'activa a la dreta ABANS fent clic al botó 'CANCEL·LAR'.
Paràmetres:
arg0=driver
(xix) void afterAlertDismiss (WebDriver arg0)
Aquest mètode s'activa sempre que apareix un quadre d'alerta a la pantalla i s'activa a la dreta DESPRÉS fent clic al botó 'CANCEL·LAR'.
com obrir el fitxer .dat
Paràmetres:
arg0=driver
Aquests són tots els mètodes disponibles amb WebDriverEventListener. Hi ha altres dos mètodes beforeScript i afterScript, però no els tractarem en aquest tutorial.
Passos per implementar els oients amb l'ajut de la interfície 'WebDriverEventListener' a Eclipse:
Pas 1: Creeu un paquet amb el nom 'Oients'. Dins d’aquest paquet, creeu una classe anomenada “ WebdriverListeners ”I deixar-lo implementar 'WebDriverEventListener' .
La IU hauria de ser la següent:
Passeu el ratolí per sobre de la línia vermella amb Error; l'Eclipse hauria de llançar el suggeriment següent per importar 'WebDriverEventListener'. Feu clic a Importa.
S'ha finalitzat l'error al WebDriverEventListener, però veureu l'error següent a la classe 'WebDriverListeners'. Passeu el cursor per sobre de l’error i veureu un suggeriment per afegir mètodes sense implementar. Feu-hi clic i veureu que tots els mètodes s’enumeren i es descriuen més amunt.
Tingueu en compte que hem afegit la línia System.out.println a tots els mètodes amb finalitats de demostració.
Codi de mostra-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); } }
Pas 2: Creeu Class Listeners_Tests i assegureu-vos que tingui el mètode principal dins de la classe. Deixeu que estengui la classe WebDriverListeners perquè la classe oient pugui realitzar una operació a les ordres del navegador prescrites per a determinats esdeveniments.
Si us plau, copieu i enganxeu el codi següent a la classe Listeners_Tests. Executeu el codi següent, com ara l'aplicació Java.
Codi de mostra-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(); } }
Un cop finalitzada l'execució, comproveu el contingut registrat a la consola. Anirem a tots els esdeveniments que figuren al codi anterior.
Fragment núm. 1 de la consola
Esdeveniment-1: Això registra l'esdeveniment abans de NavigateTo i afterNavigateTo i realitza les accions escrites als dos blocs en conseqüència.
on són els fitxers apk emmagatzemats a Android
Esdeveniment 2: Això registra l'esdeveniment beforeFindBy i afterFindBy i realitza les accions escrites als dos blocs en conseqüència. L’esdeveniment posterior a aquests dos esdeveniments cobreix els esdeveniments abans de Click i AfterClick.
Esdeveniment-3: Es registren els beforeChangeValueOf i afterChangeValue dels esdeveniments.
Esdeveniment-4: Això és el mateix que Event-3
Esdeveniment 5: Això registra els esdeveniments beforeNavigateBack i afterNavigateBack.
Esdeveniment 6: Això registra els esdeveniments beforeNavigateForward i afterNavigateForward.
Esdeveniment-7: Això registra els esdeveniments beforeNavigateRefresh i afterNavigateRefresh.
Esdeveniment 8: Això és el mateix que Esdeveniment-1
Esdeveniment-9: Això és el mateix que Event-2
Fragment núm. 2 de la consola
Esdeveniment 10: Es registren els esdeveniments com beforeAlertAccept i afterAlertAccept.
Esdeveniment-11: Es registren els esdeveniments com beforeAlertDismiss i afterAlertDismiss.
Esdeveniment-12: Això registra els esdeveniments com onException i llança el missatge.
Espero que la breu descripció dels oients us doni una idea de com funcionen els oients de Webdriver. Com hem dit anteriorment, que amb l'ajuda de WebDriverEventListener, hem d'implementar tots els mètodes disponibles amb aquesta interfície.
Tot i això, amb l'ajut de la classe AbstractWebDriverEventListener, podem triar quins esdeveniments volem implementar.
# 2) Classe AbstractWebDriverEventListener
Passos per implementar els oients mitjançant la classe 'AbstractWebDriverEventListener':
Pas 1
Crea una classe ' AbstractWebDriverListener 'I deixar que ampliï la classe' AbstractWebDriverEventListener '
Com podeu veure, a diferència de “ WebDriverEventListener ', Aquesta classe quan s'amplia no genera cap error en afegir mètodes no implementats. Podeu seleccionar els mètodes que vulgueu implementar al vostre projecte.
Copieu i enganxeu el codi següent:
Codi de mostra-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); } }
Pas 2
Creeu una classe nova amb el nom ' AbstractListeners_Test ”I dins d’ella, creeu la instància de“ AbstractWebDriverListeners ”Classe.
Copieu-enganxeu el següent codi dins d'aquesta classe.
Codi de mostra-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(); } }
Aquesta classe també té els esdeveniments registrats anteriorment, però com que hem limitat la nostra classe Listener per implementar només sis esdeveniments, descartarà d'altres i només mostrarà el registre dels esmentats.
Vista de finestra de consola
Com podeu veure les zones marcades en groc a la imatge superior, només els mètodes que s'han implementat a la AbstractWebDriverListeners S'han activat les classes.
Conclusió
Els oients de WebDriver són les interfícies que escolten un esdeveniment del navegador i hi responen en conseqüència. Si l’implementeu amb l’ajut de WebDriverEventListener, haureu d’implementar tots els mètodes implicats en aquesta interfície
Si implementeu WebDriver Listener amb l'ajut de la classe AbstractWebDriverEventListener, podeu triar els mètodes que vulgueu implementar.
=> Visiteu aquí per aprendre el seleni des de zero.
Lectura recomanada
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- Introducció a Selenium WebDriver - Tutorial Selenium # 8
- Tutorial de ChromeDriver Selenium: proves de Selenium Webdriver a Chrome
- Implementació del nostre primer script WebDriver - Selenium WebDriver Tutorial # 10
- 30+ millors tutorials sobre seleni: apreneu el seleni amb exemples reals
- Preguntes més freqüents sobre el seleni
- Com gestionar les alertes / finestres emergents a Selenium WebDriver - Selenium Tutorial # 16
- Espera implícita i explícita a Selenium WebDriver (tipus d'espera de seleni)