selenium 獲取table數據

public class Table {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        WebDriver driver = ExplorerBase.IESetting();
        String url = "http://zs.njust.edu.cn/newzs/news/zhxw/20140710151805.htm";
        driver.manage().window().maximize();// 最大化
        driver.get(url);
        String setscroll = "document.documentElement.scrollTop=300";
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        jse.executeScript(setscroll);
        Table table = new Table(driver);
        //根據By獲取table數據
        By by = By.xpath(".//*[@id='count2']/table[1]/tbody/tr[5]/td/div/table");
        System.out.println(table.getCellText(by, "1.1"));//行列都從1開始,更符合用戶習慣
        
        //根據xpath獲取table數據
        String  xpath=".//*[@id='count2']/table[1]/tbody/tr[5]/td/div/table";//table對應的xpath
        String[][] arr=table.getTableData(xpath,2);
        System.out.println(arr[1][1]);//行列都從1開始,更符合用戶習慣
        driver.quit();

    }

    private WebDriver driver;

    Table(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 從一個table的單元格中獲得文本值. 參數tableCellAddress的格式爲 row.column, 行列從0開始.
     * 
     * @param by
     *            用於獲得table對象
     * @param tableCellAddress
     *            一個單元格地址, 如. "1.4"
     * @return 從一個table的單元格中獲得文本值
     */
    public String getCellText(By by, String tableCellAddress) {
        // 獲得table元素對象
        WebElement table = driver.findElement(by);
        // 對所要查找的單元格位置字符串進行分解,獲得其對應行、列。
        int index = tableCellAddress.trim().indexOf('.');
        int row = Integer.parseInt(tableCellAddress.substring(0, index));
        int cell = Integer.parseInt(tableCellAddress.substring(index + 1));
        // 獲得table表中全部行對象,並獲得所要查詢的行對象。
        List<WebElement> rows = table.findElements(By.tagName("tr"));        
        WebElement theRow = rows.get(row-1);//獲取指定單行, 對出傳入的行列都作-1
        // 調用getCell方法獲得對應的列對象,而後獲得要查詢的文本。
        String text = getCell(theRow, cell-1).getText();
        return text;
    }
/**
 * 獲取指定x,y值
 * @param Row行
 * @param cell列
 * @return 返回指定單元格的元素
 */
    private WebElement getCell(WebElement Row, int cell) {
        List<WebElement> cells;
        WebElement target = null;
        // 列裏面有"<th>"、"<td>"兩種標籤,因此分開處理。
        if (Row.findElements(By.tagName("th")).size() > 0) {
        
            cells = Row.findElements(By.tagName("th"));
            target = cells.get(cell);
        }
        if (Row.findElements(By.tagName("td")).size() > 0) {
            cells = Row.findElements(By.tagName("td"));
            target = cells.get(cell);
        }
        return target;

    }
    /**
     * 獲取table數據
     * @param xpath table對應的xpath
     * @param maxColRow 列最多的一行的行數
     * @return 以二維數組的形式返回table數據
     */
    public String[][] getTableData(String xpath,int maxColRow) {
        WebElement table=driver.findElement(By.xpath(xpath));
        List<WebElement> rows = table.findElements(By.tagName("tr"));//獲取行tr的集合
        int rowCount=rows.size();
        List<WebElement> cols = driver.findElement(By.xpath(xpath+"/tbody/tr["+maxColRow+"]")).findElements(By.tagName("td"));//獲取列td的集合
        int colCount=cols.size();
        //System.out.println("行數:"+rowCount+"列數:"+colCount);
        String[][] arr=new String[rowCount][colCount];
        String txt;
        for (int i = 1; i < rowCount; i++) {
            for (int j = 1; j < colCount; j++) {
                try {
                    txt= driver.findElement( By.xpath(xpath+"/tbody/tr["+(i)+"]/td["+(j)+"]")).getText();
                } catch (Exception e) {
                    txt="";
                }        
                txt=txt.replace("\n", "");
                txt=txt.replace("\r", "");    
                //System.out.println("行數:"+i+"    列數:"+j);
                arr[i-1][j-1]=txt;
            }
        }
        return arr;
    }
}
相關文章
相關標籤/搜索