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; } }