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;
}
}
当我检查某个元素的 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;
}
}