1. 程式人生 > >Appium自動化-----數據驅動讀取外部Excel文件

Appium自動化-----數據驅動讀取外部Excel文件

學習記錄

=====要進行操作的Excel======

技術分享

=====對以上Excel的操作==============

//Excel的文件操作
public class ExcelUtilTest {

private XSSFWorkbook excelWBook;//Excel工作薄

private XSSFSheet excelWSheet;//工作表
private XSSFRow row;//行
private XSSFCell cell;//列
private String filePath;//Excel工作薄路徑

/**構造方法*/
//設定要操作的Excel的文件路徑和Excel文件中的sheet名稱
//在讀寫Excel的時候,均需要調用此方法,設定要操作的Excel文件路徑和要操作的sheet名稱
public ExcelUtilTest(String path,String sheetName) throws Exception{
FileInputStream excelFile;
this.filePath=path;

try {
//實例化Excel文件的FileInputStream對象
excelFile = new FileInputStream(path);
//實例化Excel文件的XSSFWorkbook對象
excelWBook = new XSSFWorkbook();
//實例化Excel文件的XSSFSheet對象,指定Excel文件中的sheet名稱;
excelWSheet = excelWBook.getSheet(sheetName);

} catch (Exception e) {
throw (e);
}
}


/**讀取Excel文件指定單元格的函數,此函數只支持後綴為xlsx的Excel文件*/
public String getCellData(int rowNum,int cellNum)throws Exception{
try {
//通過函數參數指定單元格的行號和列表,獲取指定的單元格對象
cell = excelWSheet.getRow(rowNum).getCell(cellNum);
//如果單元格的內容為字符串類型,則使用getStringCellValue()獲取單元格的內容
//如果單元格的內容為數字類型,則使用getNumericCellValue()獲取單元格的內容
String cellData="";
/**獲取單元格類型*/
if(cell.getCellType() == XSSFCell.CELL_TYPE_STRING){
cellData = cell.getStringCellValue();
}else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC){
DecimalFormat df = new DecimalFormat("0");//保留小數的方法,0為不保留小數
cellData = df.format(cell.getNumericCellValue());//format()格式化
}
return cellData;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}

}

/**在Excel文件的執行單元格中寫輸入數據,此函數只支持後綴為xlsx的文件寫入
* @param result 結果
* @param rowNum 行數
* @param cellNum 列數
* */
public void setCellData(int rowNum,int cellNum,String result) throws Exception{

try{
//獲取Excel文件中的行對象
row=excelWSheet.getRow(rowNum);
//如果單元格為空,則返回Null
cell = row.getCell(cellNum,Row.RETURN_BLANK_AS_NULL);

if(cell == null){
//當單元格對象是null的時候,則創建單元格,因為單元格為空,無法調用單元格對象的setCellValue方法設定單元格的值
cell=row.createCell(cellNum);
//創建單元格後可以調用單元格對象的setCellValue方法設定單元格的值
cell.setCellValue(result);
}else{
//單元格中如果有內容,則可以直接調用單元格對象的setCellValue方法設定單元格的值
cell.setCellValue(result);
System.out.println("單元格值設定完成");
}

//實例化寫入Excel文件的文件輸出流對象
FileOutputStream fileOut = new FileOutputStream(filePath);
//將內容寫入Excel文件中
excelWBook.write(fileOut);
//調用flush方法強制刷新寫入文件
fileOut.flush();
//關閉文件輸出流對象
fileOut.close();

}catch(Exception e){
e.printStackTrace();
throw(e);
}

}

/**從Excel文件獲取測試數據的靜態方法
* @throws IOException
* */
public static Object[][] getTestData(String excelFilePath,String sheetName) throws IOException{
//根據參數傳入的數據文件路徑和文件名稱,組合出Excel數據文件的絕對路徑
File file=new File(excelFilePath);

//創建FileInputStream對象用於讀取Excel文件
FileInputStream inputStream = new FileInputStream(file);

//聲明Workbook對象
Workbook workBook = null;

//獲取文件類型的後綴名;
String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf("."));

//判斷如果是xlsx,則使用 XSSFWorkbook 對象進行實例化
//如果是xls,則使用 SSFWorkbook 對象進行實例化
if(fileExtensionName.equals(".xlsx")){

workBook = new XSSFWorkbook(inputStream);

}else if(fileExtensionName.equals(".xls")){
workBook = new HSSFWorkbook(inputStream);
}

//通過sheetName參數,生成sheet對象
Sheet sheet = workBook.getSheet(sheetName);

//獲取Excel數據文件中sheet1中數據的行數,getLastRowNum方法獲取數據的最後行號
//getFirstRowNum方法獲取數據的第一行行號,相減之後算出數據的行數
int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();
System.out.println(sheet+"總行數是"+rowCount);

//創建名為records的list對象來存儲從Excel數據文件中獲取的數據
List<Object[]> records = new ArrayList<Object[]>();

//使用2個for循環遍歷Excel數據文件中的所有數據(除了第一行,第一行是數據列名稱),所以從1開始
for(int i =1;i<=rowCount;i++){
//使用getRow()獲取行對象
Row row=sheet.getRow(i);

/*聲明一個數組,來存儲Excel數據文件每行中的測試用例和數據,數組的大小用getLastCellNum-1來進行動態聲明,實現測試數據個數和數組大小相一致
* 因為Excel數據文件中的測試數據航的最後一個單元格為測試執行結果,倒數第二個單元格為此測試數據行
* 是否運行的狀態。所最後兩列的單元格數據並不需要傳入到測試方法中,所以使用getLastCellNum-2的方法去掉每行中的最後兩個單元格數據
* 計算出需要存儲的測試數據個數,並作為測試數據數組的初始化大小
*/
String fields[]=new String[row.getLastCellNum()-2];//創建一個String類型的數組,並指定大小

/*if用來判斷數據行是否要參加測試的執行,Excel文件的倒數第二行為數據行的狀態位,標記為*
* “y”表示此數據要被測試腳本執行,標記為非“y”的數據行均被認為不會參與測試腳本的執行,會被跳過
* */
String yesOrNot=row.getCell(row.getLastCellNum()-2).getStringCellValue();
// System.out.println(row.getCell(row.getLastCellNum()-2).getCellType()==XSSFCell.CELL_TYPE_NUMERIC);

if(row.getCell(row.getLastCellNum()-2).getStringCellValue().equals("y")){
for(int j=0;j<row.getLastCellNum()-2;j++){
//判斷Excel的單元格字段是數字還是字符,字符串格式調用getStringCellValue()獲取
//數字格式調用getNumericCellValue()獲取
//System.out.println(row.getCell(j).getCellType()== XSSFCell.CELL_TYPE_NUMERIC);
if(row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_STRING){
fields[j]=row.getCell(j).getStringCellValue();
}else if(row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_NUMERIC){
DecimalFormat df= new DecimalFormat("0");
fields[j]=df.format(row.getCell(j).getNumericCellValue());
}else{
System.out.println("格式錯誤");
}
//System.out.println(fields[j]);
}

//fields的數據對象存儲到records的list中
records.add(fields);
}

}

//定義函數返回值,即object[][]
//將存儲測試數據的list轉換為一個Object的二維數據
Object[][] results=new Object[records.size()][];

//設置二維數據每行的值,每行是個object對象
for(int i=0;i<records.size();i++){
results[i]=records.get(i);
}
//關閉Excel文件
inputStream.close();
return results;
}


//遍歷二維數組
public void printArray(Object[][] arr){
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
}
System.out.println("");
}
}
}



======Excel的文件操作類的--測試類=====

public class TestExcelUticl {

public static void main(String[] args) throws Exception {
ExcelUtilTest eut = new ExcelUtilTest("configs/測試用例.xlsx", "登錄數據");//excel名字,sheet名字
// eut.getCellData(3, 3);
Object[][] arr=eut.getTestData("configs/測試用例.xlsx", "登錄數據");
eut.printArray(arr);
}

}


=====應用到自動化數據驅動裏,實現自動化數據驅動讀取外部Excel文件=========


/**查找元素*/
@Test(dataProvider="loginTestData")
public static void testCase(String loginTestData1,String loginTestData2){
Thread.sleep(5000);//等待
//進入
driver.findElementById("元素定位id").click();
//手機號
AndroidElement modile= driver.findElementById("元素定位id");
modile.clear();
modile.sendKeys(loginTestData1);
//驗證碼
AndroidElement pws=driver.findElementById("元素定位id");
pws.clear();
pws.sendKeys(loginTestData2);
//點擊登錄
driver.findElementById("元素定位id").click();

}

/**登錄數據驅動
* */
@DataProvider(name="loginTestData")
public static Object[][] data() throws IOException
{
Object[][] arr=ExcelUtilTest.getTestData("configs/測試用例.xlsx", "登錄數據");
return arr;
}


Appium自動化-----數據驅動讀取外部Excel文件