复选框的isSelected()方法总是返回true



如果切换按钮处于禁用状态,我想打开切换按钮,如果切换按钮已经处于启用状态,我想让它处于启用状态。

List<WebElement> allToggle = driver.findElements(By.xpath("//body//******-******-****authoring//div//table//td//label"));
for (WebElement Toggle : allToggle) 
{
if (!Toggle.isSelected()) 
{
Toggle.click();
}
}

我不知道我哪里错了。

注:-按钮类型为复选框

您试图为标签元素调用isSelected()(基于您提供的xpath)。

基于官方Selenium javadochttps://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebElement.html isSelected ()

此操作仅适用于复选框、选择中的选项和单选按钮等输入元素。

对于非输入元素,isSelected()总是返回true。

解决方案提出了

更正xpath以引用相应的输入元素,而不是label.

可以是页面源中的某个<input type="checkbox">元素

还要注意,对于一些现代的复选框实现,input元素可以隐藏,甚至不能直接点击,无论如何,很可能你必须调用isSelected()对这些元素,但仍然需要点击标签切换。

所以你需要迭代元素索引和获得复选框输入和切换标签。

List<WebElement> checkboxInputs = driver.findElements(By.xpath("some-xpath-part-you-need-to-determine/input"));
List<WebElement> allToggle = driver.findElements(By.xpath("//body//******-******-****authoring//div//table//td//label"));
int checkboxesCount = allToggle.size();
for (int i = 0; i < checkboxesCount; i++;) {
if (!checkboxInputs.get(i).isSelected()) {
allToggle.get(i).click();
}
}

最后,我创造了一个同样有效的解决方案。

问题是每个复选框都有两个部分,一个是<Input>标签,另一个是<Span>标签。输入标签有关于复选框是否选中的状态,& but click action将不与输入一起工作,它只与Span一起工作,所以我这样处理它:

protected void disableToggle(By Span_Path, By InputPath) {
if (!driver.findElement(InputPath).isSelected()) {
System.out.println(" Toggle is Already Disabled ");
} else if (driver.findElement(InputPath).isSelected()) {
click(Span_Path, WaitStrategy.CLICKABLE, "Toggle Button Disabled");
}
}

最新更新