如何使用selenium(JAVA)

时间:2016-06-01 06:46:46

标签: java selenium selenium-webdriver automation

我希望通过提供列名称行索引,在表格单元格中执行点击链接的通用方法。

可能有多种类型的HTML表结构,但我需要通用函数,它在每个看起来像通用HTML表的表中执行操作。

例如。以下是一些通用表的定义: -

1- 第一个表结构

 <table>
 <tr>
 <th>column1</th><th>column2</th><th>column3</th>
 </tr>
 <tr>
 <td><a href="">Link1</a></td><td><a href="">Link2</a></td><td><a href="">Link2</a></td>
 </tr>
 </table>

2- 第二个表格结构

 <table>
 <tr>
 <td>column1</td><th>column2</th><td>column3</td>
 </tr>
 <tr>
 <td><a href="">Link1</a></td><th><a href="">Link2</a></th><td><a href="">Link2</a></td>
 </tr>
 </table>

3- 第三表结构

 <table>
 <tr>
 <td>column1</td><td>column2</td><td>column3</td>
 </tr>
 <tr>
 <td><a href="">Link1</a></td><td><a href="">Link2</a></td><td><a href="">Link2</a></td>
 </tr>
 </table>

这里如果我提供两个参数,例如。

String columnName = "column2", int rowIndex = 1;

然后我的通用函数在所有表格中的表格单元格中执行点击链接Link2

我可以使用WebDriver找到表格,如下所示: -

 WebDriverWait wait = new WebDriverWait(driver, 10000);
 WebElement tableElment = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//table")));

但我不知道如何制作一个通用函数来按我的意愿处理这个表。

请帮助我在Java中创建一个通用函数来完成此任务。

JavascriptExecutor中使用WebDriver也是可以接受的。

Pseudo codeAlgorithm实现此目标也是可以接受的。

提前致谢...:)

1 个答案:

答案 0 :(得分:2)

您可以获取与目标标题匹配的列的索引,然后返回目标行/列中的链接。 我会使用一段JavaScript来完成这项任务:

static WebElement getTableLink(WebElement table, String column, int row) {
    JavascriptExecutor js = (JavascriptExecutor)((RemoteWebElement)table).getWrappedDriver();

    WebElement link = (WebElement)js.executeScript(
        "var rows = arguments[0].rows, header = arguments[1], iRow = arguments[2];      " +
        "var iCol = [].findIndex.call(rows[0].cells, (td) => td.textContent == header); " +
        "return rows[iRow].cells[iCol].querySelector('a');                              " ,
        table, column, row);

    return link;
}

用法:

// get the table
WebElement tableElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table")));

// click the link in column "column2", row 1
getTableLink(tableElement, "column2", 1).click();