请考虑以下情形: -
书店网站拥有多本书籍,每本书都有一些详细信息,如作者姓名,出版商等。主页面显示书籍数量,点击页面上的任何书籍,弹出窗口显示该特定书籍的详细信息书。主html页面如下所示。
链接 书1
<book id="abc">
<a href="linkAddress">link</a>
<div class="name">Book 2</div>
</book>
<book id="abc">
<a href="linkAddress">link</a>
<div class="name">Book 3</div>
</book>
<book id="abc">
<a href="linkAddress">link</a>
<div class="name">Book 4</div>
</book>
<book id="abc">
<a href="linkAddress">link</a>
<div class="name">Book 5</div>
</book>
我想获取所有图书的详细信息,所以我所做的是从主页面中获取所有图书元素的列表
List<WebElement> items = fireFoxDriver.findElements(By.id("abc"));
然后遍历该列表并逐个单击每个元素以打开显示该书详细信息的弹出窗口
for(WebElement itemDetails : items){
itemDetails.click();
//After clicking the element pop-up opens which shows details of this particular book.
//Get details of this particular book from pop-up.
}
并从打开的弹出窗口中获取我需要的详细信息,然后在获取所有必需的详细信息并移至下一个元素后关闭弹出窗口。
现在的问题是我使用itemDetails.click()
打开弹出窗口,但有时在打开弹出窗口时出现以下错误。我不知道如何处理这些错误所以请指导我。主页面上有元素我在打开弹出窗口时没有更改主页面但仍然出现DOM错误。
感谢。
答案 0 :(得分:4)
您可能遇到了竞争状况。
如果页面在
之间变化List<WebElement> items = fireFoxDriver.findElements(By.id("abc"));
和循环
for(WebElement itemDetails : items){
itemDetails.click();
}
然后itemDetails可能不再属于DOM,你将得到一个StateElementReferenceException。
描述了类似的问题here。您可以尝试显式等待,直到页面处于不会更改的状态(可能使用WebDriverWait
)。
答案 1 :(得分:1)
您可以尝试在想要与之交互之前自己查找每个元素,而不是遍历列表,这样它们就不会变得陈旧。您可以使用xpath完成此操作:
int elementCount = fireFoxDriver.findElements(By.id(“abc”))。Count;
for(int i = 0; i&lt; elementCount; i ++) {
firefoxDriver.findElement(By.XPath(String.Format(“// book [id = \”abc \“] [{0}]”,i.ToString())))。click();
}