Selenium กรอบงาน: ข้อมูล คำหลัก และขับเคลื่อนแบบไฮบริด
ความหมายของ Selenium กรอบ?
เค้ก Selenium กรอบการทำงานอัตโนมัติ เป็นโครงสร้างโค้ดที่ทำให้การบำรุงรักษาโค้ดเป็นเรื่องง่ายและมีประสิทธิภาพ หากไม่มีเฟรมเวิร์ก ผู้ใช้จะวาง "โค้ด" และ "ข้อมูล" ไว้ในตำแหน่งเดียวกัน ซึ่งจะไม่สามารถนำกลับมาใช้ซ้ำหรืออ่านซ้ำได้ เฟรมเวิร์กจะให้ผลลัพธ์ที่เป็นประโยชน์ เช่น การนำโค้ดกลับมาใช้ซ้ำได้มากขึ้น ความสามารถในการพกพาที่สูงขึ้น ต้นทุนการบำรุงรักษาสคริปต์ที่ลดลง ความสามารถในการอ่านโค้ดที่ดีขึ้น เป็นต้น
ประเภทของ Selenium กรอบ
ส่วนใหญ่มีสาม ประเภทของกรอบงาน ที่สร้างขึ้นโดย Selenium WebDriver เพื่อทำให้กรณีทดสอบด้วยตนเองเป็นอัตโนมัติ
- กรอบการทำงานที่ขับเคลื่อนด้วยข้อมูล
- กรอบการทำงานที่ขับเคลื่อนด้วยคำหลัก
- กรอบงานขับเคลื่อนแบบไฮบริด
Data Driven Framework ใน Selenium
Data Driven Framework ใน Selenium เป็นวิธีการแยกชุดข้อมูลจากกรณีทดสอบ เมื่อแยกชุดข้อมูลออกจากกรณีทดสอบแล้ว จะสามารถแก้ไขได้ง่ายสำหรับฟังก์ชันการทำงานเฉพาะโดยไม่ต้องเปลี่ยนโค้ด มันถูกใช้เพื่อดึงกรณีการทดสอบและชุดจากไฟล์ภายนอกเช่น Excel, .csv, .xml หรือบางตารางฐานข้อมูล
หากต้องการอ่านหรือเขียน Excel Apache มี POI ห้องสมุดที่มีชื่อเสียงมาก ห้องสมุดนี้สามารถอ่านและเขียนได้ทั้งสองอย่าง xls และ XLSX รูปแบบไฟล์ของ Excel
อ่าน xls ไฟล์, ไฟล์ HSSF การใช้งานมีให้โดยห้องสมุด POI
อ่าน XLSX, XSSF การใช้งาน จุดที่น่าสนใจ ห้องสมุด จะเป็นทางเลือก มาศึกษาการใช้งานเหล่านี้โดยละเอียด
เราได้เรียนรู้เกี่ยวกับ Data Driven Testing ในของเราแล้ว กวดวิชาก่อนหน้านี้
กรอบการทำงานที่ขับเคลื่อนด้วยคำหลักใน Selenium
กรอบการทำงานที่ขับเคลื่อนด้วยคำหลักใน Selenium เป็นวิธีที่ใช้เพื่อเร่งความเร็วในการทดสอบอัตโนมัติโดยแยกคำสำคัญสำหรับชุดฟังก์ชันและคำสั่งทั่วไป การดำเนินการและคำสั่งทั้งหมดที่ต้องดำเนินการจะเขียนไว้ในไฟล์ภายนอก เช่น แผ่นงาน Excel ผู้ใช้สามารถควบคุมและระบุฟังก์ชันที่ต้องการทดสอบได้อย่างง่ายดาย
นี่คือลักษณะของกรอบงานที่สมบูรณ์
อย่างที่คุณเห็น มันเป็นกรอบงาน 5 ขั้นตอน มาศึกษารายละเอียดทีละขั้นตอนกัน
ขั้นตอน 1)
- สคริปต์ไดรเวอร์ Execute.java จะเรียก ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java มีสคริปต์ POI เพื่ออ่านข้อมูลจาก Excel
ขั้นตอน 2)
- ReadGuru99ExcelFile.java จะอ่านข้อมูลจาก TestCase.xlsx
- นี่คือลักษณะของแผ่นงาน -
- ตามคำสำคัญที่เขียนไว้ในไฟล์ Excel เฟรมเวิร์กจะดำเนินการบน UI
- ตัวอย่างเช่น เราต้องคลิกปุ่ม 'เข้าสู่ระบบ' ในทำนองเดียวกัน Excel ของเราจะมีคำหลัก 'คลิก' ตอนนี้ AUT สามารถมีปุ่มได้หลายร้อยปุ่มบนเพจ เพื่อระบุปุ่มเข้าสู่ระบบ ใน Excel เราจะป้อนชื่อวัตถุเป็นปุ่มเข้าสู่ระบบและประเภทวัตถุเป็นชื่อ (ดูแถวที่ไฮไลต์ในภาพด้านบน) ประเภทวัตถุอาจเป็น Xpath ชื่อ CSS หรือค่าอื่น ๆ
ขั้นตอน 3) ReadGuru99ExcelFile.java จะส่งข้อมูลนี้ไปยังสคริปต์ไดรเวอร์ Execute.java
ขั้นตอน 4)
- สำหรับองค์ประกอบเว็บ UI ทั้งหมดของเรา เราจำเป็นต้องสร้างพื้นที่เก็บข้อมูลวัตถุที่เราจะวางตัวระบุตำแหน่งองค์ประกอบ (เช่น Xpath, ชื่อ, เส้นทาง CSS, ชื่อคลาส ฯลฯ )
- Execute.java (สคริปต์ไดรเวอร์ของเรา) จะอ่าน Object Repository ทั้งหมดและจัดเก็บไว้ในตัวแปร
- หากต้องการอ่านที่เก็บวัตถุนี้ เราจำเป็นต้องมีคลาส ReadObject ซึ่งมีเมธอด getObjectRepository เพื่ออ่าน
หมายเหตุ: คุณอาจคิดว่าทำไมเราต้องสร้างที่เก็บวัตถุ คำตอบช่วยในการบำรุงรักษาโค้ด ตัวอย่างเช่น เราใช้ปุ่มชื่อ = btnlogin ในกรณีทดสอบที่แตกต่างกัน 10 กรณี ในอนาคตผู้พัฒนาตัดสินใจเปลี่ยนชื่อจาก btnlogin เป็น send คุณจะต้องทำการเปลี่ยนแปลงในกรณีทดสอบทั้ง 10 กรณี ในกรณีของที่เก็บอ็อบเจ็กต์ คุณจะทำการเปลี่ยนแปลงเพียงครั้งเดียวในที่เก็บ
ขั้นตอน 5)
- ไดรเวอร์จะส่งผ่านข้อมูลจาก Excel & Object Repository ไปยัง UIOperaชั้นเรียน
- UIOperaคลาส tion มีฟังก์ชันในการดำเนินการที่สอดคล้องกับคำหลักเช่น CLICK, SETTEXT ฯลฯ ... ที่กล่าวถึงใน Excel
- UIOperaคลาสเรียนคือก Java คลาสที่มีการนำโค้ดไปใช้งานจริงเพื่อดำเนินการกับองค์ประกอบบนเว็บ
โครงการที่สมบูรณ์จะมีลักษณะดังนี้-
ลองดูตัวอย่าง:
สถานการณ์การทดสอบ: เรากำลังดำเนินการกรณีทดสอบ 2 กรณี
- กรณีทดสอบ 1:
- ไปที่
https://demo.guru99.com/V4/
- กรอกรหัสผู้ใช้
- ใส่รหัสผ่าน
- คลิกรีเซ็ต
- กรณีทดสอบ 2:
- ไปที่
https://demo.guru99.com/V4/
- กรอกรหัสผู้ใช้
- ใส่รหัสผ่าน
- คลิกเข้าสู่ระบบ
วัตถุคุณสมบัติ
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
อ่านGuru99ExcelFile.java
package excelExportAndFileIO; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadGuru99ExcelFile { public Sheet readExcel(String filePath,String fileName,String sheetName) throws IOException{ //Create a object of File class to open xlsx file File file = new File(filePath+"\\"+fileName); //Create an object of FileInputStream class to read excel file FileInputStream inputStream = new FileInputStream(file); Workbook guru99Workbook = null; //Find the file extension by spliting file name in substing and getting only extension name String fileExtensionName = fileName.substring(fileName.indexOf(".")); //Check condition if the file is xlsx file if(fileExtensionName.equals(".xlsx")){ //If it is xlsx file then create object of XSSFWorkbook class guru99Workbook = new XSSFWorkbook(inputStream); } //Check condition if the file is xls file else if(fileExtensionName.equals(".xls")){ //If it is xls file then create object of XSSFWorkbook class guru99Workbook = new HSSFWorkbook(inputStream); } //Read sheet inside the workbook by its name Sheet guru99Sheet = guru99Workbook.getSheet(sheetName); return guru99Sheet; } }
อ่าน Object.java
package operation; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReadObject { Properties p = new Properties(); public Properties getObjectRepository() throws IOException{ //Read object repository file InputStream stream = new FileInputStream(new File(System.getProperty("user.dir")+"\\src\\objects\\object.properties")); //load all objects p.load(stream); return p; } }
UIOperation.java
package operation; import java.util.Properties; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class UIOperation { WebDriver driver; public UIOperation(WebDriver driver){ this.driver = driver; } public void perform(Properties p,String operation,String objectName,String objectType,String value) throws Exception{ System.out.println(""); switch (operation.toUpperCase()) { case "CLICK": //Perform click driver.findElement(this.getObject(p,objectName,objectType)).click(); break; case "SETTEXT": //Set text on control driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value); break; case "GOTOURL": //Get url of application driver.get(p.getProperty(value)); break; case "GETTEXT": //Get text of an element driver.findElement(this.getObject(p,objectName,objectType)).getText(); break; default: break; } } /** * Find element BY using object type and value * @param p * @param objectName * @param objectType * @return * @throws Exception */ private By getObject(Properties p,String objectName,String objectType) throws Exception{ //Find by xpath if(objectType.equalsIgnoreCase("XPATH")){ return By.xpath(p.getProperty(objectName)); } //find by class else if(objectType.equalsIgnoreCase("CLASSNAME")){ return By.className(p.getProperty(objectName)); } //find by name else if(objectType.equalsIgnoreCase("NAME")){ return By.name(p.getProperty(objectName)); } //Find by css else if(objectType.equalsIgnoreCase("CSS")){ return By.cssSelector(p.getProperty(objectName)); } //find by link else if(objectType.equalsIgnoreCase("LINK")){ return By.linkText(p.getProperty(objectName)); } //find by partial link else if(objectType.equalsIgnoreCase("PARTIALLINK")){ return By.partialLinkText(p.getProperty(objectName)); }else { throw new Exception("Wrong object type"); } } }
ExecuteTest.java
package testCases; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class ExecuteTest { @Test public void testLogin() throws Exception { // TODO Auto-generated method stub WebDriver webdriver = new FirefoxDriver(); ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); //Create a loop over all the rows of excel file to read it for (int i = 1; i < rowCount+1; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i); //Check if the first cell contain a value, if yes, That means it is the new testcase name if(row.getCell(0).toString().length()==0){ //Print testcase detail on console System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+ row.getCell(3).toString()+"----"+ row.getCell(4).toString()); //Call perform function to perform operation on UI operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString()); } else{ //Print the new testcase name when it started System.out.println("New Testcase->"+row.getCell(0).toString() +" Started"); } } } }
หลังจากดำเนินการ ผลลัพธ์จะมีลักษณะดังนี้ –
ดาวน์โหลด Selenium ไฟล์โครงการสำหรับการสาธิตในบทช่วยสอนนี้
กรอบงานขับเคลื่อนแบบไฮบริด
กรอบงานขับเคลื่อนแบบไฮบริด in Selenium เป็นแนวคิดที่เราใช้ประโยชน์จากทั้งกรอบงานขับเคลื่อนด้วยคำหลักและกรอบงานขับเคลื่อนด้วยข้อมูล เป็นเฟรมเวิร์กที่ใช้งานง่ายซึ่งช่วยให้ผู้ทดสอบด้วยตนเองสามารถสร้างกรณีทดสอบได้โดยเพียงแค่ดูที่คีย์เวิร์ด ข้อมูลการทดสอบ และพื้นที่เก็บข้อมูลออบเจ็กต์โดยไม่ต้องเขียนโค้ดในเฟรมเวิร์ก
สำหรับคำหลัก เราจะใช้ไฟล์ Excel เพื่อรักษากรณีการทดสอบ และสำหรับข้อมูลการทดสอบ เราสามารถใช้ข้อมูล ผู้ให้บริการของ ทดสอบ กรอบ.
ในเฟรมเวิร์กไฮบริดของเรา เราไม่จำเป็นต้องเปลี่ยนแปลงสิ่งใดในเฟรมเวิร์กที่ขับเคลื่อนด้วยคำหลัก ที่นี่เราเพียงแค่ต้องแทนที่ไฟล์ ExecuteTest.java ด้วยไฟล์ HybridExecuteTest.java
ไฟล์ HybridExecuteTest นี้มีโค้ดทั้งหมดสำหรับคำหลักที่ขับเคลื่อนด้วยแนวคิดของผู้ให้บริการข้อมูล
การแสดงรูปภาพที่สมบูรณ์ของเฟรมเวิร์กไฮบริดจะมีลักษณะดังนี้
HybridExecuteTest.java
package testCases; import java.io.IOException; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class HybridExecuteTest { WebDriver webdriver = null; @Test(dataProvider="hybridData") public void testLogin(String testcaseName,String keyword,String objectName,String objectType,String value) throws Exception { // TODO Auto-generated method stub if(testcaseName!=null&&testcaseName.length()!=0){ webdriver=new FirefoxDriver(); } ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Call perform function to perform operation on UI operation.perform(allObjects, keyword, objectName, objectType, value); } @DataProvider(name="hybridData") public Object[][] getDataFromDataprovider() throws IOException{ Object[][] object = null; ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); object = new Object[rowCount][5]; for (int i = 0; i < rowCount; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i+1); //Create a loop to print cell values in a row for (int j = 0; j < row.getLastCellNum(); j++) { //Print excel data in console object[i][j] = row.getCell(j).toString(); } } System.out.println(""); return object; } }
สรุป
- เราสามารถสร้างกรอบการทดสอบได้สามประเภทโดยใช้ Selenium เว็บไดร์เวอร์
- A Selenium กรอบการทำงานอัตโนมัติที่สามารถจำแนกได้เป็น Data Driven, Keyword Driven และ Hybrid Frameworks
- เราสามารถบรรลุกรอบการทำงานที่ขับเคลื่อนด้วยข้อมูลได้โดยใช้ TestNGผู้ให้บริการข้อมูล
- ในกรอบการทำงานที่ขับเคลื่อนด้วยคำหลัก คำสำคัญจะถูกเขียนในไฟล์ภายนอกบางไฟล์ เช่น ไฟล์ Excel และโค้ด Java จะเรียกไฟล์นี้และดำเนินการกรณีทดสอบ
- เฟรมเวิร์กไฮบริดเป็นการผสมผสานระหว่างเฟรมเวิร์กที่ขับเคลื่อนด้วยคำหลักและเฟรมเวิร์กที่ขับเคลื่อนด้วยข้อมูล
ดาวน์โหลด Selenium ไฟล์โครงการสำหรับการสาธิตในบทช่วยสอนนี้