我有5个元素,我正在尝试将其1乘1悬停。我把这些元素放在一个列表中。但是,当我使用列表作为悬停(有循环和没有循环(时,它会产生StaleElement异常。注意,当我使用单独的元素而不使用列表时,我可以执行它。我已经打印了List中的元素,返回的xpath看起来也是正确的。
System.out.println("=====================All star start ================");
Actions actions= new Actions(driver);
List<WebElement> starList= new ArrayList<WebElement>();
ArrayList<WebElement> starColorList= new ArrayList<WebElement>();
Reporter.log("Started adding star elements", true);
for(i=11,j=22;i<=15;i++,j=j+2)
{
Reporter.log("Started adding star elements"+i+j, true);
WebElement s = driver.findElement(By.xpath("(//*[name()='svg'][@class='rvs-star-svg'])["+i+"]"));
WebElement sc = driver.findElement(By.xpath("(//*[name()='svg']//*[name()='path'])["+j+"]"));
starList.add(s);
starColorList.add(sc);
}
//Does not work even without loop
actions.moveToElement(starList.get(2)).build().perform();
//作品actions.moveToElement(star1(.build((.perform((;
不起作用for(i=0;i<starList.size((;i++({
Reporter.log("Started Hover"+i, true);
actions.moveToElement(starList.get(i)).build().perform();
Thread.sleep(2000);
System.out.println(starList.get(i));
//System.out.println("Star"+i+"has color "+starColorList.get(i).getAttribute("stroke"));
}
''
有几个问题需要注意:
-
StateElementReferenceException
总是在尝试与由于DOM已更改而不再可访问的元素交互时抛出。在你悬停在第一个元素上之后,你是否试图与第二个元素交互?这是否会导致出现一个新元素,如工具提示,从而使列表中的WebElements无效?之后你必须重新执行搜索。一个基本的解决方案是保留定位器,而不在列表中定位WebElements,以便在循环中运行findElement(locators.get(i)).click()
。 -
这不一定符合您的示例,但似乎是一个相当常见的问题:如果您使用
findElements
(返回与单个定位器匹配的多个元素的列表的变体(,请确保您的定位器不是太通用,因为有时找到的元素不一定是您所期望的。就像在其他<td>
中查找嵌套的<td>
元素,而不是在您期望的元素之后的。
总而言之,这里使用的列表可能只是转移注意力——真正的问题是在调用findElement()
和与该元素进行任何交互之间,DOM中会发生什么。
StateElementReferenceException将在页面加载前或元素消失后尝试访问元素时发生。因此,请尝试添加能见度等待条件。
By tmpBy = By.xpath("//div[contains(text(),'"+deno+"')]");
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(tmpBy));
wait.until(ExpectedConditions.visibilityOfElementLocated(tmpBy));
driver.findElement(tmpBy).click();
当它失败时,请添加代码进行截图。它将很容易为您调试。