diff --git a/pom.xml b/pom.xml index cbf3ff8..51b5f56 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.agile611.trainings.webdriver cursoSeleniumWebdriver - 19.08.15 + 26.04.23 @@ -60,5 +60,10 @@ hamcrest-core 2.2 + + net.lightbody.bmp + browsermob-core + 2.1.5 + diff --git a/src/main/resources/2-logo-B_activa.png b/src/main/resources/2-logo-B_activa.png deleted file mode 100644 index d517495..0000000 Binary files a/src/main/resources/2-logo-B_activa.png and /dev/null differ diff --git a/src/main/resources/chromedriver-linux b/src/main/resources/chromedriver-linux deleted file mode 100755 index a6a052d..0000000 Binary files a/src/main/resources/chromedriver-linux and /dev/null differ diff --git a/src/main/resources/chromedriver-macos b/src/main/resources/chromedriver-macos deleted file mode 100755 index 3835010..0000000 Binary files a/src/main/resources/chromedriver-macos and /dev/null differ diff --git a/src/main/resources/chromedriver.exe b/src/main/resources/chromedriver.exe deleted file mode 100755 index a36bd43..0000000 Binary files a/src/main/resources/chromedriver.exe and /dev/null differ diff --git a/src/main/resources/geckodriver-linux b/src/main/resources/geckodriver-linux deleted file mode 100755 index 58223c1..0000000 Binary files a/src/main/resources/geckodriver-linux and /dev/null differ diff --git a/src/main/resources/geckodriver-macos b/src/main/resources/geckodriver-macos deleted file mode 100755 index 1564f31..0000000 Binary files a/src/main/resources/geckodriver-macos and /dev/null differ diff --git a/src/main/resources/geckodriver.exe b/src/main/resources/geckodriver.exe deleted file mode 100644 index 37cbf04..0000000 Binary files a/src/main/resources/geckodriver.exe and /dev/null differ diff --git a/src/main/resources/suite.xml b/src/main/resources/suite.xml deleted file mode 100644 index daef068..0000000 --- a/src/main/resources/suite.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/test/java/com/agile611/testng/webdriver/BaseTest.java b/src/test/java/com/agile611/testng/webdriver/BaseTest.java index 09f227a..bd10426 100644 --- a/src/test/java/com/agile611/testng/webdriver/BaseTest.java +++ b/src/test/java/com/agile611/testng/webdriver/BaseTest.java @@ -22,13 +22,13 @@ public class BaseTest { if (browser != null && browser.equalsIgnoreCase("firefox")) { FirefoxOptions options = new FirefoxOptions(); System.setProperty("webdriver.gecko.driver", - "src" + File.separator + "main" + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "geckodriver-macos"); driver = new FirefoxDriver(options); } else { ChromeOptions options = new ChromeOptions(); - System.setProperty("webdriver.chrome.driver", "src" + File.separator + "main" + File.separator + "resources" + File.separator + "chromedriver-macos"); + System.setProperty("webdriver.chrome.driver", "src" + File.separator + "test" + File.separator + "resources" + File.separator + "chromedriver-macos"); driver = new ChromeDriver(options); } driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)); diff --git a/src/test/java/com/agile611/testng/webdriver/BrokenImages.java b/src/test/java/com/agile611/testng/webdriver/BrokenImages.java index e3f59cf..51894c9 100644 --- a/src/test/java/com/agile611/testng/webdriver/BrokenImages.java +++ b/src/test/java/com/agile611/testng/webdriver/BrokenImages.java @@ -1,39 +1,89 @@ package com.agile611.testng.webdriver; -import java.io.File; -import java.util.List; - -import org.openqa.selenium.By; +import net.lightbody.bmp.BrowserMobProxy; +import net.lightbody.bmp.BrowserMobProxyServer; +import net.lightbody.bmp.client.ClientUtil; +import net.lightbody.bmp.core.har.Har; +import net.lightbody.bmp.core.har.HarEntry; +import org.openqa.selenium.Proxy; import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; +import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.io.File; +import java.util.List; + public class BrokenImages { WebDriver driver; + BrowserMobProxy proxy; @BeforeMethod public void setUp() throws Exception { + // 1. Iniciar el servidor Proxy localmente + proxy = new BrowserMobProxyServer(); + proxy.start(0); // El puerto 0 le dice que busque cualquier puerto libre + + // 2. Crear el objeto Proxy de Selenium a partir del BrowserMob + Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); + + // 3. Inyectar el proxy en las opciones de Firefox FirefoxOptions options = new FirefoxOptions(); + options.setProxy(seleniumProxy); + + // Nota: Si usas Selenium 4.6+, esta línea ya no es necesaria gracias a Selenium Manager System.setProperty("webdriver.gecko.driver", - "src" + File.separator + "main" + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "geckodriver-macos"); + driver = new FirefoxDriver(options); } @AfterMethod public void tearDown() { - driver.quit(); + // Es crucial apagar ambos servicios para no dejar procesos huérfanos + if (driver != null) { + driver.quit(); + } + if (proxy != null) { + proxy.stop(); + } } @Test public void allImagesLoaded() { + // 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_imagenes"); + + // 5. Navegar a la página (el proxy registrará todo el tráfico) driver.navigate().to("http://the-internet.herokuapp.com/broken_images"); - List images = driver.findElements(By.tagName("img")); - // Simplified test, no proxy check + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + boolean hasBrokenImages = false; + List entries = har.getLog().getEntries(); + + for (HarEntry entry : entries) { + String url = entry.getRequest().getUrl(); + int statusCode = entry.getResponse().getStatus(); + + // Filtramos para evaluar solo los recursos que son imágenes + if (url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".gif")) { + if (statusCode == 404) { + System.err.println("❌ Imagen rota detectada (404): " + url); + hasBrokenImages = true; + } else { + System.out.println("✅ Imagen cargada correctamente (" + statusCode + "): " + url); + } + } + } + // 8. El test fallará si al menos una imagen devolvió 404 + Assert.assertFalse(hasBrokenImages, "Se encontraron imágenes con error 404 en la página."); } -} +} \ No newline at end of file diff --git a/src/test/java/com/agile611/testng/webdriver/DisappearingElementsTest.java b/src/test/java/com/agile611/testng/webdriver/DisappearingElementsTest.java index f4e1863..7063fc2 100644 --- a/src/test/java/com/agile611/testng/webdriver/DisappearingElementsTest.java +++ b/src/test/java/com/agile611/testng/webdriver/DisappearingElementsTest.java @@ -10,6 +10,7 @@ public class DisappearingElementsTest extends BaseTest { public void testApp() throws InterruptedException { driver.navigate().to("https://the-internet.herokuapp.com/disappearing_elements"); for (int i = 0; i < 10; i++) { + System.out.println("Iteración: " + (i + 1)); WebElement elementsDelMenu = driver.findElement( By.xpath(".//*[@id='content']/div/ul/li[last()]")); diff --git a/src/test/java/com/agile611/testng/webdriver/DownloadTest.java b/src/test/java/com/agile611/testng/webdriver/DownloadTest.java index 4d36d93..d33c4a6 100644 --- a/src/test/java/com/agile611/testng/webdriver/DownloadTest.java +++ b/src/test/java/com/agile611/testng/webdriver/DownloadTest.java @@ -1,5 +1,12 @@ package com.agile611.testng.webdriver; +import java.io.File; +import java.util.HashMap; +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; @@ -9,45 +16,49 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import java.io.File; -import java.util.HashMap; -import java.util.UUID; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; - public class DownloadTest extends BaseTest { File folder; @BeforeMethod public void setUp() { - folder = new File("src" + File.separator + "main" + File.separator + "resources" + File.separator + UUID.randomUUID().toString()); - //Chrome - System.setProperty("webdriver.chrome.driver", "src" + File.separator + "main" + File.separator + "resources" + File.separator + "chromedriver-macos"); + folder = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + UUID.randomUUID().toString()); String downloadFilepath = folder.getAbsolutePath(); + + //Chrome + System.setProperty("webdriver.chrome.driver", "src" + File.separator + "test" + File.separator + "resources" + File.separator + "chromedriver-macos"); + HashMap chromePrefs = new HashMap(); chromePrefs.put("profile.default_content_settings.popups", 0); chromePrefs.put("download.default_directory", downloadFilepath); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("prefs", chromePrefs); options.setAcceptInsecureCerts(true); + //options.addArguments("--headless"); driver = new ChromeDriver(options); //Firefox - /*DesiredCapabilities capabilities = DesiredCapabilities.firefox(); + // 1. Configurar el perfil de Firefox + /*FirefoxProfile profile = new FirefoxProfile(); System.setProperty("webdriver.gecko.driver", - "src" + File.separator + "main" + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "geckodriver-macos"); - FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream;application/csv;text/csv;application/vnd.ms-excel;"); profile.setPreference("browser.helperApps.alwaysAsk.force", false); profile.setPreference("browser.download.manager.showWhenStarting", false); profile.setPreference("browser.download.folderList", 2); - profile.setPreference("browser.download.dir", folder.getAbsolutePath()); - capabilities.setCapability(FirefoxDriver.PROFILE, profile); - driver = new FirefoxDriver(capabilities);*/ + profile.setPreference("browser.download.dir", downloadFilepath); + + // 2. Usar FirefoxOptions en lugar de DesiredCapabilities + FirefoxOptions options = new FirefoxOptions(); + options.setProfile(profile); + + // Opcional: Si necesitas ejecutarlo en modo incógnito o sin interfaz gráfica (headless) + //options.addArguments("-headless"); + + // 3. Inicializar el driver + // NOTA: Ya no necesitas System.setProperty para el geckodriver. + driver = new FirefoxDriver(options);*/ } @AfterMethod diff --git a/src/test/java/com/agile611/testng/webdriver/DynamicContentTest.java b/src/test/java/com/agile611/testng/webdriver/DynamicContentTest.java index ec30e6c..479d1ba 100644 --- a/src/test/java/com/agile611/testng/webdriver/DynamicContentTest.java +++ b/src/test/java/com/agile611/testng/webdriver/DynamicContentTest.java @@ -19,7 +19,7 @@ public class DynamicContentTest extends BaseTest { By.xpath(".//*[@id='content']/div[3]/div[2]")); String urlImatge1 = imatge1.getAttribute("src"); String texttotal1 = text1.getText(); - driver.navigate().refresh(); + driver.navigate().refresh(); //Regenero el DOM completo imatge1 = driver.findElement( By.xpath(".//*[@id='content']/div[3]/div[1]/img")); diff --git a/src/test/java/com/agile611/testng/webdriver/DynamicControlsTest.java b/src/test/java/com/agile611/testng/webdriver/DynamicControlsTest.java index 4ceb9ec..3cae026 100644 --- a/src/test/java/com/agile611/testng/webdriver/DynamicControlsTest.java +++ b/src/test/java/com/agile611/testng/webdriver/DynamicControlsTest.java @@ -6,26 +6,25 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.Test; - import java.time.Duration; -import java.util.List; import static org.testng.Assert.assertTrue; public class DynamicControlsTest extends BaseTest { @Test - public void titleTest() { + public void titleTest() throws InterruptedException { driver.navigate().to("http://the-internet.herokuapp.com/dynamic_controls"); WebElement checkbox = driver.findElement(By.id("checkbox")); assertTrue(checkbox.isDisplayed()); checkbox.click(); WebElement removeBtn = driver.findElement(By.xpath("//*[@id='checkbox-example']/button")); removeBtn.click(); - List loading = driver.findElements(By.xpath("//*[@id='loading']/img")); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); wait.until(ExpectedConditions.or( ExpectedConditions.presenceOfElementLocated(By.id("loading")), ExpectedConditions.presenceOfElementLocated(By.id("message")))); + WebElement message = driver.findElement(By.id("message")); + assertTrue(message.isDisplayed()); } } \ No newline at end of file diff --git a/src/test/java/com/agile611/testng/webdriver/HoversImprovedTest.java b/src/test/java/com/agile611/testng/webdriver/HoversImprovedTest.java index dfd3a63..f966a81 100644 --- a/src/test/java/com/agile611/testng/webdriver/HoversImprovedTest.java +++ b/src/test/java/com/agile611/testng/webdriver/HoversImprovedTest.java @@ -31,4 +31,4 @@ public class HoversImprovedTest extends BaseTest { assertTrue(driver.findElement(By.xpath("//*[@id=\'content\']/div/div["+i+"]/div/h5")).getText().contains("name: user"+i)); } } -} +} \ No newline at end of file diff --git a/src/test/java/com/agile611/testng/webdriver/InfiniteScrollTest.java b/src/test/java/com/agile611/testng/webdriver/InfiniteScrollTest.java index 110da09..d364e3d 100644 --- a/src/test/java/com/agile611/testng/webdriver/InfiniteScrollTest.java +++ b/src/test/java/com/agile611/testng/webdriver/InfiniteScrollTest.java @@ -7,6 +7,7 @@ public class InfiniteScrollTest extends BaseTest { public void infiniteScrollTest() throws InterruptedException { driver.navigate().to("http://the-internet.herokuapp.com/infinite_scroll"); for (int i = 0; i < 5; i++) { + System.out.println("Iteración: " + (i + 1)); jse.executeScript("window.scrollTo(0, document.body.scrollHeight);"); Thread.sleep(2500); } diff --git a/src/test/java/com/agile611/testng/webdriver/MarcaHARTest.java b/src/test/java/com/agile611/testng/webdriver/MarcaHARTest.java new file mode 100644 index 0000000..de9c248 --- /dev/null +++ b/src/test/java/com/agile611/testng/webdriver/MarcaHARTest.java @@ -0,0 +1,117 @@ +package com.agile611.testng.webdriver; + +import net.lightbody.bmp.BrowserMobProxy; +import net.lightbody.bmp.BrowserMobProxyServer; +import net.lightbody.bmp.client.ClientUtil; +import net.lightbody.bmp.core.har.Har; +import net.lightbody.bmp.core.har.HarEntry; +import net.lightbody.bmp.core.har.HarNameValuePair; +import net.lightbody.bmp.core.har.HarRequest; +import net.lightbody.bmp.core.har.HarResponse; + +import org.openqa.selenium.Proxy; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.List; + +public class MarcaHARTest { + WebDriver driver; + BrowserMobProxy proxy; + + @BeforeMethod + public void setUp() throws Exception { + // 1. Iniciar el servidor Proxy localmente + proxy = new BrowserMobProxyServer(); + proxy.start(0); // El puerto 0 le dice que busque cualquier puerto libre + + // 2. Crear el objeto Proxy de Selenium a partir del BrowserMob + Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); + + // 3. Inyectar el proxy en las opciones de Firefox + FirefoxOptions options = new FirefoxOptions(); + options.setProxy(seleniumProxy); + + // Nota: Si usas Selenium 4.6+, esta línea ya no es necesaria gracias a Selenium Manager + System.setProperty("webdriver.gecko.driver", + "src" + File.separator + "test" + + File.separator + "resources" + + File.separator + "geckodriver-macos"); + + driver = new FirefoxDriver(options); + } + + @AfterMethod + public void tearDown() { + // Es crucial apagar ambos servicios para no dejar procesos huérfanos + if (driver != null) { + driver.quit(); + } + if (proxy != null) { + proxy.stop(); + } + } + + @Test + public void allImagesLoaded() throws InterruptedException { + // 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_imagenes"); + + // 5. Navegar a la página (el proxy registrará todo el tráfico) + driver.navigate().to("http://www.marca.com"); + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + List entries = har.getLog().getEntries(); + Thread.sleep(15000); + + for (HarEntry entry : entries) { + HarRequest request = entry.getRequest(); + HarResponse response = entry.getResponse(); + + System.out.println("=================================================="); + System.out.println("🌐 URL: " + request.getUrl()); + System.out.println("▶️ Método HTTP: " + request.getMethod()); + System.out.println("◀️ Código de Estado: " + response.getStatus() + " " + response.getStatusText()); + System.out.println("⏱️ Tiempo Total: " + entry.getTime() + " ms"); + + // 1. Extraer Cabeceras de la Petición (Request Headers) + System.out.println("\n📦 CABECERAS DE PETICIÓN:"); + for (HarNameValuePair header : request.getHeaders()) { + System.out.println(" - " + header.getName() + ": " + header.getValue()); + } + + // 2. Extraer Cabeceras de la Respuesta (Response Headers) + System.out.println("\n📥 CABECERAS DE RESPUESTA:"); + for (HarNameValuePair header : response.getHeaders()) { + System.out.println(" - " + header.getName() + ": " + header.getValue()); + } + + // 3. Extraer Información del Contenido + System.out.println("\n📄 DETALLES DEL CONTENIDO:"); + System.out.println(" - Tipo MIME: " + response.getContent().getMimeType()); + System.out.println(" - Tamaño del cuerpo: " + response.getContent().getSize() + " bytes"); + + // Opcional: Imprimir el texto de la respuesta (Cuidado, puede ser muy largo para HTML/JS) + // if (response.getContent().getText() != null) { + // System.out.println(" - Contenido: " + response.getContent().getText().substring(0, Math.min(response.getContent().getText().length(), 100)) + "..."); + // } + + // 4. Extraer Tiempos de Red (Timings) + System.out.println("\n⏳ DESGLOSE DE TIEMPOS:"); + System.out.println(" - Bloqueado (Blocked): " + entry.getTimings().getBlocked() + " ms"); + System.out.println(" - Resolución DNS: " + entry.getTimings().getDns() + " ms"); + System.out.println(" - Conexión: " + entry.getTimings().getConnect() + " ms"); + System.out.println(" - Espera al servidor (TTFB): " + entry.getTimings().getWait() + " ms"); + System.out.println(" - Descarga de datos (Receive): " + entry.getTimings().getReceive() + " ms"); + System.out.println("==================================================\n"); + } + } +} \ No newline at end of file diff --git a/src/test/java/com/agile611/testng/webdriver/MultipleWindowsTest.java b/src/test/java/com/agile611/testng/webdriver/MultipleWindowsTest.java index b47ac32..5cef5d5 100644 --- a/src/test/java/com/agile611/testng/webdriver/MultipleWindowsTest.java +++ b/src/test/java/com/agile611/testng/webdriver/MultipleWindowsTest.java @@ -15,15 +15,19 @@ import org.testng.annotations.Test; public class MultipleWindowsTest extends BaseTest { @Test - public void multipleWindows() { + public void multipleWindows() throws InterruptedException { driver.get("http://the-internet.herokuapp.com/windows"); String originalWindow = driver.getWindowHandle(); - driver.findElement(By.cssSelector(".example a")).click(); + driver.findElement(By.xpath("//a[@href=\'/windows/new\']")).click(); - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); + Thread.sleep(3000); // Temas del Firefox wait.until(ExpectedConditions.numberOfWindowsToBe(2)); + // numberOfWindowsToBe de Firefox no se interpreta bien, por eso el sleep + + String newWindow = ""; for (String handle : driver.getWindowHandles()) { @@ -45,8 +49,8 @@ public class MultipleWindowsTest extends BaseTest { driver.switchTo().window(originalWindow); } - @Test - public void multipleWindowsRedux() { + @Test(dependsOnMethods = "multipleWindows") + public void multipleWindowsRedux() throws InterruptedException { driver.get("http://the-internet.herokuapp.com/windows"); String firstWindow = driver.getWindowHandle(); @@ -54,8 +58,10 @@ public class MultipleWindowsTest extends BaseTest { driver.findElement(By.cssSelector(".example a")).click(); - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); + Thread.sleep(3000); // Temas de tiempos del Firefox wait.until(ExpectedConditions.numberOfWindowsToBe(2)); + // numberOfWindowsToBe de Firefox no se interpreta bien, por eso el sleep Set allWindows = driver.getWindowHandles(); diff --git a/src/test/java/com/agile611/testng/webdriver/StatusCodesTest.java b/src/test/java/com/agile611/testng/webdriver/StatusCodesTest.java index 7624d36..8c44069 100644 --- a/src/test/java/com/agile611/testng/webdriver/StatusCodesTest.java +++ b/src/test/java/com/agile611/testng/webdriver/StatusCodesTest.java @@ -1,53 +1,170 @@ package com.agile611.testng.webdriver; import java.io.File; +import java.util.List; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; +import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import org.openqa.selenium.Proxy; + +import net.lightbody.bmp.BrowserMobProxy; +import net.lightbody.bmp.BrowserMobProxyServer; +import net.lightbody.bmp.client.ClientUtil; +import net.lightbody.bmp.core.har.Har; +import net.lightbody.bmp.core.har.HarEntry; public class StatusCodesTest { WebDriver driver; + BrowserMobProxy proxy; @BeforeMethod - public void setUp() { + public void setUp() throws Exception { + // 1. Iniciar el servidor Proxy localmente + proxy = new BrowserMobProxyServer(); + proxy.start(0); // El puerto 0 le dice que busque cualquier puerto libre + + // 2. Crear el objeto Proxy de Selenium a partir del BrowserMob + Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); + + // 3. Inyectar el proxy en las opciones de Firefox FirefoxOptions options = new FirefoxOptions(); + options.setProxy(seleniumProxy); + + // Nota: Si usas Selenium 4.6+, esta línea ya no es necesaria gracias a Selenium Manager System.setProperty("webdriver.gecko.driver", - "src" + File.separator + "main" + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "geckodriver-macos"); + driver = new FirefoxDriver(options); } @AfterMethod public void tearDown() { - driver.quit(); + // Es crucial apagar ambos servicios para no dejar procesos huérfanos + if (driver != null) { + driver.quit(); + } + if (proxy != null) { + proxy.stop(); + } } @Test public void ResourceNotFound404() { + // 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_404"); driver.navigate().to("http://the-internet.herokuapp.com/status_codes/404"); - // Simplified test, no proxy + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + boolean hasError404 = false; + List entries = har.getLog().getEntries(); + + for (HarEntry entry : entries) { + String url = entry.getRequest().getUrl(); + int statusCode = entry.getResponse().getStatus(); + + // Filtramos para evaluar solo los recursos que son imágenes + if (statusCode == 404) { + System.err.println("❌ 404 Detectado: " + url); + hasError404 = true; + } else { + System.out.println("✅ Recurso cargado correctamente (" + statusCode + "): " + url); + } + } + // 8. El test fallará si al menos una imagen devolvió 404 + Assert.assertTrue(hasError404, "Se encontraron recursos con error 404 en la página."); } @Test public void ResourceFound200() { + // 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_200"); driver.navigate().to("http://the-internet.herokuapp.com/status_codes/200"); - // Simplified test, no proxy + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + boolean hasError200 = false; + List entries = har.getLog().getEntries(); + + for (HarEntry entry : entries) { + String url = entry.getRequest().getUrl(); + int statusCode = entry.getResponse().getStatus(); + + // Filtramos para evaluar solo los recursos que son imágenes + if (statusCode == 200) { + System.err.println("✅ 200 Detectado: " + url); + hasError200 = true; + } else { + System.out.println("❌ Recurso NO cargado correctamente (" + statusCode + "): " + url); + } + } + Assert.assertTrue(hasError200, "Se encontraron recursos con 200 en la página."); } @Test public void ResourceRedirect301() { +// 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_301"); driver.navigate().to("http://the-internet.herokuapp.com/status_codes/301"); - // Simplified test, no proxy + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + boolean hasError301 = false; + List entries = har.getLog().getEntries(); + + for (HarEntry entry : entries) { + String url = entry.getRequest().getUrl(); + int statusCode = entry.getResponse().getStatus(); + + // Filtramos para evaluar solo los recursos que son imágenes + if (statusCode == 301) { + System.err.println("✅ 301 Detectado: " + url); + hasError301 = true; + } else { + System.out.println("❌ Recurso NO cargado correctamente (" + statusCode + "): " + url); + } + } + Assert.assertTrue(hasError301, "Se encontraron recursos con 301 en la página."); } @Test public void ResourceError500() { + // 4. Iniciar la captura de un nuevo archivo HAR + proxy.newHar("captura_500"); driver.navigate().to("http://the-internet.herokuapp.com/status_codes/500"); - // Simplified test, no proxy + + // 6. Extraer el HAR generado + Har har = proxy.getHar(); + + // 7. Analizar las entradas de red + boolean hasError500 = false; + List entries = har.getLog().getEntries(); + + for (HarEntry entry : entries) { + String url = entry.getRequest().getUrl(); + int statusCode = entry.getResponse().getStatus(); + + // Filtramos para evaluar solo los recursos que son imágenes + if (statusCode == 500) { + System.err.println("✅ 500 Detectado: " + url); + hasError500 = true; + } else { + System.out.println("❌ Recurso NO cargado correctamente (" + statusCode + "): " + url); + } + } + Assert.assertTrue(hasError500, "Se encontraron recursos con 500 en la página."); } } \ No newline at end of file diff --git a/src/test/resources/chromedriver-linux b/src/test/resources/chromedriver-linux index 3ab2332..a6a052d 100755 Binary files a/src/test/resources/chromedriver-linux and b/src/test/resources/chromedriver-linux differ diff --git a/src/test/resources/chromedriver-macos b/src/test/resources/chromedriver-macos index 95c7cb5..3835010 100755 Binary files a/src/test/resources/chromedriver-macos and b/src/test/resources/chromedriver-macos differ diff --git a/src/test/resources/chromedriver.exe b/src/test/resources/chromedriver.exe old mode 100644 new mode 100755 index c89a033..a36bd43 Binary files a/src/test/resources/chromedriver.exe and b/src/test/resources/chromedriver.exe differ diff --git a/src/test/resources/geckodriver-linux b/src/test/resources/geckodriver-linux index bac836b..58223c1 100755 Binary files a/src/test/resources/geckodriver-linux and b/src/test/resources/geckodriver-linux differ diff --git a/src/test/resources/geckodriver-macos b/src/test/resources/geckodriver-macos index bcec190..1564f31 100755 Binary files a/src/test/resources/geckodriver-macos and b/src/test/resources/geckodriver-macos differ diff --git a/src/test/resources/geckodriver.exe b/src/test/resources/geckodriver.exe old mode 100755 new mode 100644 index 1aba699..37cbf04 Binary files a/src/test/resources/geckodriver.exe and b/src/test/resources/geckodriver.exe differ