Для теста необходимо нажать кнопку «Загрузить» самого последнего файла проекции в таблице, которая отображается внутри iframe.
Проблема
Во время выполнения мой шаг завершается неудачей с этим утверждение:
Нет контроля над таблой bodyArchivos ни в главном DOM, ни в нинуно де лос iframes де ла страницы. Проверьте URL-адрес, содержащий «Архивы результатов работ» и точный идентификатор моря «bodyArchivos».
Вывод Serenity (сценарий Cucumber):
Код: Выделить всё
Descargar y validar archivo de proyección ya existente
\-----------------------------------------------------------------------
23:33:03.045 ERROR \[ main\] : Test failed at step: Y descargo el archivo de proyección más reciente
23:33:03.045 ERROR \[ main\] : No se encontró la tabla bodyArchivos ni en el DOM principal ni en ninguno de los iframes de la página. Revisa que la URL sea la de 'Archivos de resultados de proyecciones' y que el id sea exactamente 'bodyArchivos'.
Failed scenarios:
.../archivos_proyeccion.feature:24 # Descargar y validar archivo de proyección ya existente
java.lang.AssertionError: No se encontró la tabla bodyArchivos ni en el DOM principal ni en ninguno de los iframes de la página. Revisa que la URL sea la de 'Archivos de resultados de proyecciones' y que el id sea exactamente 'bodyArchivos'.
at org.af.gestion.mi.pension.stepdefinitions.ArchivosProyeccionStepDefinitions.cambiarAFrameConTablaArchivos(ArchivosProyeccionStepDefinitions.java:407)
at org.af.gestion.mi.pension.stepdefinitions.ArchivosProyeccionStepDefinitions.descargoArchivoMasReciente(ArchivosProyeccionStepDefinitions.java:202)
at ?.descargo el archivo de proyección más reciente(.../archivos_proyeccion.feature:27)
Определение шага завершается неудачей
Код: Выделить всё
@Cuando("descargo el archivo de proyección más reciente")
public void descargoArchivoMasReciente() {
WebDriver driver = getDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(40));
// 1) Switch to the frame (or main DOM) that contains the table
cambiarAFrameConTablaArchivos(driver);
// 2) Wait for the table in the CURRENT context
WebElement tabla = wait.until(
ExpectedConditions.presenceOfElementLocated(By.id("bodyArchivos"))
);
// 3) Get the first row (most recent file) and its download button
WebElement fila = tabla.findElement(By.cssSelector("tr:first-child"));
WebElement botonDescarga = fila.findElement(By.cssSelector("td:nth-child(3) > button"));
// Click using JS in case of overlays
((JavascriptExecutor) driver).executeScript("arguments[0].click();", botonDescarga);
// 4) Go back to main content for the next steps
driver.switchTo().defaultContent();
// (code that waits for the downloaded .csv is omitted)
}
Код: Выделить всё
/**
* Looks for tbody#bodyArchivos either in the main DOM or inside any iframe.
* If found, it leaves the driver already switched to the correct context.
* Otherwise it throws an AssertionError.
*/
private void cambiarAFrameConTablaArchivos(WebDriver driver) {
// Always start from the main document
driver.switchTo().defaultContent();
System.out.println("[DescargaCSV] URL actual: " + driver.getCurrentUrl());
// 1) First try in the main DOM (no iframe)
List tablasEnPrincipal = driver.findElements(By.id("bodyArchivos"));
if (!tablasEnPrincipal.isEmpty()) {
System.out.println("[DescargaCSV] ✔ Tabla bodyArchivos encontrada en el DOM principal (sin iframe).");
return;
}
// 2) If not in main DOM, look into iframes
List iframes = driver.findElements(By.tagName("iframe"));
System.out.println("[DescargaCSV] iframes encontrados en la página: " + iframes.size());
if (iframes.isEmpty()) {
throw new AssertionError(
"No se encontró la tabla bodyArchivos ni en el DOM principal ni en iframes (no hay iframes en la página)."
);
}
// 3) Try each iframe by index
for (int i = 0; i < iframes.size(); i++) {
try {
driver.switchTo().defaultContent();
driver.switchTo().frame(i);
List tablas = driver.findElements(By.id("bodyArchivos"));
if (!tablas.isEmpty()) {
System.out.println("[DescargaCSV] ✔ Tabla bodyArchivos encontrada en iframe index=" + i);
return; // stay in this iframe
} else {
System.out.println("[DescargaCSV] iframe index=" + i + " no contiene bodyArchivos");
}
} catch (NoSuchFrameException e) {
System.out.println("[DescargaCSV] NoSuchFrameException en iframe index=" + i);
} catch (StaleElementReferenceException e) {
System.out.println("[DescargaCSV] StaleElementReference en iframe index=" + i +
" → ignoring and continuing with the next one");
}
}
// 4) If we get here, the table was not found anywhere
throw new AssertionError(
"No se encontró la tabla bodyArchivos ni en el DOM principal ni en ninguno de los iframes de la página. " +
"Revisa que la URL sea la de 'Archivos de resultados de proyecciones' y que el id sea exactamente 'bodyArchivos'."
);
}
На вкладке «Элементы» в DevTools страница имеет следующий iframe:
Код: Выделить всё
[i] name="ifrcontent"
id="ifrcontent"
src="/PortalAccesoWeb/jsp/templates/blank.jsp"
class="min-width: 500px;"
width="100%"
height="450px"
frameborder="0"
allowtransparency="yes">
Код: Выделить всё
Archivos de resultados de proyecciones
Últimos archivos de resultados
Archivo
Fecha fin procesamiento
Descargar
ProyeccionPensionISSSTE_260925_resultado_58.csv
26/09/2025
[/i]
В консоли браузера я попробовал:
Код: Выделить всё
document.querySelectorAll("iframe")
document.querySelectorAll("iframe").length
- NodeList []
- 0
Код: Выделить всё
let frame = window.frames[0];
frame.document.getElementById("bodyArchivos");
Uncaught TypeError: невозможно прочитать свойства неопределенного значения (чтение «документа»)
В то же время в консоли я вижу ошибку JavaScript, исходящую от приложения:
Uncaught ReferenceError: setUpArchivos не определен в onload (archivos.do:48)
То, что я уже пробовал
- Итерация всех iframe по индексу (driver.switchTo().frame(i)) и поиск By.id("bodyArchivos") в каждом.
- Ищем таблицу в основном DOM перед переключением на кадры.
- Подтверждение в DevTools того, что идентификатор действительно является bodyArchivos и что таблица находится внутри ifrcontent.
- Запуск теста в Edge и Chrome с тем же результатом.
Что я делаю неправильно, пытаясь найти tbody#bodyArchivos внутри этого iframe?
- Есть ли там что-то особенное в этом iframe, потому что его источником является /PortalAccesoWeb/jsp/templates/blank.jsp, но внутренне он загружает /ProyeccionPensionWeb/archivos.do?
- Может ли ошибка JavaScript (setUpArchivos не определена) помешать приложению документа iframe к window.frames/document.querySelectorAll("iframe") с точки зрения Selenium просмотреть?
- Нужна ли мне другая стратегия для переключения на этот iframe (например, по имени или WebElement или ожидание полной загрузки внутреннего документа), чтобы WebDriver мог видеть tbody#bodyArchivos?введите описание изображения здесь введите описание изображения здесь
Подробнее здесь: https://stackoverflow.com/questions/798 ... frame-even
Мобильная версия