如何在Java的Selenium中判断复选框是否被选中?

86

我正在使用Java中的Selenium来测试Web应用程序中复选框的检查。以下是代码:

private boolean isChecked;
private WebElement e;

我声明e并将其分配到复选框所在的区域。

isChecked = e.findElement(By.tagName("input")).getAttribute("checked").equals("true");

奇怪的是 getAttribute("checked") 返回了null,因此出现了一个NullPointerException

在复选框的HTML中,没有显示checked属性。 但是,难道不是这样吗?所有的input元素都有checked = "true",所以这段代码应该可以工作吗?

8个回答

149

如果你正在使用Webdriver,那么你要查找的项目是Selected。

通常情况下,复选框的渲染不会应用checked属性,除非特别指定。

因此,在Selenium Webdriver中,你要查找的是这个:

isChecked = e.findElement(By.tagName("input")).Selected;

由于WebDriver Java API中没有Selected选项,因此上面的代码应该如下所示:

isChecked = e.findElement(By.tagName("input")).isSelected();

太棒了!我简直不敢相信API中已经有isSelected()方法了。我本来想自己写一个类似的方法,却没发现它已经存在了。谢谢你。 - jamesfzhang
1
在我看来,API中的命名约定实际上并不好 - “选择”暗示着有一系列可供选择的事物,就像HTML Select标记一样。复选框是二进制的,选中或未选中。 - CJ Kepinsky

16
if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
     driver.findElement(By.id("idOfTheElement")).click();
}

11
 if(checkBox.getAttribute("checked") != null) // if Checked 
    checkBox.click();                         //to Uncheck it 

您还可以添加一个and语句,以确保选中为真。


9

我会使用css选择器实现:

// for all checked checkboxes
driver.findElements(By.cssSelector("input:checked[type='checkbox']"));
// for all notchecked checkboxes
driver.findElements(By.cssSelector("input:not(:checked)[type='checkbox']"));

也许这也有所帮助;-)

这并没有回答问题。问题不是如何搜索已选中的复选框,而是有没有任何复选框被选中。 - Elmue

2

对于有多个复选框需要选择/取消的情况,以下操作适用于 Chrome Driver(在 IE Driver 中可能无法正常工作):

注意:我的复选框没有与之相关联的 ID,这是根据文档识别它们的最佳方法。请注意语句开头的 ! 符号。

if(!driver.findElement(By.xpath("//input[@type='checkbox' and @name='<name>']")).isSelected()) 
{
  driver.findElement(By.xpath("//input[@type='checkbox' and @name= '<name>']")).click();
}

1
  1. 声明一个变量。
  2. 存储单选按钮的 checked 属性。
  3. 使用 if 条件语句。

假设

private string isChecked; 
private webElement e; 
isChecked =e.findElement(By.tagName("input")).getAttribute("checked");
if(isChecked=="true")
{

}
else 
{

}

希望这个答案对您有所帮助。如果在使用CSharp Selenium web driver时有任何疑问,请告诉我。


1
public boolean getcheckboxvalue(String element)
    {   
        WebElement webElement=driver.findElement(By.xpath(element));
        return webElement.isSelected();
    }

1
使用 isSelected() 方法是个好主意。但是你的代码并没有直接回答问题。如果你能将其改为与顶部帖子中的代码匹配,或者解释一下你建议做出的更改(用英语),那就更好了。 - Dima Chubarov
元素是您在调用函数时要发送的xpath。 返回值将是复选框的状态。 - akhilesh gulati

-1

Selenium框架的机制:

在这里,Selenium向其服务器发出请求,并获取第一个标记为input的子元素。

WebElement e = e.findElement(By.tagName("input"));

然后您尝试在该元素上获取属性

object attribute = e.getAttribute("checked")

所以要么使用

findElement(By.attribute("checked")

或者使用

findElement(By.xpath("\\input[@checked='true']")

顺便说一句,我不熟悉Java中Selenium API的等效方法,因此某些方法可能会有稍微不同的命名。


这并没有真正解决问题。我正在尝试确定复选框是否被选中,因此使用布尔值 isSelected。我不是在寻找已选中的复选框。无论如何,我将使用一种变通方法,通过在 NullPointerException 上使用 trycatch 来包围 isSelected - jamesfzhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接