在我的测试项目中,我有一个静态类,它包含了许多与WebElement
进行基本交互的方法。我有两个单独的方法来单击WebElement
,其中一个使用WebElement.click()
方法:
public static void click(WebElement element, WebDriverWait w) {
if (element == null) {
return;
}
try {
w.until(ExpectedConditions.elementToBeClickable(element)).click();
} catch (TimeoutException ex) {
Assert.fail("Test failed, because element with locator: " + element.toString().split("->")[1] + " was not found on the page or unavailable");
}
}
以及使用Actions.click(WebElement).build().perform()
方法的
public static void click(WebElement element, Actions a, WebDriverWait w) {
if (element == null) {
return;
}
try {
a.click(w.until(ExpectedConditions.elementToBeClickable(element))).build().perform();
} catch (TimeoutException ex) {
Assert.fail("Test failed, because element with locator: " + element.toString().split("->")[1] + " was not found on the page or unavailable");
}
}
我还有一种方法可以找到并点击菜单中的一个选项:
public void selectItem(IMenuButton button) {
for (WebElement item : w.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("*[role='menuitem']")))) {
if (item.findElement(By.tagName("span")).getText().trim().equalsIgnoreCase(button.getButton())) {
// This throws StaleElementReferenceException
Interaction.click(item, a, w);
// This works
Interaction.click(item, w);
return;
}
}
Assert.fail("No menu item found for: " + button.getButton());
}
当我使用Interaction.click(item, w)
时,它是有效的,但Interaction.click(item, a, w)
抛出StaleElementReferenceException
,我不知道为什么。我需要使用Actions.click()
的方法,以防选项需要滚动到视图中。有什么想法吗?
- 硒4
- Chromedriver 99
- Java
通常,当向下或向上滚动时,DOM
会发生变化。StaleElementReferenceException
表示您曾经找到的元素已被移动或删除。当浏览循环中的元素时,通常是下拉列表或滚动视图中的元素,您需要重新找到它们。否则,您将一次又一次地遇到此异常。
尝试这样做:
try {
Interaction.click(item, a, w);
} catch (StaleElementReferenceException sere) {
// re-find the item by ID, Xpath or Css
item = driver.findElementByID("TheID");
//click again on the element
Interaction.click(item, a, w);
}