2015-03-19 85 views
0

我对Selenium非常陌生,我一直试图让测试套件从表中收集数据。我对如何做到这一点毫无头绪。试图从使用Selenium WebDriver for Java获取HTML表中的数据

这里是我与工作表: http://i.imgur.com/vdITVug.jpg

新的任命(日期)在一天中的随机时间随机增加。我创建了一个测试套件,将不断刷新此页面。下一步,将保存表中的所有日期,创建一个循环来比较刷新后的日期是否与原始存储日期不同。

如果它们不同,请通知用户。

下面是我试图完成的理论示例。

//Navigate to the appointment page 

//Store all the current dates from the table 

    for (until a new appointment pops up) 

    { 
    //Refresh the page 
    // Compare the dates to the stored dates 
     if (the dates =/ stored dates) 
     { 
      notify the user(me in this case) 
     } 
    } 

我也想弄清楚如何找到表的元素ID。

下面是一些HTML代码的截图:http://i.imgur.com/GD4yOp9.png

突出显示的声明已经存储了第一次约会。

任何意见将不胜感激,谢谢!

回答

1

尝试复制一个类似的HTML结构(事实上其中2个,刷新后)。这是一个快速解决方案,可以让您在刷新后比较HTML表格。

这里的关键是将您的表格数据组织成类似于数据结构的Map<String, List<String>>

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 


public class CheckTables { 

public WebDriver driver; 


public static void main(String[] args) throws Exception { 


    CheckTables objTest = new CheckTables(); 
    objTest.runTest(); 

} 

public void runTest(){ 

    driver = new FirefoxDriver(); 

    driver.navigate().to("file:///D:/00_FX_WorkSpace/X_Hour/RoadTest_1.html"); 
    Map<String, List<String>> objTable_1 = readTable(); 
    System.out.println("TABLE:1" + objTable_1); 

    //event to refresh the table 
    driver.navigate().to("file:///D:/00_FX_WorkSpace/X_Hour/RoadTest_2.html"); 
    Map<String, List<String>> objTable_2 = readTable(); 
    System.out.println("TABLE:2" + objTable_2); 

    compareTables(objTable_1, objTable_2); 

} 

public Map<String, List<String>> readTable(){ 

    Map<String, List<String>> objTable = new HashMap<>(); 

    List<WebElement> objRows = driver.findElements(By.cssSelector("tr#data")); 
    for(int iCount=0; iCount<objRows.size(); iCount++){ 
     List<WebElement> objCol = objRows.get(iCount).findElements(By.cssSelector("td.tableTxt")); 
     List<String> columns = new ArrayList<>(); 
     for(int col=0; col<objCol.size(); col++){ 
      columns.add(objCol.get(col).getText()); 
     } 
     objTable.put(String.valueOf(iCount), columns); 
    } 

    return objTable; 
} 

public void compareTables(Map<String, List<String>> objTable1, Map<String, List<String>> objTable2){ 


    for(int count=0; count<objTable1.size(); count++){ 

     List<String> objList1 = objTable1.get(String.valueOf(count)); 
     System.out.println(objList1); 
     List<String> objList2 = objTable2.get(String.valueOf(count)); 
     System.out.println(objList2); 

     if(objList1.containsAll(objList2)){ 
      System.out.println("Row [" + count + "] is SAME"); 
     } 
     else{ 
      //notify 
      System.out.println("Row [" + count + "] has CHANGED"); 
     } 
    } 
} 
} 

这里是RoadTest_1.html和RoadTest_2.html的HTML片段 - https://gist.github.com/anonymous/43c3b1f44817c69bd03d/

+0

尝试了你的建议的代码。获取初始化错误:readTable()不应该是静态的。 此外,在readTable()中,'driver'下有一个错误,说我无法对非静态字段进行静态引用。 – suppressive 2015-03-19 13:51:04

+0

我有一个类中的完整代码并从main调用方法。你正在创建一个类的对象,然后调用方法?如果是,那么这些方法不应该是静态的。 – Dharam 2015-03-19 13:53:12

+0

编辑该片段以避免静态对象。 – Dharam 2015-03-19 13:58:35

相关问题