Button.isEnabled() returns 即使默认情况下禁用按钮也是如此
Button.isEnabled() returns true even though the button is disabled by default
在测试时我遇到了一个障碍,我在网页中有一个默认情况下禁用的按钮。我正在使用 Selenium WebDriver 来测试默认情况下按钮是否被禁用布尔值总是返回 true。
Boolean buttonStatus = (button XPath).isEnabled
如果有人能帮助我就太好了
HTML 信息:
<div class="commandbutton commandbutton--theme-disabled commandbutton--recommended">
<button class="commandbutton-button commandbutton-button--disabled" type="button" tabindex="-1">
isEnabled 只能告诉您按钮工作正常,您需要检查 class 属性以检查按钮是否已启用。
This will generally return true for everything but disabled input
elements.
但它也适用于按钮。但是,isEnabled()
检查 disabled
属性。如果按钮被 JavaScript 或任何其他方式禁用,isEnabled()
将不会检测到它。
我猜按钮在启用或禁用时还有其他 classes。例如,启用后它可能不会有 commandbutton-button--disabled
class。你可以查一下
WebElement button = driver.findElement(By.xpath("button XPath"));
String classes = button.getAttribute("class");
boolean isDisabled = classes.contains("commandbutton-button--disabled");
我遇到了同样的问题。但是我在页面上的元素很奇怪。有的selenium可以点击,虽然不能点击,有的selenium不能点击,但是可以发key给他们。经过几个小时的思考,我编写了通用方法,用于检查元素是否启用。
在和程序员交谈后,我知道他们在这个页面上使用了一些特殊的 Select,看起来像 Div 里面有 Input。他说,我可以通过检查 Div 的属性 Class 来检查它是否禁用。如果有 'select2-container-disabled' 则此输入被禁用。
然后我改变了我的方法。现在看起来像这样:
public boolean isNotClickable(WebElement... elements) {
List<WebElement> elementsChecked = new ArrayList<>();
List<WebElement> elementsToCheckByClass = new ArrayList<>();
List<WebElement> elementsToCheckByClick = new ArrayList<>();
List<WebElement> elementsToCheckBySendKeys = new ArrayList<>();
for (WebElement checkedElement : elements) {
log.info("Checking, that element [" + getLocator(checkedElement) + "] is not clickable by isEnabled()");
if (checkedElement.isEnabled()) {
elementsToCheckByClass.add(checkedElement);
} else {
elementsChecked.add(checkedElement);
}
}
if (!elementsToCheckByClass.isEmpty()) {
for (WebElement checkedByClassElement : elementsToCheckByClass) {
log.info("Checking, that element [" + getLocator(checkedByClassElement) + "] is not clickable by class");
String classOfElement = checkedByClassElement.getAttribute("class");
List<String> classes = new ArrayList<>(Arrays.asList(classOfElement.split(" ")));
if (!classes.contains("select2-container-disabled")) {
elementsToCheckByClick.add(checkedByClassElement);
} else {
elementsChecked.add(checkedByClassElement);
}
}
}
if (!elementsToCheckByClick.isEmpty()) {
WebDriverWait wait = new WebDriverWait(driverUtils.getDriver(), 1);
for (WebElement checkedByClickElement : elementsToCheckByClick) {
log.info("Checking, that element [" + getLocator(checkedByClickElement) + "] is not clickable by clicking it");
try {
wait.until(elementToBeClickable(checkedByClickElement));
elementsToCheckBySendKeys.add(checkedByClickElement);
} catch (Exception e) {
elementsChecked.add(checkedByClickElement);
}
}
}
if (!elementsToCheckBySendKeys.isEmpty()) {
for (WebElement checkedBySendKeysElement : elementsToCheckBySendKeys) {
log.info("Checking, that element [" + getLocator(checkedBySendKeysElement) + "] is not clickable by sending keys");
try {
checkedBySendKeysElement.sendKeys("checking");
return false;
} catch (Exception e) {
elementsChecked.add(checkedBySendKeysElement);
}
}
}
return elementsChecked.size() == elements.length;
}
在测试时我遇到了一个障碍,我在网页中有一个默认情况下禁用的按钮。我正在使用 Selenium WebDriver 来测试默认情况下按钮是否被禁用布尔值总是返回 true。
Boolean buttonStatus = (button XPath).isEnabled
如果有人能帮助我就太好了
HTML 信息:
<div class="commandbutton commandbutton--theme-disabled commandbutton--recommended">
<button class="commandbutton-button commandbutton-button--disabled" type="button" tabindex="-1">
isEnabled 只能告诉您按钮工作正常,您需要检查 class 属性以检查按钮是否已启用。
This will generally return true for everything but disabled input elements.
但它也适用于按钮。但是,isEnabled()
检查 disabled
属性。如果按钮被 JavaScript 或任何其他方式禁用,isEnabled()
将不会检测到它。
我猜按钮在启用或禁用时还有其他 classes。例如,启用后它可能不会有 commandbutton-button--disabled
class。你可以查一下
WebElement button = driver.findElement(By.xpath("button XPath"));
String classes = button.getAttribute("class");
boolean isDisabled = classes.contains("commandbutton-button--disabled");
我遇到了同样的问题。但是我在页面上的元素很奇怪。有的selenium可以点击,虽然不能点击,有的selenium不能点击,但是可以发key给他们。经过几个小时的思考,我编写了通用方法,用于检查元素是否启用。
在和程序员交谈后,我知道他们在这个页面上使用了一些特殊的 Select,看起来像 Div 里面有 Input。他说,我可以通过检查 Div 的属性 Class 来检查它是否禁用。如果有 'select2-container-disabled' 则此输入被禁用。
然后我改变了我的方法。现在看起来像这样:
public boolean isNotClickable(WebElement... elements) {
List<WebElement> elementsChecked = new ArrayList<>();
List<WebElement> elementsToCheckByClass = new ArrayList<>();
List<WebElement> elementsToCheckByClick = new ArrayList<>();
List<WebElement> elementsToCheckBySendKeys = new ArrayList<>();
for (WebElement checkedElement : elements) {
log.info("Checking, that element [" + getLocator(checkedElement) + "] is not clickable by isEnabled()");
if (checkedElement.isEnabled()) {
elementsToCheckByClass.add(checkedElement);
} else {
elementsChecked.add(checkedElement);
}
}
if (!elementsToCheckByClass.isEmpty()) {
for (WebElement checkedByClassElement : elementsToCheckByClass) {
log.info("Checking, that element [" + getLocator(checkedByClassElement) + "] is not clickable by class");
String classOfElement = checkedByClassElement.getAttribute("class");
List<String> classes = new ArrayList<>(Arrays.asList(classOfElement.split(" ")));
if (!classes.contains("select2-container-disabled")) {
elementsToCheckByClick.add(checkedByClassElement);
} else {
elementsChecked.add(checkedByClassElement);
}
}
}
if (!elementsToCheckByClick.isEmpty()) {
WebDriverWait wait = new WebDriverWait(driverUtils.getDriver(), 1);
for (WebElement checkedByClickElement : elementsToCheckByClick) {
log.info("Checking, that element [" + getLocator(checkedByClickElement) + "] is not clickable by clicking it");
try {
wait.until(elementToBeClickable(checkedByClickElement));
elementsToCheckBySendKeys.add(checkedByClickElement);
} catch (Exception e) {
elementsChecked.add(checkedByClickElement);
}
}
}
if (!elementsToCheckBySendKeys.isEmpty()) {
for (WebElement checkedBySendKeysElement : elementsToCheckBySendKeys) {
log.info("Checking, that element [" + getLocator(checkedBySendKeysElement) + "] is not clickable by sending keys");
try {
checkedBySendKeysElement.sendKeys("checking");
return false;
} catch (Exception e) {
elementsChecked.add(checkedBySendKeysElement);
}
}
}
return elementsChecked.size() == elements.length;
}