Selenium Πλαίσιο: Δεδομένα, Λέξεις-κλειδιά & Υβριδικά
Τι είναι Selenium Δομή?
The Selenium Πλαίσιο αυτοματισμού είναι μια δομή κώδικα που κάνει τη συντήρηση κώδικα εύκολη και αποτελεσματική. Χωρίς πλαίσια, οι χρήστες μπορούν να τοποθετήσουν τον «κώδικα» και τα «δεδομένα» στην ίδια τοποθεσία που δεν είναι ούτε επαναχρησιμοποιήσιμη ούτε αναγνώσιμη. Τα πλαίσια παράγουν ευεργετικά αποτελέσματα όπως αυξημένη επαναχρησιμοποίηση κώδικα, υψηλότερη φορητότητα, μειωμένο κόστος συντήρησης σεναρίου, καλύτερη αναγνωσιμότητα κώδικα κ.λπ.
Τύποι Selenium Πλαίσιο
Είναι κυρίως τρεις τύπος πλαισίων δημιουργήθηκε από Selenium WebDriver για αυτοματοποίηση χειροκίνητων δοκιμών
- Πλαίσιο βάσει δεδομένων
- Πλαίσιο με βάση τη λέξη-κλειδί
- Hybrid Driven Framework
Πλαίσιο βάσει δεδομένων σε Selenium
Πλαίσιο βάσει δεδομένων σε Selenium είναι μια μέθοδος διαχωρισμού συνόλων δεδομένων από την περίπτωση δοκιμής. Μόλις τα σύνολα δεδομένων διαχωριστούν από τη δοκιμαστική περίπτωση, μπορεί εύκολα να τροποποιηθεί για μια συγκεκριμένη λειτουργία χωρίς αλλαγή του κώδικα. Χρησιμοποιείται για τη λήψη δοκιμαστικών περιπτώσεων και σουιτών από εξωτερικά αρχεία όπως π.χ Excel, .csv, .xml ή ορισμένους πίνακες βάσης δεδομένων.
Για να διαβάσετε ή να γράψετε ένα Excel, το Apache παρέχει ένα πολύ διάσημο POI βιβλιοθήκης. Αυτή η βιβλιοθήκη είναι αρκετά ικανή να διαβάζει και να γράφει και τα δύο XLS και XLSX μορφή αρχείου του Excel.
Να διαβασω XLS αρχεία, an HSSF Η υλοποίηση παρέχεται από τη βιβλιοθήκη POI.
Να διαβασω XLSX, XSSF εφαρμογή του POI βιβλιοθήκη θα είναι η επιλογή. Ας μελετήσουμε λεπτομερώς αυτές τις υλοποιήσεις.
Έχουμε ήδη μάθει για το 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)
- Για όλα τα στοιχεία ιστού της διεπαφής χρήστη, πρέπει να δημιουργήσουμε ένα αποθετήριο αντικειμένων όπου θα τοποθετήσουμε τον εντοπισμό στοιχείων τους (όπως Xpath, όνομα, διαδρομή CSS, όνομα κλάσης κ.λπ.)
- Το Execute.java (το σενάριο του προγράμματος οδήγησης μας) θα διαβάσει ολόκληρο το Αποθετήριο αντικειμένων και θα το αποθηκεύσει σε μια μεταβλητή
- Για να διαβάσουμε αυτό το αποθετήριο αντικειμένων, χρειαζόμαστε μια κλάση ReadObject που έχει μια μέθοδο getObjectRepository για να το διαβάσει.
ΣΗΜΕΊΩΣΗ: Ίσως σκεφτείτε γιατί πρέπει να δημιουργήσουμε ένα αποθετήριο αντικειμένων. Η απάντηση βοηθά στη συντήρηση του κώδικα. Για παράδειγμα, χρησιμοποιούμε το κουμπί με όνομα = btnlogin σε 10 διαφορετικές περιπτώσεις δοκιμής. Στο μέλλον, ο προγραμματιστής αποφασίζει να αλλάξει το όνομα από btnlogin για υποβολή. Θα πρέπει να κάνετε μια αλλαγή και στις 10 περιπτώσεις δοκιμής. Στην περίπτωση ενός αποθετηρίου αντικειμένων, θα κάνετε την αλλαγή μόνο μία φορά στο αποθετήριο.
Βήμα 5)
- Το πρόγραμμα οδήγησης θα μεταβιβάσει τα δεδομένα από το Excel & Object Repository στο UIOperaκατηγορίας
- UIOperaΗ κλάση tion έχει λειτουργίες για την εκτέλεση ενεργειών που αντιστοιχούν σε λέξεις-κλειδιά όπως CLICK, SETTEXT κ.λπ… που αναφέρονται στο excel
- 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
ReadGuru99ExcelFile.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; } }
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 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 Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο
Hybrid Driven Framework
Hybrid Driven Framework in Selenium είναι μια έννοια όπου χρησιμοποιούμε το πλεονέκτημα τόσο του πλαισίου που βασίζεται στις λέξεις-κλειδιά όσο και του πλαισίου που βασίζεται σε δεδομένα. Είναι ένα εύχρηστο πλαίσιο που επιτρέπει στους χειροκίνητους δοκιμαστές να δημιουργούν δοκιμαστικές περιπτώσεις κοιτάζοντας απλώς τις λέξεις-κλειδιά, τα δεδομένα δοκιμής και το χώρο αποθήκευσης αντικειμένων χωρίς κωδικοποίηση στο πλαίσιο.
Εδώ για λέξεις-κλειδιά, θα χρησιμοποιήσουμε αρχεία Excel για τη διατήρηση των δοκιμαστικών περιπτώσεων και για τα δεδομένα δοκιμής, μπορούμε να χρησιμοποιήσουμε δεδομένα, πάροχος Testng δομή.
Εδώ στο υβριδικό μας πλαίσιο, δεν χρειάζεται να αλλάξουμε τίποτα στο πλαίσιο που βασίζεται στη λέξη-κλειδί, εδώ πρέπει απλώς να αντικαταστήσουμε το αρχείο 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 WebDriver.
- A Selenium πλαίσιο αυτοματισμού που μπορεί να ταξινομηθεί σε Data Driven, Keyword Driven και Hybrid Frameworks.
- Μπορούμε να επιτύχουμε πλαίσιο που βασίζεται σε δεδομένα χρησιμοποιώντας TestNGτου παρόχου δεδομένων.
- Στο πλαίσιο βασισμένο σε λέξεις-κλειδιά, οι λέξεις-κλειδιά γράφονται σε ορισμένα εξωτερικά αρχεία, όπως το αρχείο excel και ο κώδικας java θα καλέσει αυτό το αρχείο και θα εκτελέσει δοκιμαστικές περιπτώσεις.
- Το υβριδικό πλαίσιο είναι ένας συνδυασμός πλαισίου που βασίζεται σε λέξεις-κλειδιά και πλαίσιο δεδομένων.
Κατεβάστε το Selenium Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο