2014-02-25 75 views
1

我进行使用硒webdriver的自动化测试通过遍历数组,这个代码是TestNG的dataprovider,总结:我从Excel工作表中获取数据到数据, 它的正常工作。当我正在调试代码时,我得到TestData为testGoogle1(String search1, String Search2)第一次迭代它Search1 = Webdriver, Search2 = Qtp, so on,,,, 我想要的是,它应该直接返回值的数组,如testGoogle1(String search[]),以便在@Test本身我可以添加我的函数迭代所有行和列并测试它们。TestNG的:使用dataProvider

任何人都可以请给我想法如何写它。

测试数据表

Test Data

这里是我的代码

package ExcelTest; 
import com.thoughtworks.selenium.*; 
import static org.testng.AssertJUnit.*; 
import java.io.IOException; 
import jxl.Cell; 
import jxl.CellType; 
import jxl.Sheet; 
import jxl.Workbook; 
import jxl.read.biff.BiffException; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.testng.annotations.AfterClass; 
import org.testng.annotations.BeforeTest; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 
import org.testng.annotations.AfterTest; 
import java.io.File; 
import java.io.FileInputStream; 
import java.util.Iterator; 
import jxl.*; 


public class Sample{ 

     WebDriver driver; 

     @BeforeTest 
     public void startTest(){ 
      driver = Startup.basic(); 
     } 


@DataProvider(name = "DP1") 
public Object[][] createData1() throws Exception{ 
    Object[][] retObjArr=getTableArray("G:\\Selenium Jar Files\\TestData\\Data.xls","DataPool"); 
    return(retObjArr); 

} 

@Test (dataProvider = "DP1") 
public void testGoogle1(String search1, String Search2) throws Exception{ 
//selenium.open("http://www.google.co.in/"); 
// driver.get("http://www.google.co.in/"); 

    //String hello = search.length; 
//for(int i=0; i< search.length ;i++) 
//{ 
System.out.println("param " +search); 
Thread.sleep(3000); 
System.out.println("Opened"); 
WebElement element = driver.findElement(By.name("q")); 
element.sendKeys(search); 
element.submit(); 
System.out.println("Clicked"); 
} 
//} 

@AfterClass 
public void tearDown() throws Exception { 
//selenium.stop(); 
} 


public String[][] getTableArray(String xlFilePath,String sheetName) throws Exception{ 

    String[][] tabArray=null; 


     File inputWorkbook = new File(xlFilePath); 
     Workbook w; 
     int startRow,startCol, endRow, endCol,ci,cj; 
     try { 
      //w = Workbook. 
      w = Workbook.getWorkbook(inputWorkbook); 
      // Get the first sheet 
      Sheet sheet = w.getSheet(sheetName); 
      // Loop over first 10 column and lines 
      endRow = sheet.getRows(); 
      endCol = sheet.getColumns(); 
      tabArray=new String[endRow-1][endCol-1]; 

      ci=0; 

      for (int i=1;i<endRow;i++,ci++){ 
       cj=0; 
       for (int j=1;j<endCol;j++,cj++){ 

        Cell cell = sheet.getCell(j, i); 
       tabArray[ci][cj] = cell.getContents(); 

       } 
      // System.out.println(""); 
      } 
      //file.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 




     return(tabArray); 
    } 

} 

谁能请分享任何想法? 感谢

编辑代码:

public class Sample{ 

     WebDriver driver; 

     @BeforeTest 
     public void startTest(){ 
      driver = Startup.basic(); 
     } 


@DataProvider(name = "DP1") 
public Object[][][] createData1() throws Exception{ 
    Object[][][] retObjArr=getTableArray("G:\\Selenium Jar Files\\TestData\\Data.xls","DataPool"); 
    return (retObjArr); 

} 

@Test (dataProvider = "DP1") 
public void testGoogle1(String search, String het) throws Exception{ 

System.out.println("param " +search); 
Thread.sleep(3000); 
System.out.println("Opened"); 
WebElement element = driver.findElement(By.name("q")); 
element.sendKeys(search); 
element.submit(); 
System.out.println("Clicked"); 
} 
//} 

@AfterClass 
public void tearDown() throws Exception { 
//selenium.stop(); 
} 


public Object[][][] getTableArray(String xlFilePath,String sheetName) throws Exception{ 

    Object[][] tabArray=null; 


     File inputWorkbook = new File(xlFilePath); 
     Workbook w; 
     int startRow,startCol, endRow, endCol,ci,cj,ck; 
     try { 
      //w = Workbook. 
      w = Workbook.getWorkbook(inputWorkbook); 
      // Get the first sheet 
      Sheet sheet = w.getSheet(sheetName); 
      // Loop over first 10 column and lines 
      endRow = sheet.getRows(); 
      endCol = sheet.getColumns(); 
      tabArray=new String[endRow-1][endCol-1]; 

      ci=0; 

      for (int i=1;i<endRow;i++,ci++){ 
       cj=0; 

       for (int j=1;j<endCol;j++,cj++){ 

        Cell cell = sheet.getCell(j, i); 
       tabArray[ci][cj] = cell.getContents(); 

       } 
      // System.out.println(""); 
      } 
      //file.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 



     return(tabArray); /// Here Getting the error **Type mismatch: cannot convert from Object[][] to Object[][][]** 
    } 

} 
+0

那么,从这个代码,它看起来像你知道如何将数据提供商工作。所有你需要做的就是给它一个String的三维数组,并且它会把最内层的数组传递给测试。 –

+0

Iam新到这可以请你帮我这样做, – Learner

+0

您好MrTi,你能帮我一下,或者给一个链接来解决这个问题,Iam在这里着色,不能继续下去。 – Learner

回答

0

这是怎样一个@DataProvider的作品,假设我有以下阵列:

[[value1, value2], 
[value3, value4], 
[value5, value6]] 

注意,有3行2列。测试将运行3次,每次传入2个值。它的价值无关紧要。现在

,如果你想测试只运行一次,你的阵列应该是这样的:

[[value1]] 

我们可以value1是什么,我们希望它是,因此,如果value1是数组那么它会将整个数组传递给dataProvider。因此,你的返回语句应该返回{{tabArray}}

+0

我对编辑的代码返回的理解应该是return {{tabArray}}; ?但这是给错误的。 (语法错误,插入“;”来完成BlockStatements)对不起,我正在学习完全新的这一点。 – Learner

+0

在行末加上一个分号。我会建议在尝试修改代码之前学习java。 –

+0

谢谢我会这样做(学习Java),但我的疑问是对象[] [] [] getTableArray是三维数组和对象[] [] tabArray是二维数组,导致问题,我想这样任何如何我把分号返回{{tabArray}};但仍然是同样的错误。 – Learner

0

看着你的代码,你正试图创建一个返回Object [] [] []的数据提供者函数。你不能这样做;数据提供者函数必须返回Object [] [](任何对象的二维数组),或者Iterator,它将执行相同的功能,但方式稍有不同。

您当然可以在返回的二维数组中嵌套另一个数组;这就是为什么它是Object [] []而不是特定类型。

此外请确保您正确构造您的返回结果。例如,你不能做以下的,因为这并不构造对象[] []数组:

return {{myArray}}; 

相反,你可以这样做:

return new Object[][]{{myArray}}; 
0

我觉得jxl比更难它需要。我使用Apache MetaModel(最近成为了一个完整的Apache项目)编写了一个TestNG DataProvider示例,并且您可以找到here。那

public static Object[][] getCsvData(File csvFile) 
    { 
     CsvConfiguration conf = new CsvConfiguration(1); 
     DataContext csvContext = DataContextFactory.createCsvDataContext(csvFile, conf); 
     Schema schema = csvContext.getDefaultSchema(); 
     Table[] tables = schema.getTables(); 
     Table table = tables[0]; // a representation of the csv file name including extension 
     DataSet dataSet = csvContext.query() 
       .from(table) 
       .selectAll() 
       .where("run").eq("Y") 
       .execute(); 
     List<Row> rows = dataSet.toRows(); 
     Object[][] myArray = get2ArgArrayFromRows(rows); 
     return myArray; 
    } 

而第二部分:

public static Object[][] get2ArgArrayFromRows(List<Row> rows) { 
     Object[][] myArray = new Object[rows.size()][2]; 
     int i = 0; 
     SelectItem[] cols = rows.get(0).getSelectItems(); 
     for (Row r : rows) { 
      Object[] data = r.getValues(); 
      for (int j = 0; j < cols.length; j++) { 
       if (data[j] == null) data[j] = ""; // force empty string where there are NULL values 
      } 
      myArray[i][0] = cols; 
      myArray[i][1] = data; 
      i++; 
     } 
     logger.info("Row count: " + rows.size()); 
     logger.info("Column names: " + Arrays.toString(cols)); 
     return myArray; 
    } 

和测试的一个例子使用该DataProvider的:

@Test(dataProvider = "csv") 
public void testPrintCsvRowToLog(SelectItem[] cols, Object[] data) { 
    String theCols = Joiner.on("|").join(cols); 
    String aRow = Joiner.on("|").join(data); 
    logger.info(theCols); 
    logger.info(aRow); 
}