Selenium กรอบงาน: ข้อมูล คำหลัก และขับเคลื่อนแบบไฮบริด
⚡ สรุปอย่างชาญฉลาด
Selenium กรอบแนวคิด: แนวทางที่ขับเคลื่อนด้วยข้อมูล คำหลัก และแบบผสมผสาน กำหนดวิธีการที่ผู้ทดสอบจัดระเบียบโค้ดอัตโนมัติ แยกข้อมูลทดสอบ และนำตรรกะกลับมาใช้ใหม่ บทความนี้จะอธิบายกรอบแนวคิดแต่ละประเภท สถาปัตยกรรม ข้อดี และวิธีการนำไปใช้ทีละขั้นตอนพร้อมตัวอย่างเชิงปฏิบัติ Selenium ตัวอย่างโค้ด WebDriver

ความหมายของ Selenium กรอบ?
การขอ Selenium กรอบการทำงานอัตโนมัติ เฟรมเวิร์กคือสถาปัตยกรรมโค้ดที่มีโครงสร้าง ซึ่งทำให้การบำรุงรักษาการทดสอบทำได้ง่าย ปรับขนาดได้ และมีประสิทธิภาพ หากไม่มีเฟรมเวิร์ก ผู้ทดสอบมักจะวางโค้ดและข้อมูลไว้ในที่เดียวกัน ซึ่งไม่สามารถนำกลับมาใช้ใหม่ได้และอ่านยาก การนำเฟรมเวิร์กมาใช้จะให้ประโยชน์ที่วัดผลได้ เช่น การนำโค้ดกลับมาใช้ใหม่ได้มากขึ้น การพกพาได้ดีขึ้น ลดต้นทุนการบำรุงรักษาสคริปต์ ปรับปรุงความสามารถในการอ่าน และการแยกส่วนความรับผิดชอบระหว่างตรรกะการทดสอบและข้อมูลอินพุตได้ชัดเจนยิ่งขึ้น
ทำไมต้องใช้ Selenium กรอบการทำงานอัตโนมัติ?
ออกแบบมาอย่างดี Selenium เฟรมเวิร์กนี้ช่วยแก้ปัญหาที่เกิดขึ้นซ้ำซาก 3 ประการในการทดสอบอัตโนมัติ ได้แก่ การเขียนโค้ดซ้ำซ้อน ตัวระบุตำแหน่งที่ไม่เสถียร และข้อมูลทดสอบที่จัดการได้ยาก ด้วยการกำหนดโครงสร้างที่ชัดเจน ทีมงานสามารถขยายชุดทดสอบจากสคริปต์เพียงไม่กี่ตัวไปเป็นหลายร้อยตัวได้โดยไม่สูญเสียการควบคุม
- การบำรุงรักษา: ตัวระบุตำแหน่งส่วนกลางและเมธอดช่วยเหลือหมายความว่าการเปลี่ยนแปลงเพียงครั้งเดียวจะอัปเดตการทดสอบทั้งหมดที่ใช้ส่วนประกอบนั้น
- การนำกลับมาใช้ใหม่: การทำงานทั่วไป เช่น การเข้าสู่ระบบ การนำทาง หรือการกรอกแบบฟอร์ม จะถูกเขียนเพียงครั้งเดียวและเรียกใช้ในกรณีทดสอบจำนวนมาก
- scalability: การเพิ่มกรณีทดสอบใหม่จะกลายเป็นการอัปเดตข้อมูลแทนที่จะเป็นงานเขียนโค้ด ซึ่งช่วยให้ผู้ที่ไม่ใช่โปรแกรมเมอร์สามารถมีส่วนร่วมในการสร้างสถานการณ์จำลองได้
- การรายงานและการทำงานร่วมกัน: โครงสร้างที่เป็นมาตรฐานทำให้ง่ายต่อการผสานรวมกับเครื่องมือรายงาน ระบบ CI/CD และระบบควบคุมเวอร์ชัน
ประเภทของ Selenium กรอบ
มีสามระดับประถมศึกษา ประเภทของเฟรมเวิร์ก สร้างขึ้นบน Selenium WebDriver ใช้สำหรับทำให้การทดสอบแบบแมนนวลเป็นไปโดยอัตโนมัติ แต่ละรูปแบบมุ่งเน้นความสมดุลที่แตกต่างกันระหว่างความพยายามของนักพัฒนา การมีส่วนร่วมของผู้ทดสอบ และความยืดหยุ่นของข้อมูล
- กรอบการทำงานที่ขับเคลื่อนด้วยข้อมูล
- กรอบการทำงานที่ขับเคลื่อนด้วยคำหลัก
- กรอบงานขับเคลื่อนแบบไฮบริด
ส่วนถัดไปจะอธิบายแต่ละกรอบการทำงานโดยละเอียด โดยเริ่มจากวิธีการที่ง่ายที่สุดซึ่งขับเคลื่อนด้วยข้อมูล และค่อยๆ พัฒนาไปสู่รูปแบบไฮบริดที่มีความยืดหยุ่นมากที่สุด
Data Driven Framework ใน Selenium
Data Driven Framework ใน Selenium เป็นวิธีการแยกชุดข้อมูลทดสอบออกจากตรรกะของกรณีทดสอบ เมื่อข้อมูลถูกแยกออกจากกันแล้ว คุณสามารถแก้ไขอินพุตสำหรับฟังก์ชันเฉพาะได้โดยไม่ต้องแก้ไขโค้ดทดสอบ วิธีนี้มักใช้ในการดึงกรณีทดสอบและชุดทดสอบจากแหล่งภายนอก เช่น Excelไฟล์ .csv, .xml หรือตารางฐานข้อมูล
Apache มีไลบรารี POI ที่เป็นที่รู้จักกันดีสำหรับการอ่านหรือเขียนไฟล์ Excel ไลบรารีนี้สามารถจัดการได้ทั้งสองแบบ xls และ XLSX รูปแบบ ดิ HSSF การใช้งานนี้อ่านไฟล์ XLS รุ่นเก่า ในขณะที่ XSSF ระบบนี้รองรับไฟล์ XLSX สมัยใหม่
เราได้กล่าวถึงการทดสอบโดยใช้ข้อมูลเป็นตัวขับเคลื่อน (Data Driven Testing) ไปแล้วในบทความก่อนหน้านี้ กวดวิชาก่อนหน้านี้.
กรอบการทำงานที่ขับเคลื่อนด้วยคำหลักใน Selenium
กรอบการทำงานที่ขับเคลื่อนด้วยคำหลักใน Selenium เป็นวิธีการที่ช่วยเร่งกระบวนการอัตโนมัติโดยการแยกคำหลักสำหรับฟังก์ชันและคำสั่งทั่วไป การดำเนินการและคำสั่งทั้งหมดจะถูกเขียนไว้ในไฟล์ภายนอก ซึ่งโดยทั่วไปคือไฟล์ Excel ผู้ทดสอบสามารถระบุฟังก์ชันที่ต้องการตรวจสอบได้โดยไม่ต้องแก้ไขไฟล์ต้นฉบับ Java โค้ดรูปแบบนี้จึงเหมาะอย่างยิ่งสำหรับทีมที่นักวิเคราะห์ธุรกิจหรือผู้ทดสอบคุณภาพด้วยตนเองมีส่วนร่วมในการกำหนดนิยามการทดสอบ
นี่คือภาพรวมของโครงสร้างทั้งหมด:
อย่างที่เห็น มันเป็นกรอบการทำงาน 5 ขั้นตอน เรามาศึกษาแต่ละขั้นตอนอย่างละเอียดกัน
ขั้นตอน 1)
- สคริปต์ไดรเวอร์ Execute.java เรียกใช้ ReadGuru99ExcelFile.java.
- อ่านGuruไฟล์ 99ExcelFile.java มีโค้ด POI ที่อ่านข้อมูลจากไฟล์ Excel
ขั้นตอน 2)
- อ่านGuru99ExcelFile.java อ่านข้อมูลจากไฟล์ TestCase.xlsx
- นี่คือหน้าตาของเอกสารแผ่นนั้น:
- เฟรมเวิร์กจะดำเนินการตามคำสำคัญที่เขียนไว้ในไฟล์ Excel บนส่วนติดต่อผู้ใช้ (UI)
- ตัวอย่างเช่น ในการคลิกปุ่มที่มีป้ายกำกับว่า “เข้าสู่ระบบ” แผ่นงาน Excel จะจัดเก็บคำหลัก “คลิก” ไว้ เพื่อระบุปุ่มเข้าสู่ระบบท่ามกลางปุ่มอื่นๆ มากมายบนหน้าเว็บ แถวใน Excel จะกำหนดชื่อวัตถุเป็น loginButton และประเภทวัตถุเป็น name (ดูแถวที่ไฮไลต์ในภาพ) ประเภทวัตถุอาจเป็น XPath, CSS, class หรือกลยุทธ์การระบุตำแหน่งอื่นๆ ก็ได้
ขั้นตอน 3) อ่านGuruไฟล์ 99ExcelFile.java ส่งข้อมูลที่แยกวิเคราะห์แล้วกลับไปยังสคริปต์หลัก Execute.java
ขั้นตอน 4)
- สำหรับองค์ประกอบ UI บนเว็บทั้งหมด คุณจะต้องดูแลรักษาคลังเก็บวัตถุที่จัดเก็บตัวระบุตำแหน่งขององค์ประกอบ เช่น XPath, ชื่อ, CSS หรือชื่อคลาส
- ไฟล์ Execute.java (สคริปต์หลัก) จะอ่านข้อมูลจากคลังเก็บอ็อบเจ็กต์ทั้งหมดและเก็บไว้ในตัวแปร
- คลาส ReadObject ซึ่งเป็นคลาสช่วยเสริม จะมีเมธอด getObjectRepository ที่ใช้โหลด repository ในระหว่างการทำงาน
หมายเหตุ: คุณอาจสงสัยว่าทำไมจึงต้องมีที่เก็บอ็อบเจ็กต์ คำตอบคือเรื่องการบำรุงรักษา หากปุ่มที่มีชื่อว่า btnlogin ถูกใช้ใน 10 กรณีทดสอบ และนักพัฒนาเปลี่ยนชื่อเป็น submit คุณจะต้องแก้ไขไฟล์ถึง 10 ไฟล์ แต่ด้วยที่เก็บอ็อบเจ็กต์ คุณเพียงแค่เปลี่ยนตัวระบุตำแหน่งในที่เดียว
ขั้นตอน 5)
- ไดรเวอร์ส่งข้อมูลจาก Excel และแหล่งเก็บวัตถุไปยังส่วนติดต่อผู้ใช้Operaชั้นเรียน tion
- UIOperaไฟล์ tion ประกอบด้วยฟังก์ชันที่แมปคำหลักแต่ละคำ เช่น CLICK และ SETTEXT ไปยังการกระทำเฉพาะของ WebDriver
- UIOperation คือ 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 File object to open the xlsx file
File file = new File(filePath + "\\" + fileName);
// Create a FileInputStream to read the Excel file
FileInputStream inputStream = new FileInputStream(file);
Workbook guru99Workbook = null;
// Detect the file extension
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if (fileExtensionName.equals(".xlsx")) {
guru99Workbook = new XSSFWorkbook(inputStream);
} else if (fileExtensionName.equals(".xls")) {
guru99Workbook = new HSSFWorkbook(inputStream);
}
// Read the 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 the 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":
driver.findElement(this.getObject(p, objectName, objectType)).click();
break;
case "SETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
break;
case "GOTOURL":
driver.get(p.getProperty(value));
break;
case "GETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).getText();
break;
default:
break;
}
}
private By getObject(Properties p, String objectName, String objectType) throws Exception {
if (objectType.equalsIgnoreCase("XPATH")) {
return By.xpath(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CLASSNAME")) {
return By.className(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("NAME")) {
return By.name(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CSS")) {
return By.cssSelector(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("LINK")) {
return By.linkText(p.getProperty(objectName));
} 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 {
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 the number of rows in the Excel file
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
for (int i = 1; i < rowCount + 1; i++) {
Row row = guru99Sheet.getRow(i);
if (row.getCell(0).toString().length() == 0) {
System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
row.getCell(3).toString() + "----" + row.getCell(4).toString());
operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
row.getCell(3).toString(), row.getCell(4).toString());
} else {
System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
}
}
}
}
หลังจากดำเนินการเสร็จสิ้น ผลลัพธ์จะมีลักษณะดังนี้:
ดาวน์โหลด Selenium ไฟล์โครงการสำหรับการสาธิตในบทช่วยสอนนี้
กรอบงานขับเคลื่อนแบบไฮบริด
กรอบงานขับเคลื่อนแบบไฮบริด in Selenium ผสานรวมจุดแข็งของทั้งเฟรมเวิร์กแบบ Keyword Driven และ Data Driven เข้าด้วยกัน เป็นโมเดลที่ใช้งานง่าย ช่วยให้ผู้ทดสอบด้วยตนเองสร้างกรณีทดสอบได้ง่ายๆ เพียงแค่แก้ไขคีย์เวิร์ด ข้อมูลทดสอบ และคลังเก็บอ็อบเจ็กต์ โดยไม่ต้องเขียนโค้ดเฟรมเวิร์กใดๆ
ในที่นี้ ไฟล์ Excel จะเก็บคำสำคัญสำหรับแต่ละขั้นตอนไว้ และ TestNG's ผู้ให้บริการข้อมูล จัดเตรียมข้อมูลทดสอบ การแบ่งส่วนนี้ช่วยให้คุณสามารถปรับขนาดทั้งคำศัพท์การกระทำและการเปลี่ยนแปลงอินพุตได้อย่างอิสระ
สำหรับเฟรมเวิร์กไฮบริดของเรา โครงสร้างแบบใช้คีย์เวิร์ดขับเคลื่อนนั้นไม่มีอะไรเปลี่ยนแปลง เราเพียงแค่แทนที่ไฟล์ ExecuteTest.java ด้วย HybridExecuteTest.java เท่านั้น
ไฟล์ HybridExecuteTest นี้ประกอบด้วยตรรกะแบบใช้คีย์เวิร์ดอย่างสมบูรณ์ รวมกับ TestNGกลไกผู้ให้บริการข้อมูลของ
ภาพประกอบแสดงโครงสร้างแบบไฮบริดโดยสมบูรณ์มีลักษณะดังนี้:
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 {
if (testcaseName != null && testcaseName.length() != 0) {
webdriver = new FirefoxDriver();
}
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
operation.perform(allObjects, keyword, objectName, objectType, value);
}
@DataProvider(name = "hybridData")
public Object[][] getDataFromDataprovider() throws IOException {
Object[][] object = null;
ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
object = new Object[rowCount][5];
for (int i = 0; i < rowCount; i++) {
Row row = guru99Sheet.getRow(i + 1);
for (int j = 0; j < row.getLastCellNum(); j++) {
object[i][j] = row.getCell(j).toString();
}
}
System.out.println("");
return object;
}
}
ดาวน์โหลด Selenium ไฟล์โครงการสำหรับการสาธิตในบทช่วยสอนนี้












