<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)的加载。
是否有适当的方法来处理此问题。等待直到父元素和所有子元素都被加载。
答案 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());