Избежание исключения StaleElementReferenceException при работе с динамической таблицей в Selenium

У меня проблемы с динамическим столом.

Это наш стол:

<table class="table" style="min-width: 870px; max-width: 870px">
  <colgroup>
    <col style="width: 30px">
    <col style="width: 200px">
    <col style="width: 80px">
    <col style="width: 70px">
    <col style="width: 200px">
    <col style="width: 50px">
    <col style="width: 50px">
  </colgroup>
  <tbody>
    <tr></tr>
    <tr></tr>
    <tr></tr>
    <tr></tr>
    <tr></tr>
    <tr></tr>
    <tr></tr>
  </tbody>
  <tfoot>
    <tr>
      <td class="text-right" colspan="3">Media del grupo</td>
      <td class="text-center media" colspan="1">1</td>
      <td class="text-center noeditable" colspan="1"></td>
      <td class="text-center media" colspan="1"></td>
      <td class="text-center media" colspan="1"></td>
    </tr>
  </tfoot>
</table>

каждый <tr> содержит следующее:

<tr>
  <td class="indice">1</td>
  <td id="accion-1-alumno-0" data-tooltip="" class="has-tip titulo" title="">Ap_Alumno_1ESOA_1, Nb_Alumno_1ESOA_1</td>
  <td data-tooltip="" class="has-tip titulo" data-selector="tooltipdtk00g" title="">1ESOA</td>
  <td class="nota relative " style="text-align:center; color: #ed1c24!important">
    <div id="accion-1-celda-0-0-0" class="elemento comentarios">1</div>
  </td>
  <td class="nota relative " style="text-align:center; color: #000000!important">
    <div class="elemento comentarios"><span id="accion-1-editar-1-0" class="block left ellipsis span  comentario" title=""></span><span id="accion-1-prismaticos-1-0" class="glyphicons glyph_observaciones observacion right"></span></div>
  </td>
  <td class="nota relative " style="text-align:center; color: #000000!important">
    <div id="accion-1-celda-2-0-0" class="elemento comentarios"></div>
  </td>
  <td class="nota relative " style="text-align:center; color: #000000!important">
    <div id="accion-1-celda-3-0-0" class="elemento comentarios"></div>
  </td>
</tr>

Мы заинтересованы в элементах

<div id="accion-1-celda-0-0-0" class="elemento comentarios">1</div>

которые добавляются к IList<IWebElement>

Однако при попытке SendKeys к элементу, в первый раз он будет работать правильно, а во второй раз всегда будет с StaleElementReferenceException Это связано с тем, что предыдущий элемент (первый) изменился, а вместе с ним и DOM страницы.

Я пытаюсь найти способ найти элемент снова, если StaleElementReferenceException брошен

Пока что оба эти метода потерпели неудачу:

Способ первый

public virtual void Introducir_NotasAlumnos(string nota)
{
    IList<IWebElement> divNota = tablaNotas
    .Select((element, index) => element.FindElement(By.Id("accion-1-celda-0-" + index + "-0")))
    .ToList();

    divNota.ToList().ForEach(element => Introducir_Nota(element, nota));
}

Способ второй

public virtual void Introducir_NotasAlumnos(string nota)
{
    int index = 0;

        foreach (IWebElement element in tablaNotas)
        {
            By locator = By.Id("accion-1-celda-0-" + index + "-0");

            Introducir_Nota(element.FindElement(locator), nota);

            index++;
        }
}

Спасибо за ваше время.

1 ответ

Решение

Вот ваши локаторы:

  • стол: .table tbody > tr
  • строка таблицы по индексу: .table tbody > tr:nth-child(1)

и вы метод (код Java):

int size = driver.findElements(By.cssSelector(".table tbody > tr")).size();

for (int i = 0; i < size; i++) {
    WebElement row = driver.findElement(By.cssSelector(".table tbody > tr:nth-child(" + i + ")"));
    By locator = By.id("accion-1-celda-0-" + i + "-0");
    Introducir_Nota(row.findElement(locator), nota);
}

У вас есть определенное количество строк, и вы найдете элемент строки независимо, не должны бросать StaleElementReferenceException исключение.

Вот более короткая версия:

int size = driver.findElements(By.cssSelector(".table tbody > tr")).size();

for (int i = 0; i < size; i++) {
    Introducir_Nota(row.findElement(By.cssSelector("#accion-1-celda-0-" + i + "-0")), nota);
}
Другие вопросы по тегам