【问题标题】:Selenium Webdriver java: click on a checkboxSelenium Webdriver java:单击复选框
【发布时间】:2018-04-24 11:29:19
【问题描述】:

我有一个表格,其 HTML 代码如下。我想单击包含“基本用户”的行中的复选框(即在 tr[5] 中)。我无法单击复选框。我正在使用 firefox 浏览器和 Selenium Webdriver (Java)

<div class="ui-jqgrid-bdiv" style="height: 340px; width: 440px;">
<div style="position:relative;">
<div></div>
<table id="s_4_l" class="ui-jqgrid-btable" border="0" cellspacing="0" cellpadding="0" tabindex="0" role="grid" aria-multiselectable="true" aria-labelledby="" style="width: 439px;" summary="Responsibilities" datatable="1">
<tbody>
<tr class="jqgfirstrow" style="height:auto" role="row">
<tr id="1" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;">
<tr id="2" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;">
<tr id="3" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;">
<tr id="4" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;" aria-selected="false">
<tr id="5" class="ui-widget-content jqgrow ui-row-ltr ui-state-highlight selected-row ui-state-hover" tabindex="-1" role="row" style="height: 32px;" aria-selected="true">
<td aria-describedby="s_4_l_cb" style="text-align:center;display:none;" role="gridcell">
<input id="jqg_s_4_l_5" class="cbox" type="checkbox" role="checkbox">
</td>
<td id="5_s_4_l_SSA_Primary_Field" class="edit-cell ui-state-highlight" title="Unchecked" style="text-align:center;" role="gridcell" aria-labelledby="s_4_l_SSA_Primary_Field s_4_l_altCheckBox" tabindex="0">
<span tabindex="-1">
<input id="5_SSA_Primary_Field" class="customelement siebui-ctrl-checkbox siebui-align-center siebui-input-align-center s_4_2_82_0" type="checkbox" aria-checked="false" value="N" tabindex="0" role="checkbox" name="SSA_Primary_Field" maxlength="1" aria-labelledby="5_s_4_l_Name s_4_l_SSA_Primary_Field s_4_l_altCheckBox">
</span>
</td>
<td id="5_s_4_l_Name" title="Base User" style="text-align:left;" role="gridcell" aria-labelledby="s_4_l_Name">Base User</td>
<td id="5_s_4_l_Organization" title="Canada" style="text-align:left;" role="gridcell" aria-labelledby="s_4_l_Organization">Canada</td>
</tr>
<tr id="6" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;">
<td aria-describedby="s_4_l_cb" style="text-align:center;display:none;" role="gridcell">
<td id="6_s_4_l_SSA_Primary_Field" title="Checked" style="text-align:center;" role="gridcell" aria-labelledby="s_4_l_SSA_Primary_Field s_4_l_altCheckBox">
<span class="siebui-icon-checkbox-checked">
<img hspace="0" border="0" space="0" title="Selected" alt="Selected" src="XYZ.com/images/check_d.gif">
</span>
<span style="display:none;">Y</span>
</td>
<td id="6_s_4_l_Name" title="Product Administrator" style="text-align:left;" role="gridcell" aria-labelledby="s_4_l_Name">Product Administrator</td>
<td id="6_s_4_l_Organization" title="Canada" style="text-align:left;" role="gridcell" aria-labelledby="s_4_l_Organization">Canada</td>
</tr>
<tr id="7" class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" role="row" style="height: 32px;">
</tbody>
</table>

此表包含 7 行,第一列每行都有一个复选框。在任何给定时间,只有一行具有 CHECKED/TICKED 复选框,这里是第 6 行。对于其他行,不显示复选框。只有当您单击行的第一个单元格区域内的某个位置时,才会显示该行的复选框。然后您可以勾选该复选框。因此我点击了第 5 行的第一个单元格,现在显示了复选框(如下面的代码所示)。

如何点击第 5 行的这个复选框? 我的代码在下面,第三行是我试图点击复选框的那个,但它没有点击。

WebElement primaryCell = driver.findElement(By.xpath("/html/body/div[9]/div[2]/div/div/div/div[3]/form/div[1]/div/div/div[3]/div[3]/div/table/tbody/tr/td[contains(text(),'Base User')]/preceding-sibling::td[@title='Unchecked']"));
primaryCell.click();
primaryCell.findElement(By.xpath("//span/input")).click();

请帮忙,谢谢!

请注意,tagnames-table、tr、td 的@id - 不是静态的,而是不断变化的。 我已经尝试使用一些现有帖子中提供的解决方案,但我无法解决我的问题。

【问题讨论】:

    标签: java xpath selenium-webdriver checkbox click


    【解决方案1】:

    试试下面的代码,它使用更简单的 xpath 表达式。
    如果单击单元格,则必须等到复选框出现在页面上并且可以单击,它不会立即发生,第一次单击会触发一些 javascript 使复选框可见和可单击,这必须花费一些时间,通常是几个十几毫秒,但如果网络连接或服务器或计算机或所有这些都很慢,那么有时可能需要几秒钟甚至十几秒。:

    String cell = "//table[@summary='Responsibilities']//tr[ contains( ., 'Base User' )]/td[2]";
    
    String checkbox = cell + "//input";
    
    driver.findElement( By.xpath( cell ) ).click();
    
    WebDriverWait wait = new WebDriverWait( driver, 10 );
    
    wait.until( ExpectedConditions.elementToBeClickabe( By.xpath( checkbox ) ) ).click();
    

    【讨论】:

    • 太棒了,非常感谢 krokodilko,我很感激。
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2017-03-31
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多