Selenium 检查 isDisplayed 等于 false 抛出 NoSuchElementException

Selenium checking isDisplayed equals false throws NoSuchElementException

当我检查某个元素的 isDisplayed() 是否等于 false 时,我收到 NoSuchElementException。这是我的代码:

XYZpage.java:

public WebElement cancelButton() { return driver.findElement(By.cssSelector(".cancelButton")); }

XYZtest.java:

softAssertions.assertThat(sellerVehicleEditPage.cancelButton().isDisplayed())
            .isEqualTo(false);

我在这里声明一个元素没有显示。我在这个网站和其他地方看到了其他解决方案,人们建议尝试使用 ExpectedConditions 等。但由于该元素不存在,甚至 ExpectedConditions 最终也会抛出 NoSuchElementException。这是我在 XYZpage.java:

中尝试过的
WebDriverWait wait = new WebDriverWait(driver, 5);
public WebElement cancelButton() { return wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".cancelButton"))); }

我有超过 1000 个元素,每个元素在不同的测试中使用了多次。所以我不想像某些解决方案所建议的那样,每次需要调用该元素时都传递 By 。有没有更优雅的方法来检查条件,如 .isDisplayed() 等于 false 而不会出现 NoSuchElementException?

Selenium 网络驱动程序无法找到与您在那里使用的定位器匹配的元素,这就是 NoSuchElementException 抛出异常的原因。
isDisplayed() 方法可以应用于

返回的网络元素
driver.findElement(By.cssSelector(".cancelButton"))

或通过

wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".cancelButton")))

方法。
但是不涉及此方法,因为在此之前抛出 NoSuchElementException 异常并且流程流在该点中断。
要等待元素存在,您可以使用此方法:

public boolean waitForElementPresence(By element){
    WebDriverWait wait = new WebDriverWait(driver);
    try {
        wait.until(ExpectedConditions.presenceOfElementLocated(element));
        return true;
    }catch (Throwable t){
        return false;
    }
}

等待元素可见性:

public boolean waitForElementVisibility(By element){
    WebDriverWait wait = new WebDriverWait(driver);
    try {
        wait.until(ExpectedConditions.visibilityOfElementLocated(element));
        return true;
    }catch (Throwable t){
        return false;
    }
}

更简单的元素存在验证:

public boolean isElementFound(By element){
    wait(300);
    return !driver.findElements(element).isEmpty();
}

UPD
使用 WebElement 作为参数:

public boolean waitForElementVisibility(WebElement element){
    WebDriverWait wait = new WebDriverWait(driver);
    try {
        wait.until(ExpectedConditions.visibilityOf(element));
        return true;
    }catch (Throwable t){
        return false;
    }
}