2 Σημαντικά σχέδια και βέλτιστες πρακτικές σεληνίου

Σε αυτό το σεμινάριο θα μάθουμε για τα σχέδια σχεδίασης και τις βέλτιστες πρακτικές του Σεληνίου ενώ συνεργαζόμαστε με την ανάπτυξη πλαισίου Αυτοματισμού Selenium (υβριδικό πλαίσιο στο σελήνιο), υπάρχουν δύο παραλλαγές του σχεδιασμού πλαισίου ή του μοντέλου πλαισίου που πρέπει να λάβουμε υπόψη, οι οποίες είναι: 

Πρέπει να γνωρίζουμε και να καταλάβουμε γιατί το μοτίβο σχεδιασμού γλώσσας απαιτείται όταν αναπτύσσουμε το πλαίσιο μας σε ένα από τα μοντέλα πλαισίου Selenium. Θα προτείνουμε να διαβάσετε τα προηγούμενα τμήματα του Σειρά φροντιστηρίων ανάπτυξης Selenium Framework για να πάρετε όλη την κατανόηση.

Σχέδια σχεδιασμού σεληνίου και βέλτιστες πρακτικές-υβριδικό πλαίσιο στο σελήνιο
Σχέδια σχεδιασμού σεληνίου και βέλτιστες πρακτικές-υβριδικό πλαίσιο στο σελήνιο

Ας το καταλάβουμε λεπτομερώς: 

σχέδια σχεδιασμού σεληνίου και βέλτιστες πρακτικές -υβριδικό πλαίσιο σεληνίου

Κατά τη σχεδίαση οποιουδήποτε Πλαισίου, πρέπει να εξετάσουμε κάποια αρχιτεκτονική σχεδίασης, δηλαδή σχέδια σεληνίου και βέλτιστες πρακτικές, και σύμφωνα με την ανάγκη του τύπου του μοντέλου πλαισίου, πρέπει να επιλέξουμε μια Γλώσσα Σχέδιο για την επίλυση της προβληματικής κατάστασης του σχεδιασμού πλαισίου στο σύνολό του.

Ως εκ τούτου, για να ολοκληρώσουμε, μπορούμε να επιλέξουμε και μοντέλο πλαισίου Selenium (Υβριδικό, Μοντέλο αντικειμένου σελίδας, βάσει δεδομένων, κ.λπ.), αλλά για να εφαρμόσουμε το μοντέλο, πρέπει να ακολουθήσουμε και να εφαρμόσουμε κάποιο μοτίβο σχεδίασης γλωσσών (π.χ. μοτίβα σχεδίασης java / C # ) 

Γιατί χρειαζόμαστε σχέδιο σεληνίου Σχέδιο και βέλτιστες πρακτικές κατά την κατασκευή του Selenium Framework: 

  • Να καθιερωθεί ο σχεδιασμός του πλαισίου για την ανάπτυξη διαφορετικών εργαλείων και βοηθητικών προγραμμάτων.
  • Οποιαδήποτε γλώσσα (π.χ. Java / C #, κ.λπ.) έχει πολλά μοτίβα σχεδίασης και κάθε μοτίβο σχεδίασης έχει τα δικά του πλεονεκτήματα και μειονεκτήματα και προορίζεται για την επίλυση διαφορετικών δηλώσεων προβλημάτων.
  • Τυπική και στιβαρή σχεδίαση μεταξύ των μελών της ομάδας. 
  • Επαναχρησιμοποίηση κώδικα, δομημένος και τυποποιημένος τρόπος.
  • Η συντήρηση κώδικα και ο εντοπισμός σφαλμάτων γίνονται ευκολότερα.

Ποια σχέδια σχεδίασης θα χρησιμοποιηθούν στο Selenium Framework: 

Υπάρχουν μερικά μοτίβα σχεδίασης που θα μπορούσατε να χρησιμοποιήσετε για να εφαρμόσετε διαφορετικές περιοχές του πλαισίου, όπως ένα παράδειγμα: 

  • Σχέδιο Singleton Design για την εφαρμογή των διαμορφώσιμων δεδομένων (για το πλαίσιο αυτοματισμού όπως όνομα προγράμματος περιήγησης, περιβάλλον για εκτέλεση, διεύθυνση URL κ.λπ.). 
  • Εργοστάσιο και αφηρημένο εργοστασιακό μοτίβο σχεδίασης (Θα μπορούσατε να εφαρμόσετε τα διάφορα προγράμματα οδήγησης και την εφαρμογή προγράμματος περιήγησης χρησιμοποιώντας αυτό το μοτίβο σχεδίασης και επίσης εάν θέλετε να αναπτύξετε τη δυνατότητα εργασίας με διάφορες ροές δεδομένων, όπως excel, properties, YAML, βάση δεδομένων, pdf, εικόνα, κ.λπ. τότε θα μπορούσατε επίσης να χρησιμοποιήσετε το εργοστασιακό / αφηρημένο σχέδιο σχεδίασης).

Θα κάνουμε το ζωντανό πρότυπο κωδικοποίησης ολόκληρου του Framework στις επερχόμενες δημοσιεύσεις εδώ.

Σχέδιο Singleton Design για υβριδικό πλαίσιο στο Σελήνιο: 

Το Singleton Design Pattern είναι ένα μοτίβο στο οποίο θα μπορούσατε να δημιουργήσετε μόνο ένα αντικείμενο από μια τάξη και να χρησιμοποιήσετε το ίδιο αντικείμενο για να αποκτήσετε πρόσβαση στις μεθόδους της τάξης. θα μπορούσαμε να χρησιμοποιήσουμε το μοτίβο σχεδίασης στο πρόγραμμα διαμόρφωσης όπου χρειάζεται μόνο να διαβάσουμε τα δεδομένα διαμόρφωσης και να φορτώσουμε σε κάποια αποθήκευση δεδομένων (κάθε είδους δομή δεδομένων που θα μπορούσατε να χρησιμοποιήσετε όπως και όταν απαιτείται κατά την εκτέλεση από οποιεσδήποτε κλάσεις και μεθόδους) 

Έτσι θα μπορούσαμε να επιτύχουμε το ίδιο με τον παρακάτω τρόπο, ενώ σχεδιάζουμε το ίδιο με το σχέδιο Singleton Design. 

ΣΗΜΕΙΩΣΗ: Θα σχεδιάσουμε και θα αναπτύξουμε το πλαίσιο από το μηδέν στην επόμενη ενότητα της σειράς σεμιναρίων, αλλά αυτό το συγκεκριμένο σεμινάριο θα σας δώσει πληροφορίες για την αναγκαιότητα του σχεδιαστικού σχεδίου.

package com.cyborg.core.generic.dataUtils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Properties;
import java.util.Set;

import org.apache.log4j.PropertyConfigurator;


// This is the SingleTon Class 
public class PropertiesDataUtils {

   private Properties properties = null;
   public static LinkedHashMap<String, String> configDataStore = new LinkedHashMap<String, String>();
   InputStream is = null;

// This is the static and private reference of the class which you could use anywhere in you framework 
   private static PropertiesDataUtils propertiesDataUtils = null;
   boolean centralizeLog  = false;


// This is the Private constructor to create the object but you can not access this from outside the class to maintain the design of the SingleTon pattern ie only one object creation .

   private PropertiesDataUtils(String filePath) {
       generateDataStore(filePath);
       centralizeLog =  Boolean.parseBoolean(PropertiesDataUtils.configDataStore.get("centralizedLog"));
       if(centralizeLog)
           PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_central.properties");
         else
            PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_local.properties");
   }

   private PropertiesDataUtils() {

   }
  
 
// This method basically create the instance of the SingleTon class 

   public static PropertiesDataUtils getInstance(String filePath) {
       if (propertiesDataUtils == null)
           propertiesDataUtils = new PropertiesDataUtils(filePath);
       return propertiesDataUtils;
   }


// this method basically creates the datastore where you want to store all the config data as discussed previously 

   private void generateDataStore(String filePath) {
       try {
           this.properties = new Properties();
           is=new FileInputStream(filePath);
           properties.load(is);
           overrideFromEnvironment();
           Set<Object> keys = loadAllKeys();
           for (Object k : keys) {
               String key = (String) k;
               configDataStore.put(key, getPropertyValue(key));
           }

       } catch (FileNotFoundException fileNotFoundException) {
           String exceptionData = String.valueOf(fileNotFoundException.getCause().getMessage());

       } catch (IOException ioException) {
           String exceptionData = String.valueOf(ioException.getCause().getMessage());
       } finally {
           if (null != is) {
               try {
                   is.close();
               } catch (Exception e) {
                   String exceptionData = String.valueOf(e.getCause().getMessage());

               }
           }

       }
   }


// This method is used to load all the keys from the properties file.

   private Set<Object> loadAllKeys() {
       Set<Object> keys = this.properties.keySet();
       return keys;
   }

   private String getPropertyValue(String key) {
       return this.properties.getProperty(key);
   }
   private void setPropertyValue(String key,String value) {
        this.properties.setProperty(key,value);
   }
  
  private void overrideFromEnvironment() {

     if (this.properties.getProperty("run_on_jenkins").equals("true")) {
        System.out.println("SET run_on_jenkins FLAG TO FALSE IN YOUR PROPERTIES FILE TO RUN LOCALLY....");
        String build_number = System.getenv("BUILD_NUMBER");
        this.properties.setProperty("build_number", build_number);
     }
    
  }
}

Με αυτήν την προσέγγιση, θα μπορούσαμε να χρησιμοποιήσουμε το σχέδιο σχεδίασης Singleton και να το χρησιμοποιήσουμε στο πλαίσιο μας.

Εργοστάσιο σχεδίασης στο σελήνιο πλαίσιο: 

Στο εργοστασιακό σχέδιο, δημιουργούμε μια τάξη (την ονομάζουμε εργοστασιακή κλάση) και από την άλλη έχουμε μια διεπαφή και τελικά υλοποιήθηκε από τον αριθμό κλάσεων «n».

Η εργοστασιακή κλάση επιστρέφει βασικά το αντικείμενο των παραπάνω τάξεων (ανάλογα με την ανάγκη), οπότε δεν χρειάζεται να ασχοληθείτε με τα παραπάνω "N" αριθμός αντικειμένων κλάσεων. Αντίθετα, μπορείτε να δημιουργήσετε ένα αντικείμενο της κλάσης Εργοστάσιο και να καλέσετε τη μέθοδο της κλάσης του εργοστασίου που επιστρέφει το απαιτούμενο βασικό αντικείμενο για τις απαιτούμενες κλάσεις μεταξύ των τάξεων adobe "n"

Τώρα, αυτό το σχέδιο μπορείτε να σκεφτείτε κατά τη δημιουργία της διαφορετικής εφαρμογής Webdriver / browser. 

Έχουμε ένα διαφορετικό πρόγραμμα περιήγησης και την εφαρμογή με διαφορετικό τύπο προγράμματος οδήγησης Selenium (π.χ. LocalDriver, RemoteDriver, ThreadDriver κ.λπ.) και όπως και όταν χρειάζεστε έναν συγκεκριμένο τύπο προγράμματος οδήγησης και έναν συγκεκριμένο τύπο προγράμματος περιήγησης που μπορείτε να αναφέρετε στο αρχείο διαμόρφωσης και με βάση την ανάγκη, η εργοστασιακή κλάση θα σας παρέχει την παρουσία του προγράμματος οδήγησης και του προγράμματος περιήγησης ώστε το σενάριο αυτοματοποίησης να χρησιμοποιηθεί περαιτέρω. 

Εδώ είναι η βάση κώδικα για την εφαρμογή αυτού του μοτίβου σχεδίασης κατά τη δημιουργία αλληλεπιδράσεων προγράμματος οδήγησης-προγράμματος περιήγησης: 

Σχεδιασμός διασύνδεσης: 

package com.cyborg.core.web.utils.driverUtils;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.RemoteWebDriver;



public interface IDriver {
   public WebDriver init(String browserName);

}


"N" αριθμός εφαρμογής κλάσεων περιήγησης (που εφαρμόζουν τη διεπαφή):

package com.cyborg.core.web.utils.driverUtils;


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;


import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.safari.SafariDriver;

public class LocalDriver implements IDriver {
   public WebDriver init(String browserName) {


       String pathToDriver = getDriverPath(browserName);

       if (null != browserName) {

           switch (browserName) {
               case "chrome":
                   System.setProperty("webdriver.chrome.driver",
                           pathToDriver);
                   return new ChromeDriver();
               case "firefox":
                   System.setProperty("webdriver.gecko.driver", pathToDriver);
                   return new FirefoxDriver();

               default:
                   System.setProperty("webdriver.chrome.driver", pathToDriver);
                   return new ChromeDriver();
           }
       } else {
           System.setProperty("webdriver.chrome.driver",
                   pathToDriver);
           return new ChromeDriver();
       }
   }



   private String getDriverPath(String browserName) {

       String osData = System.getProperty("os.name").toLowerCase().split("\\s")[0];
       if (null != osData) {
           if (osData.equalsIgnoreCase("mac")) {
               return "./DriversExe/" + osData + "_" + browserName;

           } else if (osData.contains("nux") || (osData.contains("nix"))) {
               return "./DriversExe/linux_" + browserName;
           } else if (osData.contains("win")) {
               return "./DriversExe/" + osData + "_" + browserName + ".exe";
           }
       }
       return null;
   }
}

Εδώ είναι η εφαρμογή της κλάσης Απομακρυσμένου προγράμματος οδήγησης: 

package com.cyborg.core.web.utils.driverUtils;


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import com.cyborg.core.generic.dataUtils.PropertiesDataUtils;


import java.net.MalformedURLException;
import java.net.URL;

public class RemoteDriver implements IDriver {

   DesiredCapabilities caps;
   String remoteHuburl=PropertiesDataUtils.configDataStore.get("WEB_GRID_IP");

   @Override
   public WebDriver init(String browserName) {

       if (browserName != null) {

           switch (browserName) {
               case "firefox":
                   try {
                       return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox());
                   } catch (MalformedURLException malformedUrlEx) {

                       malformedUrlEx.getCause().getMessage();
                       malformedUrlEx.printStackTrace();
                   }
               case "chrome":
                   try {
                       return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome());
                   } catch (MalformedURLException malformedUrlEx) {

                       malformedUrlEx.getCause().getMessage();
                       malformedUrlEx.printStackTrace();
                   }
               case "ie":
                   try {
                       return new RemoteWebDriver(new URL(remoteHuburl), caps.internetExplorer());
                   } catch (MalformedURLException malformedUrlEx) {

                       malformedUrlEx.getCause().getMessage();
                       malformedUrlEx.printStackTrace();

                   }
               default:
                   try {
                       return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome());
                   } catch (MalformedURLException malformedUrlEx) {

                       malformedUrlEx.getCause().getMessage();
                       malformedUrlEx.printStackTrace();
                   }
           }
           return null;
       } else {
           return null;
       }
   }

Εδώ είναι η εφαρμογή της κλάσης Factory, η οποία παρέχει το αντίστοιχο αντικείμενο κλάσης προγράμματος περιήγησης και προγράμματος οδήγησης: 

package com.cyborg.core.web.utils.driverUtils;



public class DriverProvider {

   public IDriver getDriver(String typeOfDriver) {


       if (typeOfDriver != null) {
           switch (typeOfDriver) {
               case "local":
                   return new LocalDriver();
               case "remote":
                   return new RemoteDriver();
              
               default:
                   return new LocalDriver();
           }
       } else {
           return null;
       }
   }

}

Ομοίως, μπορείτε να εφαρμόσετε το Όπιο πρόγραμμα οδήγησης μαζί με τον ίδιο σχεδιασμό, απλώς παρέχετε την εφαρμογή και δηλώστε μια μέθοδο στις διεπαφές IDriver. 

Συμπέρασμα: Με αυτό, καταλήγουμε εδώ πώς μπορείτε να χρησιμοποιήσετε μοτίβα σχεδιασμού γλώσσας ως μέρος των προτύπων σχεδιασμού και των βέλτιστων πρακτικών του Σεληνίου, ενώ αναπτύσσετε το υβριδικό πλαίσιο στο Σελήνιο. Στα επόμενα τμήματα του σεμιναρίου, θα δημιουργήσουμε το πλαίσιο μοντέλου Page Object για Selenium Automation.

Για να πάρετε το Συνολικό σεμινάριο για το Σελήνιο, μπορείτε να επισκεφθείτε εδώ

Σχετικά με την Debarghya

Myself Debarghya Roy, είμαι ένας μηχανικός ARCHITECT που συνεργάζεται με την εταιρεία Fortune 5 και έναν συνεισφέροντα ανοιχτού κώδικα, έχοντας περίπου 12 χρόνια εμπειρίας / εμπειρίας σε διάφορες τεχνολογίες.
Έχω εργαστεί με διάφορες τεχνολογίες, όπως Java, C #, Python, Groovy, UI Automation (Selenium), Mobile Automation (Appium), API / Backend Automation, Performance Engineering (JMeter, Locust), Security Automation (MobSF, OwAsp, Kali Linux) , Astra, ZAP κ.λπ.), RPA, Αυτοματισμός Μηχανικής Διαδικασίας, Αυτοματισμός Mainframe, Ανάπτυξη Back End με SpringBoot, Kafka, Redis, RabitMQ, ELK stack, GrayLog, Jenkins και επίσης έχοντας εμπειρία σε Cloud Technologies, DevOps κ.λπ.
Ζω στο Μπανγκαλόρ της Ινδίας με τη γυναίκα μου και έχω πάθος για το Blogging, τη μουσική, την κιθάρα και η Φιλοσοφία της ζωής μου είναι η Εκπαίδευση για Όλους που γέννησε το LambdaGeeks. Ας συνδεθούμε μέσω συνδέσμου - https://www.linkedin.com/in/debarghya-roy/

Αφήστε ένα σχόλιο

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται *

Lambda Geeks