Selenium - родительский элемент загружается после ожидания, но дочерние элементы загружаются не полностью - PullRequest
0 голосов
/ 04 марта 2020
<table>
  <tr id="tr1">
    <td id="td1">1</td>
    <td id="td2">2</td>
    <td id="td3">3</td>
    <td id="td4">4</td>
    <td id="td5">5</td>
    <td id="td6">6</td>
    <td id="td7">7</td>
    <td id="td8">8</td>
    <td id="td9">9</td>
    <td id="td10">10</td>
  </tr>
  <tr id="tr2">
    <td id="td1">11</td>
    <td id="td2">22</td>

  </tr>
</table>

Я получаю элемент 'tr1', используя

WebDriverWait wait = new WebDriverWait(driver, 5);
tableHeaderRow = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("tr1"))); 

Затем я получаю список 'td' и перебираю элементы td.

List<WebElement> headersList = tableHeaderRow.findElements(By.tagName("td"));
System.out.println("Size :" + headersList.size()); //10

Размер списка здесь 10.

headersList.forEach(td -> System.out.println(td.getTagName()));

Но когда я перебираю список, я получаю исключение StaleElementReferenceException после перебора 4 или 5 элементов.

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document.

Проблема в том, что хотя tr1 загружен, tds загружаются не полностью, когда происходит итерация. Ожидание только проверяет загрузку упомянутого родительского элемента (tr1).

Существует ли правильный способ решения этой проблемы. Дождитесь загрузки родительского элемента и всех дочерних элементов.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Чтобы убедиться, что загружены оба элемента родительский и дочерний , вместо presenceOfElementLocated() вам нужно вызвать WebDriverWait для visibilityOfAllElementsLocatedBy() и вы может использовать любую из следующих стратегий локатора :

  • Использование cssSelector :

    System.out.println(new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("td.journalTable-journalPost>a.htext-small"))).size());
    
  • Использование xpath :

    System.out.println(new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//tr[@id='tr1']//td"))).size());
    
0 голосов
/ 04 марта 2020

Попробуйте использовать .visibilityOfAllElementsLocatedBy для ожидания элемента и собрать его в списке.

Используйте этот xpath: //tr[@id='tr1']//td.

Попробуйте следующий код:

WebDriverWait wait = new WebDriverWait(driver, 5);
List<WebElement> elements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//tr[@id='tr1']//td")));
System.out.println("Size :" + elements.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...