将WebDriver强制转换为CheckBox时出现运行时错误

时间:2013-05-14 17:35:06

标签: selenium checkbox webdriver selenium-webdriver testng

在我的应用程序中,我有一个带有复选框列的网格。每行的复选框的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()函数?

1 个答案:

答案 0 :(得分:1)

嗯,你正在考虑这个错误的方法。

你无法将它投射到CheckBox,我不指望你这样做!那是与另一个API的集成,Selenium没有做到!您根本不应该从.findElement()投射结果!

您需要考虑为什么您无法使用内置功能,而不是如何将其分解为不同的对象。

我建议的第一件事是明确检查你要带回的元素的“已检查”值。

当HTML中的checkboxchecked时,可以通过各种不同的方式进行设置,请参阅this StackOverflow关于“正确”设置复选框的方式的问题checked。在这里,您应该能够看到它不是yesno的简单案例。

因此,请检查该元素上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),这样我们就可以有效地诊断出这个问题。