Selenium + Serenity BDD не может найти <tbody id="bodyArchivos"> внутри iframe, хотя он существует в DevTools (Java + CuJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Selenium + Serenity BDD не может найти <tbody id="bodyArchivos"> внутри iframe, хотя он существует в DevTools (Java + Cu

Сообщение Anonymous »

Я работаю над автоматическим тестом с использованием Java + Maven + Selenium WebDriver + Serenity BDD + Cucumber.
Для теста необходимо нажать кнопку «Загрузить» самого последнего файла проекции в таблице, которая отображается внутри 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)
Поэтому мой вспомогательный метод не может найти tbody#bodyArchivos ни в основном DOM, ни в любом iframe, но в DevTools браузера этот элемент существует.
Определение шага завершается неудачей

Код: Выделить всё

@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)
}
Вспомогательный метод для переключения в iframe

Код: Выделить всё

/**
* 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'."
);
}
Структура HTML (iframe + таблица)
На вкладке «Элементы» в 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">

Когда я разворачиваю этот iframe в DevTools, я вижу, что его документ загружает другой URL-адрес и содержит нужную мне форму и таблицу:

Код: Выделить всё


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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»