Guida al selenio con JUnit / TestNG

1. Introduzione

Questo articolo è un'introduzione rapida e pratica al lavoro con Selenium e alla scrittura di test con JUnit e TestNG.

2. Integrazione del selenio

In questa sezione, inizieremo con uno scenario semplice: aprire una finestra del browser, navigare verso un determinato URL e cercare alcuni contenuti desiderati nella pagina.

2.1. Dipendenze di Maven

Nel file pom.xml , aggiungi la seguente dipendenza:

 org.seleniumhq.selenium selenium-java 3.4.0 

L'ultima versione può essere trovata nel Maven Central Repository.

2.2. Configurazione selenio

Innanzitutto, crea un nuovo file di classe Java chiamato SeleniumConfig :

public class SeleniumConfig { private WebDriver driver; //... }

Dato che stiamo utilizzando una versione Selenium 3.x, dobbiamo specificare il percorso di un file GeckoDriver eseguibile (basato sul tuo sistema operativo) utilizzando una proprietà di sistema chiamata webdriver.gecko.driver L'ultima versione di GeckoDriver può essere scaricata da Github Rilasci di Geckodriver.

Inizializziamo ora il WebDriver nel costruttore, imposteremo anche 5 secondi come timeout per WebDriver per attendere la comparsa di un elemento sulla pagina:

public SeleniumConfig() { Capabilities capabilities = DesiredCapabilities.firefox(); driver = new FirefoxDriver(capabilities); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); } static { System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac")); } static private String findFile(String filename) { String paths[] = {"", "bin/", "target/classes"}; for (String path : paths) { if (new File(path + filename).exists()) return path + filename; } return ""; }

Questa classe di configurazione contiene un paio di metodi che per ora ignoreremo, ma ne vedremo di più nella seconda parte di questa serie.

Successivamente, avremo bisogno di implementare una classe SeleniumExample :

public class SeleniumExample { private SeleniumConfig config; private String url = "//www.baeldung.com/"; public SeleniumExample() { config = new SeleniumConfig(); config.getDriver().get(url); } // ... }

Qui inizializzeremo SeleniumConfig e imposteremo l'URL desiderato a cui navigare. Allo stesso modo, implementeremo una semplice API per chiudere il browser e ottenere il titolo della pagina:

public void closeWindow() { this.config.getDriver().close(); } public String getTitle() { return this.config.getDriver().getTitle(); }

Per navigare nella sezione Informazioni su baeldung.com, dobbiamo creare un metodo closeOverlay () che controlli e chiuda l'overlay al caricamento di una homepage. Successivamente, navighiamo alla pagina Informazioni su Baeldung utilizzando il metodo getAboutBaeldungPage () :

public void getAboutBaeldungPage() { closeOverlay(); clickAboutLink(); clickAboutUsLink(); } private void closeOverlay() { List webElementList = this.config.getDriver() .findElements(By.tagName("a")); if (webElementList != null) { webElementList.stream() .filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title"))) .filter(WebElement::isDisplayed) .findAny() .ifPresent(WebElement::click); } } private void clickAboutLink() { Actions actions = new Actions(config.getDriver()); WebElement aboutElement = this.config.getDriver() .findElement(By.id("menu-item-6138")); actions.moveToElement(aboutElement).perform(); } private void clickAboutUsLink() { WebElement element = this.config.getDriver() .findElement(By.partialLinkText("About Baeldung.")); element.click(); }

Possiamo verificare se le informazioni richieste sono disponibili nella pagina visualizzata:

public boolean isAuthorInformationAvailable() { return this.config.getDriver() .getPageSource() .contains("Hey ! I'm Eugen"); }

Successivamente, testeremo questa classe sia con JUnit che con TestNG.

3. Con JUnit

Creiamo una nuova classe di test come SeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest  private static SeleniumExample seleniumExample; private String expectedTitle = "About Baeldung 

Useremo l' annotazione @ BeforeClass da org.junit.BeforeClass per eseguire una configurazione iniziale. In questo metodo setUp () inizializzeremo l' oggetto SeleniumExample :

@BeforeClass public static void setUp() { seleniumExample = new SeleniumExample(); }

In modo simile, al termine del nostro test case, dovremmo chiudere il browser appena aperto. Lo faremo con l' annotazione @AfterClass , per ripulire le impostazioni al termine dell'esecuzione dello scenario di test:

@AfterClass public static void tearDown() { seleniumExample.closeWindow(); }

Si prega di notare il modificatore statico sulla nostra variabile membro SeleniumExample - perché abbiamo bisogno di usare questa variabile nei metodi statici setUp () e tearDown () - @BeforeClass e @AfterClass possono essere invocati solo su metodi statici.

Infine, possiamo creare il nostro test completo:

@Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { seleniumExample.getAboutBaeldungPage(); String actualTitle = seleniumExample.getTitle(); assertNotNull(actualTitle); assertEquals(expectedTitle, actualTitle); assertTrue(seleniumExample.isAuthorInformationAvailable()); }

Questo metodo di test afferma che il titolo della pagina Web non è nullo e viene impostato come previsto. Oltre a ciò, controlliamo che la pagina contenga le informazioni previste.

Quando il test viene eseguito, apre semplicemente l'URL in Firefox e successivamente lo chiude dopo che il titolo della pagina web e il contenuto sono stati verificati.

4. Con TestNG

Usiamo ora TestNG per eseguire il nostro test case / suite.

Tieni presente che se stai utilizzando Eclipse, il plug-in TestNG può essere scaricato e installato da Eclipse Marketplace.

Per prima cosa, creiamo una nuova classe di test:

public class SeleniumWithTestNGLiveTest  private SeleniumExample seleniumExample; private String expectedTitle = "About Baeldung 

Useremo un @BeforeSuite annotazione dal org.testng.annotations.BeforeSuite istanziare la nostra classe SeleniumExample . Il metodo setUp () verrà avviato appena prima dell'attivazione della suite di test:

@BeforeSuite public void setUp() { seleniumExample = new SeleniumExample(); }

Allo stesso modo, utilizzeremo l' annotazione @AfterSuite da org.testng.annotations.AfterSuite per chiudere il browser aperto una volta completata la suite di test:

@AfterSuite public void tearDown() { seleniumExample.closeWindow(); }

Infine, implementiamo il nostro test:

@Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { seleniumExample.getAboutBaeldungPage(); String actualTitle = seleniumExample.getTitle(); assertNotNull(actualTitle); assertEquals(expectedTitle, actualTitle); assertTrue(seleniumExample.isAuthorInformationAvailable()); }

Dopo aver completato con successo la suite di test, troviamo i report HTML e XML nella cartella di output di test del progetto. Questi rapporti riassumono i risultati del test.

5. conclusione

In questo breve articolo, ci siamo concentrati su una rapida introduzione alla scrittura di test Selenium 3 con JUnit e TestNG.

Come sempre, la fonte dell'articolo è disponibile su GitHub.