使用Selenium webdriver从网页中提取表数据

时间:2015-12-02 05:58:04

标签: java html selenium xpath selenium-webdriver

使用Selenium webdriver(在Eclipse中)自动化Web应用程序但是现在要求是捕获在其中一个html页面中显示的表数据。 我尝试使用herehere以及其他一些网站提供的解决方案,但我们的网页似乎有不同的方式来显示表enter image description here

尝试使用div类名称String Text = driver.findElements(By.xpath("//div[@class='ag-row ag-row-even ag-row-level-0']//tr")).get(0).getText();获取值但是它不起作用,抛出了索引越界异常

2 个答案:

答案 0 :(得分:1)

从我看到的情况来看,您似乎已经构建了一个自定义表。 从附加图像中的HTML摘录中,结构类似于:

<div class="ag-body-container" ...>
    <div class="row_1_class" ...>
        <div class="column_1_class" ...>
        <div class="column_2_class" ...>
        <div class="column_3_class" ...>
        <div class="column_4_class" ...>
        ... etc
    <div class="row_2_class" ...>
        <div class="column_1_class" ...>
        <div class="column_2_class" ...>
        <div class="column_3_class" ...>
        <div class="column_4_class" ...>
        ... etc

但是你的xPath假设你有表行(我之后猜测可能是表格单元格):

By.xpath("//div[@class='ag-row ag-row-even ag-row-level-0']//tr")

导致您的数组为空(有趣的是,您没有获得NoSuchElement异常,也许在您的html树中某处有tr个标记。)

现在,我不确定您尝试从该表中提取哪些数据,但最好的尝试是根据class属性获取所有行,并为每个行再次根据class属性获取所有列数据(或者您甚至可以使用col属性)。

编辑: 要获取所有元素,您可以获取所有行,然后为每行获取所有列数据:

//Get all the rows from the table
List<WebElement> rows = driver.findElements(By.xpath("//div[contains(@class, 'ag-row')));

//Initialize a new array list to store the text
List<String> tableData = new ArrayList<String>();

//For each row, get the column data and store into the tableData object
for (int i=0; i < rows.size(); i++) {
    //Since you also have some span tags inside (and maybe something else)
    //we first get the div columns
    WebElement tableCell = rows.get(i).findElements(By.xpath("//div[contains(@class, 'ag-cell')]"));
    tableData.add(tableCell.get(0).getText());
}

您还可以将数据存储到双向数组(或任何此类数据)中,然后根据行号和列号位置访问数据。

答案 1 :(得分:0)

我不确定,但可能你的webElements数组是空的,为什么你得到Index out of bounds exception。

如果你试图从整个WW_SALES行获取值,我认为find_elements应该输出父div - class =“ag-row ag-row-even ag-row-level-0”

这只是我的假设基于描述和图像附加。