Selenium Webdriver - 取消复杂表格中的所有复选框

时间:2014-02-26 11:20:03

标签: java selenium selenium-webdriver

我目前正在尝试解开iframe中的复选框。目前的情况是,目前可以将一些复选框设置为默认选中,而某些复选框则不设置。我需要勾选一个特定的复选框,所以要做的事情是运行一个循环,遍历所有复选框并取消全部复选。

这是我遇到问题的地方。我将发布一个包含复选框的HTML示例。(这不是我的,所以我不能编辑HTML)。

这是示例在iframe中有3种不同类型的复选框的情况下的显示方式。

<fieldset id="testing">
<legend>testing</legend>
<table>
    <tbody>
        <tr>
            <td class="EXAMPLE">
                <table id="CHECKBOXTYPE1">
                    <tbody>
                        <tr>
                            <td style="vertical-align:top;white-space:nowrap;" title="">
                                <input id="CHECKBOXTYPE1-01" type="checkbox" value="on" onclick="DOES STUFF;"/>
                            </td>
                            <td style="vertical-align:top;white-space:nowrap;" title="">TITLE1</td>
                        </tr>
                        <tr>
                            <td/>
                            <td id="CHECKBOXTYPE2-01" style="display:none;white-space:nowrap;vertical-align:top;padding:0px;">
                                <table>
                                    <tbody>
                                        <tr>
                                            <td style="vertical-align:top;" colspan="3">
                                                <select id="field" style="width:100%;">
                                                    <option value="1">STUFF1 </option>
                                                    <option value="2">STUFF2 </option>
                                                    <option value="3">STUFF3 </option>
                                                    <option value="4">STUFF4 </option>
                                                </select>
                                            </td>
                                            <td style="vertical-align:bottom;padding-left:6px;" rowspan="2">
                                                <textarea id="CHECKBOXTYPE2-01-COMMENTS" cols="50" rows="2" style="margin:0px;height:50px;" type="text" onclick="DOES STUFF">Please Insert Notes...</textarea>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td style="vertical-align:bottom;">
                                                <input type="CHECKBOXTYPE2-01-BUTTON" onclick="DOES STUFF" value="<" style="height:100%;width:32px;"/>
                                            </td>
                                            <td style="vertical-align:bottom;">
                                                <input id="CHECKBOXTYPE2-01-INPUT" type="input" readonly="" style="width:112px;"/>
                                            </td>
                                            <td style="vertical-align:bottom;">
                                                <input type="CHECKBOXTYPE2-01-BUTTON" onclick="DOES STUFF" style="width:32px;height:100%;" value=">"/>
                                            </td>
                                        </tr>
                                    </tbody>    
                                </table>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
        <tr>
            <td class="field_label">
                <table id="CHECKBOXTYPE3">
                    <tbody>
                        <tr>
                            <td style="vertical-align:top;">
                                <input id="CHECKBOXTYPE3-01" type="checkbox" title="" onclick="DOES STUFF"/>
                            </td>
                            <td style="vertical-align:top;" title="">CHECKBOX NAME</td>
                            <td style="vertical-align:top;">
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
    </tbody>
</table>

我试图迭代的代码是

try{
            for(int i=0; i < 30; i++){
                WebElement relCheckBoxes = driver.findElement(By.xpath("html/body/div[3]/fieldset/table/tbody/tr[i]/td/table/tbody/tr/td[1]"));
                if(relCheckBoxes.isSelected()){
                    relCheckBoxes.click();
                }               
            }
        }
        catch(Exception e){
            System.out.printf("didn't work");
        }

显然这不是最优化的代码片段,但是现在我只是在努力找到有用的东西:\我只是想通过复选框,关闭所有代码,然后打开我需要的一个。

谢谢。

2 个答案:

答案 0 :(得分:1)

这里有几个问题:

1)您的XPath不正确。你有:

"html/body/div[3]/fieldset/table/tbody/tr[i]/td/table/tbody/tr/td[1]"

相反,它应该是:

"html/body/div[3]/fieldset/table/tbody/tr[" + i + "]/td/table/tbody/tr/td[1]"

否则,你只是在寻找一个非数字索引30次的表行!

2)XPath索引是基于1而不是基于0(疯狂,我知道)。由于你的循环以i=0开头,因此它首先尝试查找不存在的第0个元素。 findElement在无法找到与搜索条件匹配的元素时抛出异常,因此循环立即结束。尝试使用i=1启动循环。

答案 1 :(得分:1)

如果要取消选中所有复选框,请使用以下代码。效率很高!

//Get the complex table
WebElement mainTable = driver.findElement(By.xpath("html/body/div[3]/fieldset/table"));

//Find all the input tags inside the mainTable and save it to a list
List<WebElement> checkBoxes = mainTable.findElements(By.tagName("input"));

//iterate through the list of checkboxes and if checked, uncheck them
for (WebElement checkbox : checkBoxes) {
    if (checkbox.isSelected()) {
        checkbox.click();
    }
} 

我在代码中看不到任何框架。如果有帧,请使用以下代码第1个

//switch to the frame
driver.switchTo().frame("framename/index");

希望这可以帮助你:)