单击webTable中特定记录的特定按钮

时间:2014-05-15 14:10:53

标签: java selenium xpath selenium-webdriver

在我们的应用程序中,我有一个场景可以点击特定用户的编辑图标。 所以目前我正在使用以下代码:

以下是“编辑”按钮的html源代码:

<tbody id="defaultOverviewTable_data" class="ui-datatable-data ui-widget-content">
    <tr class="ui-widget-content ui-datatable-even ui-datatable-selectable" aria-selected="false" role="row" data-rk="5910" data-ri="0">
    <tr class="ui-widget-content ui-datatable-odd ui-datatable-selectable" aria-selected="false" role="row" data-rk="1" data-ri="1">
    <tr class="ui-widget-content ui-datatable-even ui-datatable-selectable" aria-selected="false" role="row" data-rk="1211" data-ri="2">
    <tr class="ui-widget-content ui-datatable-odd ui-datatable-selectable ui-state-hover" aria-selected="false" role="row" data-rk="14" data-ri="3">
        <td class="ui-selection-column" style="width:17px;min-width:17px;max-width:17px;" role="gridcell">
        <td role="gridcell">HemaSundar</td>
        <td style="width:105px;min-width:105px;max-width:105px;" role="gridcell">52A-4EB-52C-294</td>
        <td role="gridcell">HemaSundar</td>
        <td role="gridcell">HemaSundar</td>
        <td role="gridcell">Banking, Admin, System, EuropeanGate, SAP, MBS, Audit, Confidential Payments, iPhone App</td>
        <td role="gridcell">
        <td class="fillerColumn" style="width:0px;min-width:0px;max-width:0px;" role="gridcell"/>
        <td class="iconColumn width_components_4" style="width:160px;min-width:160px;max-width:160px;" role="gridcell">
            <div class="columnDiv">
                <div id="defaultOverviewTable:3:j_id128" class="ui-outputpanel ui-widget">
                    <button id="defaultOverviewTable:3:j_id129" class="ewms-ui-icon-superEdit ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-state-hover" type="submit" title="" alt="Edit" onclick="return false;PrimeFaces.addSubmitParam('defaultOverviewForm',{'edit_id':'14'})" name="defaultOverviewTable:3:j_id129" role="button" aria-disabled="false">
                        <span class="ui-button-text ui-c">ui-button</span>
                    </button>
                </div>

以下是我现在使用的代码:

WebElement overview = driver.findElement(By.id("defaultOverviewTable_data"));// considering the complete webtable
        List<WebElement> individualRows = overview.findElements(By.tagName("tr"));//considering invidual user
        for (WebElement wb: individualRows)
        {
            List<WebElement> indWb = wb.findElements(By.tagName("td"));// considering individual columns for individual users
            System.out.println(indWb.get(1).getText());
            if (indWb.get(1).getText().equalsIgnoreCase(username))// if the username equals the expected
            {
                List<WebElement> allButtons = wb.findElements(By.tagName("button"));// getting all the buttons of that user
                for (WebElement edit: allButtons)
                {
                    System.out.println(edit.getAttribute("title"));
                    if (edit.getAttribute("title").matches("Edit"))
                    {
                        edit.click();// clicking on button where title is Edit.
                        break;
                    }
                }
                break;
            }
        }

有些时候表中有超过300个用户,那么如果我想点击大约200位置的用户的编辑。这花费了更多的时间。

有没有其他方法可以使用XPATH点击编辑按钮,其中用户名栏等于特定名称?

注意:按钮的ID不是常量。

1 个答案:

答案 0 :(得分:0)

我相信这个XPath应该实现你想要实现的目标。

//tbody[@id='defaultOverviewTable_data']/tr[./td[2][text()='HemaSundar']]//button[@alt='Edit']

注意:

    使用
  • td [2]是因为XPath是基于1的,你正在寻找 第二栏

  • 您提到点击title="Edit"所在的按钮,但您的代码段实际上没有,所以我选择的是alt属性

XPath可以非常强大,如果您想要更深入的解释,请告诉我

编辑:在下面添加更好的XPath解释......

//tbody[@id='defaultOverviewTable_data']

这会在页面的任何位置找到id ='defaultOverviewTable_data'的tbody元素。简单

/tr[./td[2][text()='HemaSundar']]

这会找到一个tr元素,它是tbody的直接子元素(开头只有一个/)。方括号部分意味着它只会找到与方括号(./td[2][text()='HemaSundar'])内的条件匹配的行,或者在英语中,它只会找到第二个子{{1}中包含文本'HemaSundar'的行}}

td

最后,这将找到tr下面的任何按钮(不仅仅是直接的子节点,因为双//button[@alt='Edit'] ),它具有'Title'的//属性。如果愿意,您可以切换@alt部分以匹配任何其他属性。

如果解决了您的问题,请不要忘记将此答案标记为正确:)