Actions.click() 抛出 StaleElementReferenceException,但 WebElement.click() 不会

Actions.click() throws StaleElementReferenceException, but WebElement.click() does not

在我的测试项目中,我有一个静态 class,其中包含许多与 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() 的方法,以防需要将选项滚动到视图中。有什么想法吗?

通常,当您向下或向上滚动时,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);
}