Selenium-等待后加载父元素,但未完全加载子元素

时间:2020-03-04 09:13:39

标签: java selenium selenium-webdriver

<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()));

但是,当我遍历列表时,遍历4或5个元素后会得到StaleElementReferenceException。

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

问题是,即使'tr1'已加载,在迭代发生时tds也不会完全加载。等待只是检查提到的父元素(tr1)的加载。

是否有适当的方法来处理此问题。等待直到父元素和所有子元素都被加载。

2 个答案:

答案 0 :(得分:0)

要确保同时加载 parent child 元素,而不是presenceOfElementLocated(),您需要为 WebDriverWait visibilityOfAllElementsLocatedBy(),您可以使用以下任一Locator Strategies

  • 使用 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());
    

答案 1 :(得分:-1)

尝试使用.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());