Selenium Πλαίσιο: Δεδομένα, Λέξεις-κλειδιά & Υβριδικά
⚡ Έξυπνη Σύνοψη
Selenium Πλαίσιο: Οι προσεγγίσεις που βασίζονται σε δεδομένα, λέξεις-κλειδιά και υβριδικά ορίζουν τον τρόπο με τον οποίο οι δοκιμαστές οργανώνουν τον κώδικα αυτοματοποίησης, διαχωρίζουν τα δεδομένα δοκιμών και επαναχρησιμοποιούν τη λογική. Αυτό το άρθρο εξηγεί κάθε τύπο πλαισίου, την αρχιτεκτονική του, τα πλεονεκτήματά του και τον τρόπο εφαρμογής τους βήμα προς βήμα με πρακτικές οδηγίες. Selenium Παραδείγματα κώδικα WebDriver.

Τι είναι Selenium Δομή?
The Selenium Πλαίσιο αυτοματισμού είναι μια δομημένη αρχιτεκτονική κώδικα που καθιστά τη συντήρηση των δοκιμών απλή, επεκτάσιμη και αποτελεσματική. Χωρίς ένα πλαίσιο, οι δοκιμαστές συχνά τοποθετούν κώδικα και δεδομένα στην ίδια θέση, η οποία δεν είναι ούτε επαναχρησιμοποιήσιμη ούτε αναγνώσιμη. Η υιοθέτηση ενός πλαισίου προσφέρει μετρήσιμα οφέλη, όπως υψηλότερη επαναχρησιμοποίηση κώδικα, καλύτερη φορητότητα, μειωμένο κόστος συντήρησης σεναρίων, βελτιωμένη αναγνωσιμότητα και σαφέστερο διαχωρισμό των ζητημάτων μεταξύ της λογικής των δοκιμών και των δεδομένων εισόδου.
Γιατί να χρησιμοποιήσετε ένα Selenium Πλαίσιο Αυτοματισμού;
Ένα καλά σχεδιασμένο Selenium Το framework λύνει τρία επίμονα προβλήματα στον αυτοματισμό δοκιμών: την επανάληψη κώδικα, τους εύθραυστους εντοπιστές και τα μη διαχειρίσιμα δεδομένα δοκιμών. Επιβάλλοντας μια σαφή δομή, οι ομάδες μπορούν να κλιμακώσουν τις σουίτες τους από μια χούφτα σεναρίων σε εκατοντάδες χωρίς να χάσουν τον έλεγχο.
- Συντηρησιμότητα: Οι κεντρικοί εντοπιστές και οι βοηθητικές μέθοδοι σημαίνουν ότι μία μόνο αλλαγή ενημερώνει κάθε δοκιμή που χρησιμοποιεί αυτό το στοιχείο.
- Επαναχρησιμοποίηση: Συνήθεις λειτουργίες όπως η σύνδεση, η πλοήγηση ή η εισαγωγή σε φόρμα γράφονται μία φορά και καλούνται σε πολλές δοκιμαστικές περιπτώσεις.
- Ευελιξία: Η προσθήκη νέων δοκιμαστικών περιπτώσεων γίνεται ενημέρωση δεδομένων και όχι εργασία κωδικοποίησης, η οποία επιτρέπει σε μη προγραμματιστές να συνεισφέρουν σενάρια.
- Αναφορά και Συνεργασία: Η τυποποιημένη δομή διευκολύνει την ενσωμάτωση με εργαλεία αναφοράς, αγωγούς CI/CD και έλεγχο εκδόσεων.
Τύποι Selenium Πλαίσιο
Υπάρχουν τρία κύρια είδη πλαισίων χτισμένο σε Selenium WebDriver για την αυτοματοποίηση των χειροκίνητων δοκιμών. Κάθε στυλ στοχεύει σε διαφορετική ισορροπία μεταξύ της προσπάθειας του προγραμματιστή, της συμμετοχής των ελεγκτών και της ευελιξίας των δεδομένων.
- Πλαίσιο βάσει δεδομένων
- Πλαίσιο με βάση τη λέξη-κλειδί
- Hybrid Driven Framework
Οι επόμενες ενότητες εξηγούν λεπτομερώς κάθε πλαίσιο, ξεκινώντας με την απλούστερη προσέγγιση που βασίζεται σε δεδομένα και προχωρώντας στο πιο ευέλικτο υβριδικό μοντέλο.
Πλαίσιο βάσει δεδομένων σε Selenium
Πλαίσιο βάσει δεδομένων σε Selenium είναι μια μέθοδος διαχωρισμού των συνόλων δεδομένων δοκιμών από τη λογική της δοκιμαστικής περίπτωσης. Μόλις αποσυνδεθούν τα δεδομένα, μπορείτε να τροποποιήσετε τις εισόδους για μια συγκεκριμένη λειτουργικότητα χωρίς να αγγίξετε τον κώδικα δοκιμής. Χρησιμοποιείται συνήθως για την ανάκτηση δοκιμαστικών περιπτώσεων και σουιτών από εξωτερικές πηγές, όπως Excel, .csv, .xml ή πίνακες βάσης δεδομένων.
Για την ανάγνωση ή την εγγραφή αρχείων Excel, ο Apache παρέχει την γνωστή βιβλιοθήκη POI. Αυτή η βιβλιοθήκη μπορεί να χειριστεί και τα δύο. XLS και XLSX μορφές. Το HSSF η υλοποίηση διαβάζει παλαιότερα αρχεία XLS, ενώ η XSSF Η υλοποίηση χειρίζεται σύγχρονα αρχεία XLSX.
Έχουμε ήδη καλύψει τις δοκιμές που βασίζονται σε δεδομένα στο προηγούμενο σεμινάριο.
Πλαίσιο με γνώμονα τη λέξη-κλειδί Selenium
Πλαίσιο με γνώμονα τη λέξη-κλειδί Selenium είναι μια μέθοδος που επιταχύνει τον αυτοματισμό διαχωρίζοντας λέξεις-κλειδιά για κοινές συναρτήσεις και οδηγίες. Όλες οι λειτουργίες και οι οδηγίες είναι γραμμένες σε ένα εξωτερικό αρχείο, συνήθως ένα φύλλο Excel. Οι δοκιμαστές μπορούν να καθορίσουν τις λειτουργίες που θέλουν να επικυρώσουν χωρίς να τις τροποποιήσουν. Java κώδικα, γεγονός που καθιστά αυτό το στυλ ιδανικό για ομάδες όπου οι επιχειρηματικοί αναλυτές ή ο μη αυτόματος έλεγχος ποιότητας συνεισφέρουν ορισμούς δοκιμών.
Δείτε πώς φαίνεται το πλήρες πλαίσιο:
Όπως μπορείτε να δείτε, πρόκειται για ένα πλαίσιο 5 βημάτων. Ας το μελετήσουμε λεπτομερώς βήμα προς βήμα.
Βήμα 1)
- Το σενάριο προγράμματος οδήγησης Execute.java καλεί το ReadGuru99ExcelFile.java.
- ΔιάβασεGuruΤο 99ExcelFile.java περιέχει κώδικα POI που διαβάζει δεδομένα από το Excel.
Βήμα 2)
- ΔιάβασεGuruΤο 99ExcelFile.java διαβάζει δεδομένα από το TestCase.xlsx.
- Δείτε πώς φαίνεται το φύλλο:
- Με βάση τις λέξεις-κλειδιά που είναι γραμμένες στο αρχείο Excel, το πλαίσιο εκτελεί την αντίστοιχη ενέργεια στο περιβάλλον χρήστη.
- Για παράδειγμα, για να κάνετε κλικ σε ένα κουμπί με την ένδειξη "Σύνδεση", το φύλλο Excel αποθηκεύει τη λέξη-κλειδί "Κλικ". Για να αναγνωρίσετε το κουμπί Σύνδεσης ανάμεσα σε πολλά σε μια σελίδα, η γραμμή του Excel ορίζει το Όνομα Αντικειμένου ως loginButton και τον Τύπο Αντικειμένου ως όνομα (δείτε την επισημασμένη γραμμή στην εικόνα). Ο Τύπος Αντικειμένου μπορεί επίσης να είναι XPath, CSS, κλάση ή οποιαδήποτε άλλη στρατηγική εντοπισμού.
Βήμα 3) ΔιάβασεGuruΤο 99ExcelFile.java μεταβιβάζει τα αναλυμένα δεδομένα πίσω στο σενάριο προγράμματος οδήγησης Execute.java.
Βήμα 4)
- Για όλα τα στοιχεία ιστού του UI, διατηρείτε ένα αποθετήριο αντικειμένων που αποθηκεύει εντοπιστές στοιχείων όπως XPath, name, CSS ή όνομα κλάσης.
- Το Execute.java (το σενάριο προγράμματος οδήγησης) διαβάζει ολόκληρο το αποθετήριο αντικειμένων και το αποθηκεύει σε μια μεταβλητή.
- Μια βοηθητική κλάση ReadObject εκθέτει μια μέθοδο getObjectRepository που φορτώνει το αποθετήριο κατά τον χρόνο εκτέλεσης.
ΣΗΜΕΊΩΣΗ: Μπορεί να αναρωτιέστε γιατί απαιτείται ένα αποθετήριο αντικειμένων. Η απάντηση είναι η συντηρησιμότητα. Εάν ένα κουμπί με όνομα = btnlogin χρησιμοποιηθεί σε 10 δοκιμαστικές περιπτώσεις και ο προγραμματιστής το μετονομάσει για υποβολή, διαφορετικά θα επεξεργαστείτε 10 αρχεία. Με ένα αποθετήριο αντικειμένων, αλλάζετε τον εντοπιστή σε ένα σημείο.
Βήμα 5)
- Το πρόγραμμα οδήγησης μεταβιβάζει δεδομένα από το Excel και το αποθετήριο αντικειμένων στο περιβάλλον χρήστη.Operaτάξη σης.
- UIOperaΗ ση περιέχει συναρτήσεις που αντιστοιχίζουν κάθε λέξη-κλειδί, όπως CLICK και SETTEXT, σε μια συγκεκριμένη ενέργεια WebDriver.
- UIOperaη ση είναι μια Java κλάση που περιέχει την πραγματική υλοποίηση για την αλληλεπίδραση με στοιχεία ιστού.
Η πλήρης δομή του έργου μοιάζει με:
Ας δούμε ένα πρακτικό παράδειγμα:
Σενάριο δοκιμής: Εκτελούμε 2 δοκιμαστικές περιπτώσεις.
- Δοκιμαστική περίπτωση 1:
- Παω σε
https://demo.guru99.com/V4/ - Εισαγάγετε το User ID
- Εισάγετε τον κωδικό πρόσβασης
- Κάντε κλικ στο Επαναφορά
- Δοκιμαστική περίπτωση 2:
- Παω σε
https://demo.guru99.com/V4/ - Εισαγάγετε το User ID
- Εισάγετε τον κωδικό πρόσβασης
- Κάντε κλικ στο Σύνδεση
αντικείμενο.ιδιότητες
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;
}
}
ReadObject.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 Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο
Hybrid Driven Framework
Hybrid Driven Framework in Selenium Συνδυάζει τα πλεονεκτήματα τόσο των πλαισίων που βασίζονται σε λέξεις-κλειδιά όσο και των πλαισίων που βασίζονται σε δεδομένα. Είναι ένα εύχρηστο μοντέλο που επιτρέπει στους μη αυτόματους δοκιμαστές να δημιουργούν περιπτώσεις δοκιμών απλώς επεξεργάζοντας λέξεις-κλειδιά, δεδομένα δοκιμών και το αποθετήριο αντικειμένων, χωρίς να γράφουν κώδικα πλαισίου.
Εδώ, τα αρχεία 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 Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο












