2 महत्वपूर्ण सेलेनियम डिजाइन पैटर्न और सर्वोत्तम प्रथाओं

इस ट्यूटोरियल में हम सेलेनियम ऑटोमेशन फ्रेमवर्क डेवलपमेंट (सेलेनियम में हाइब्रिड फ्रेमवर्क) के साथ काम करते हुए सेलेनियम डिजाइन पैटर्न और सर्वोत्तम प्रथाओं के बारे में जानेंगे, फ्रेमवर्क डिज़ाइन या फ्रेमवर्क मॉडल की दो विविधताएँ हैं जिन पर हमें विचार करना है, जो हैं: 

हमें यह जानने और समझने की आवश्यकता है कि जब हम सेलेनियम फ्रेमवर्क मॉडल में से एक में अपना ढांचा विकसित कर रहे हैं तो भाषा डिजाइन पैटर्न की आवश्यकता क्यों है। हम पिछले खंडों से गुजरने का सुझाव देंगे सेलेनियम फ्रेमवर्क डेवलपमेंट ट्यूटोरियल सीरीज़ पूरी समझ पाने के लिए।

सेलेनियम डिजाइन पैटर्न और सेलेनियम में सर्वोत्तम प्रथाओं-संकर रूपरेखा
सेलेनियम डिजाइन पैटर्न और सेलेनियम में सर्वोत्तम प्रथाओं-संकर रूपरेखा

आइए इसे विस्तार से समझते हैं: 

सेलेनियम डिजाइन पैटर्न और सर्वोत्तम प्रथाओं -सेलेनियम में संकर रूपरेखा

किसी भी फ्रेमवर्क को डिज़ाइन करते समय, हमें कुछ डिज़ाइन आर्किटेक्चर पर विचार करने की आवश्यकता होती है, जैसे, सेलेनियम डिज़ाइन पैटर्न और सर्वोत्तम अभ्यास, और फ्रेमवर्क मॉडल के प्रकार की आवश्यकता के अनुसार, हमें एक भाषा का चयन करने की आवश्यकता होती है डिज़ाइन पैटर्न समग्र रूप से फ्रेमवर्क डिज़ाइन की समस्या को हल करने के लिए।

इसलिए केवल निष्कर्ष निकालने के लिए, हम चुन सकते हैं और सेलेनियम फ्रेमवर्क मॉडल (हाइब्रिड, पेज ऑब्जेक्ट मॉडल, डेटा ड्रिवेन, आदि), लेकिन मॉडल को लागू करने के लिए, हमें कुछ भाषा डिज़ाइन पैटर्न (जैसे, जावा / सी # डिज़ाइन पैटर्न का पालन करने और लागू करने की आवश्यकता है ) 

सेलेनियम फ्रेमवर्क बनाते समय हमें सेलेनियम डिज़ाइन पैटर्न और सर्वोत्तम प्रथाओं की आवश्यकता क्यों है: 

  • विभिन्न उपकरणों और उपयोगिताओं को विकसित करने के लिए फ्रेमवर्क का स्टैंड डिजाइन स्थापित करना।
  • किसी भी भाषा (जैसे, जावा / सी #, आदि) में कई डिज़ाइन पैटर्न होते हैं, और प्रत्येक डिज़ाइन पैटर्न का अपना पेशेवरों और विपक्ष होता है और इसका मतलब विभिन्न समस्या बयानों को हल करना होता है।
  • टीम के सदस्यों में मानक और मजबूत डिजाइन। 
  • कोड का पुन: उपयोग, संरचित और मानकीकृत तरीके।
  • कोड में स्थिरता और डिबगिंग आसान हो जाती है।

सेलेनियम फ्रेमवर्क में किस डिज़ाइन पैटर्न का उपयोग किया जाना है: 

कुछ डिज़ाइन पैटर्न हैं जिनका उपयोग आप फ्रेमवर्क के विभिन्न क्षेत्रों को लागू करने के लिए कर सकते हैं, जैसे कि एक उदाहरण: 

  • सिंग्लटन डिज़ाइन पैटर्न विन्यास योग्य डेटा को लागू करने के लिए (ऑटोमेशन फ्रेमवर्क जैसे ब्राउज़र का नाम, चलाने के लिए वातावरण, URL, आदि)। 
  • फ़ैक्टरी और अमूर्त फ़ैक्टरी डिज़ाइन पैटर्न (आप इस डिज़ाइन पैटर्न का उपयोग करके विभिन्न ड्राइवर और ब्राउज़र कार्यान्वयन को लागू कर सकते हैं और यह भी कि यदि आप विभिन्न डेटा फीड जैसे एक्सेल, प्रॉपर्टीज़, YAML, डेटाबेस, पीडीऍफ़, इमेज, आदि के साथ काम करना चाहते हैं आदि तो आप भी कारखाने / सार डिजाइन पैटर्न का उपयोग कर सकते हैं)।

हम यहां आने वाली पोस्टों में पूरे फ्रेमवर्क का लाइव कोडिंग टेम्प्लेट करेंगे।

सेलेनियम में हाइब्रिड फ्रेमवर्क के लिए सिंगलटन डिजाइन पैटर्न: 

सिंगलटन डिज़ाइन पैटर्न एक ऐसा पैटर्न है जिसमें आप क्लास से केवल एक ऑब्जेक्ट बना सकते हैं और क्लास के तरीकों तक पहुँचने के लिए उसी ऑब्जेक्ट का उपयोग कर सकते हैं; हम विन्यासकर्ता में डिज़ाइन पैटर्न का उपयोग कर सकते हैं जहां हमें केवल कॉन्फ़िगरेशन डेटा पढ़ने की आवश्यकता होती है और किसी भी डेटा स्टोर में लोड हो सकता है (किसी भी प्रकार की डेटा संरचना जिसे आप किसी भी वर्ग और विधियों से निष्पादन में आवश्यक होने पर उपयोग कर सकते हैं) 

इसलिए हम सिंगलटन डिजाइन पैटर्न के साथ समान डिजाइन करते हुए नीचे दिए तरीके से इसे प्राप्त कर सकते हैं। 

नोट: हम ट्यूटोरियल श्रृंखला के आगामी अनुभाग में खरोंच से रूपरेखा को डिजाइन और विकसित करेंगे, लेकिन यह विशिष्ट ट्यूटोरियल आपको डिजाइन पैटर्न की आवश्यकता के बारे में जानकारी प्रदान करेगा।

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);
     }
    
  }
}

इस दृष्टिकोण से, हम सिंगलटन डिजाइन पैटर्न का उपयोग कर सकते हैं और इसे हमारे ढांचे में उपयोग कर सकते हैं।

सेलेनियम फ्रेमवर्क में फैक्टरी डिजाइन पैटर्न: 

फ़ैक्टरी डिज़ाइन पैटर्न में, हम एक क्लास बनाते हैं (हम इसे फ़ैक्टरी क्लास कहते हैं), और दूसरी ओर, हमारे पास एक है इंटरफ़ेस और अंत में "n" वर्गों की संख्या द्वारा लागू किया गया।

फैक्ट्री क्लास मूल रूप से उपरोक्त वर्गों की वस्तु (आवश्यकता के आधार पर) लौटाता है, इसलिए आपको उपरोक्त से निपटने की आवश्यकता नहीं है "एन" वर्गों की वस्तु की संख्या; इसके बजाय, आप फ़ैक्टरी वर्ग की एक वस्तु बना सकते हैं और फ़ैक्टरी वर्ग की विधि को कॉल कर सकते हैं जो आवश्यक आधारभूत वस्तु को "एन" कक्षाओं के बीच आवश्यक कक्षाओं के लिए लौटाता है।

अब, यह डिज़ाइन आप विभिन्न वेबड्राइवर / ब्राउज़र कार्यान्वयन बनाते समय विचार कर सकते हैं। 

हमारे पास एक अलग ब्राउज़र है और एक अलग प्रकार के सेलेनियम ड्राइवर (जैसे, लोकलड्राइवर, रिमोटड्राइवर, थ्रेडड्राइवर, आदि) के साथ कार्यान्वयन और जब आपको एक विशिष्ट प्रकार के ड्राइवर और विशिष्ट प्रकार के ब्राउज़र की आवश्यकता होती है, तो आप कॉन्फ़िगरेशन फ़ाइल में उल्लेख कर सकते हैं। और आवश्यकता के आधार पर फैक्ट्री क्लास आपको आगे का उपयोग करने के लिए अपनी ऑटोमेशन स्क्रिप्ट के लिए ड्राइवर और ब्राउज़र का उदाहरण प्रदान करेगा। 

ड्राइवर-ब्रॉसर इंटरैक्शन बनाते समय इस डिज़ाइन पैटर्न को लागू करने का कोड आधार यहां दिया गया है: 

अंतरफलक प्रारूप : 

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);

}


"एन" ब्राउज़ कक्षाओं के कार्यान्वयन की संख्या (जो इंटरफ़ेस लागू कर रहे हैं):

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;
       }
   }

यहाँ फैक्टरी क्लास का कार्यान्वयन है, जो संबंधित ब्राउज़र और ड्राइवर क्लास ऑब्जेक्ट प्रदान करता है: 

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;
       }
   }

}

इसी तरह, आप को लागू कर सकते हैं Appium ड्राइवर एक ही डिज़ाइन के साथ, बस कार्यान्वयन प्रदान करते हैं और IDriver इंटरफेस में एक विधि घोषित करते हैं। 

निष्कर्ष: इसके साथ, हम यहां निष्कर्ष दे रहे हैं कि आप सेलेनियम डिजाइन पैटर्न और सर्वोत्तम प्रथाओं को सेलेनियम में हाइब्रिड फ्रेमवर्क विकसित करने के दौरान भाषा डिज़ाइन पैटर्न का उपयोग कैसे कर सकते हैं; ट्यूटोरियल के आगामी सेगमेंट में, हम सेलेनियम ऑटोमेशन के लिए पेज ऑब्जेक्ट मॉडल फ्रेमवर्क का निर्माण करेंगे।

प्राप्त करने के लिए सेलेनियम पर समग्र ट्यूटोरियल, आप यहाँ देख सकते हैं

देबर्घ्य के बारे में

2 महत्वपूर्ण सेलेनियम डिजाइन पैटर्न और सर्वोत्तम प्रथाओंस्वंय देवबर्घ्य रॉय, मैं एक इंजीनियरिंग शाखा हूं, जो 5 कंपनी और एक ओपन सोर्स योगदानकर्ता के साथ काम कर रही है, जिसके पास विभिन्न टेक्नोलॉजी स्टैक में 12 साल का अनुभव / विशेषज्ञता है।
मैंने जावा, सी #, पायथन, ग्रूवी, यूआई ऑटोमेशन (सेलेनियम), मोबाइल ऑटोमेशन (एपियम), एपीआई/बैकएंड ऑटोमेशन, परफॉर्मेंस इंजीनियरिंग (जेएमटर, टिड्डी), सुरक्षा ऑटोमेशन (मोबएसएफ, ओडब्ल्यूएएसपी, काली लिनक्स) जैसी विभिन्न तकनीकों के साथ काम किया है। , एस्ट्रा, जैप आदि), आरपीए, प्रोसेस इंजीनियरिंग ऑटोमेशन, मेनफ्रेम ऑटोमेशन, स्प्रिंगबूट के साथ बैक एंड डेवलपमेंट, काफ्का, रेडिस, रैबिटएमक्यू, ईएलके स्टैक, ग्रेलॉग, जेनकिंस और क्लाउड टेक्नोलॉजीज, देवओप्स आदि में भी अनुभव है।
मैं अपनी पत्नी के साथ बैंगलोर, भारत में रहता हूं और ब्लॉगिंग, संगीत, गिटार बजाने का शौक रखता हूं और मेरे जीवन का दर्शन सभी के लिए शिक्षा है जिसने लैम्ब्डागीक्स को जन्म दिया। आइए लिंक्ड-इन पर कनेक्ट करें - https://www.linkedin.com/in/debarghya-roy/

एक टिप्पणी छोड़ दो

आपका ईमेल पता प्रकाशित नहीं किया जाएगा। आवश्यक फ़ील्ड चिन्हित हैं *

en English
X