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()
的方法,以防需要将选项滚动到视图中。有什么想法吗?
- 硒 4
- Chrome 驱动程序 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);
}
在我的测试项目中,我有一个静态 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()
的方法,以防需要将选项滚动到视图中。有什么想法吗?
- 硒 4
- Chrome 驱动程序 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);
}