Laboratorio de BDD con Selenium, ChromeDriver y Java en GitHub Codespaces
1. Crear un nuevo repositorio en GitHub
- Ve a GitHub y crea un nuevo repositorio.
- Dale un nombre y una descripción a tu repositorio.
2. Configurar GitHub Codespaces
- Crear un nuevo archivo
- En nombre de archivo ingresar ".devcontainer/devcontainer.json"
- Pegar la siguiente configuración
{
"name": "BDD Lab with Selenium and Java",
"image": "mcr.microsoft.com/devcontainers/java:17",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "17"
},
"ghcr.io/devcontainers-extra/features/maven-sdkman:2": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
},
"ghcr.io/kreemer/features/chrometesting:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"vscjava.vscode-java-pack",
"vscjava.vscode-maven",
"dbaeumer.vscode-eslint",
"ms-python.python",
"ms-python.vscode-pylance"
]
}
},
"forwardPorts": [8080],
"portsAttributes": {
"8080": {
"label": "Application",
"onAutoForward": "notify"
}
},
"postCreateCommand": "sudo apt update",
"remoteUser": "vscode"
}
- Confirmar los cambios "Commit changes..."
- Agrega un comentario y "Commit changes"
3. Crear Codespace
- Volver a la carpeta base de tu repositorio haciendo click en "<> Code" ubicado en la parte superior izquierda.
- Hacer click en el botón <> code, pestaña Codespaces y click en Create codespace on main.
4. Creación del Proyecto Maven
Para desarrollar el laboratorio, primero debemos crear un proyecto Maven. Ejecuta el siguiente comando, reemplazando las variables -DgroupId y -DartifactId:
mvn archetype:generate -DgroupId={com.eci.myproject} -DartifactId={bdd-java} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Este comando generará la estructura básica del proyecto con las carpetas src/main/java y src/test/java.
4. Agregar dependencias de Selenium y Cucumber
- Crea un archivo
pom.xmlen la raíz de tu proyecto y agrega las dependencias necesarias para Selenium, ChromeDriver y Cucumber:
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<!-- Cucumber -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>7.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
5. Crear la estructura BDD
- Dentro de la carpeta src/test/java, generar las siguientes carpetas:
- features
- steps
- runners
6. Crear escenario BDD
- Dentro de la carpeta features, crear un archivo con el nombre "google_search.feature"
- Agregar el siguiente texto
Feature: Google Search
Scenario: Search for a term
Given I am on the Google search page
When I search for "GitHub"
Then I should see "GitHub" in the results
- Dentro de la carpeta steps, crear el archivo SearchSteps.java
- Pegar el siguiente código
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
public class SearchSteps {
private WebDriver driver;
@Before
public void setUp() {
try {
System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Failed to initialize ChromeDriver", e);
}
}
@Given("I am on the Google search page")
public void i_am_on_the_google_search_page() {
driver.get("https://www.google.com");
}
@When("I search for {string}")
public void i_search_for(String term) {
WebElement searchBox = driver.findElement(By.name("q"));
searchBox.sendKeys(term);
searchBox.submit();
}
@Then("I should see {string} in the results")
public void i_should_see_in_the_results(String term) {
assert driver.getPageSource().contains(term);
}
@After
public void tearDown() {
driver.quit();
}
}
- Dentro de la carpeta runners, crear el archivo TestRunner.java
- Pegar el siguiente código
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/java/features", glue="steps",
monochrome = true,
publish = true,
plugin = {"pretty", "junit:target/JUnitReports/report.xml",
"json:target/JSonReports/report.json",
"html:target/HtmlReports/report.html"
}
)
public class TestRunner {
}
- ejecutar los escenarios con
mvn test
- validar el reporte html, descargando el archivo "target/HtmlReports/report.html"