在我的应用程序中,我有一个带有复选框列的网格。每行的复选框的ID仅与固定值后的数字不同。 xxxx_0,xxxx_1,....
为了选择任何行中的复选框,可以附加行号以获取完整的ID。
我的代码是这样的:
for(int i=0; i<10; i++) {
CheckBox visible = (CheckBox) driver.findElement(By.id("visibleCheckboxValue_" + i));
visible.toggle(false);
}
这给我一个运行时错误,因为“无法将远程webdriver强制转换为CheckBox。”
另外,如果我使用强制转换为WebElement
,我就无法使用toggle(boolean select)
函数。
for(int i=0; i<10; i++) {
WebElement visible = (WebElement) driver.findElement(By.id("visibleCheckboxValue_" + i));
if(visible.isSelected()) {
visible.click() // To uncheck the check box
}
}
在WebElement
上,我可以使用.isSelected()
检查是否选中了复选框,但它始终返回false。即使选中该复选框,也会返回false。
有没有办法将Webdriver强制转换为CheckBox,这样我才能有效地使用toggle()
函数?
答案 0 :(得分:1)
嗯,你正在考虑这个错误的方法。
你无法将它投射到CheckBox
,我不指望你这样做!那是与另一个API的集成,Selenium没有做到!您根本不应该从.findElement()
投射结果!
您需要考虑为什么您无法使用内置功能,而不是如何将其分解为不同的对象。
我建议的第一件事是明确检查你要带回的元素的“已检查”值。
当HTML中的checkbox
为checked
时,可以通过各种不同的方式进行设置,请参阅this StackOverflow关于“正确”设置复选框的方式的问题checked
。在这里,您应该能够看到它不是yes
或no
的简单案例。
因此,请检查该元素上checked
状态的值。我不打算为你做,这不是学习的重点,而是伪造的代码:
WebElement checkBox = driver.findElement(driver.findElement(By.id("visibleCheckboxValue_" + i));
string checkedStatus = checkBox.getAttribute("checked");
// now do some checking...ie. does that string now contain something? yes? it's checked.
现在你应该能够使用.isSelected
方法,但在我们继续之前,看看上面是否有效。如果是这样,很好,但这意味着某些事情在别处被打破。如果没有,那么你也应该提供你的HTML(以及任何可能相关的JS和CSS),这样我们就可以有效地诊断出这个问题。