2 গুরুত্বপূর্ণ সেলেনিয়াম নকশা নিদর্শন এবং সর্বোত্তম অনুশীলন

এই টিউটোরিয়ালে আমরা সেলেনিয়াম ডিজাইনের নিদর্শন এবং সেলেনিয়াম অটোমেশন ফ্রেমওয়ার্ক ডেভেলপমেন্ট (সেলেনিয়ামে সংকর কাঠামো) নিয়ে কাজ করার সময় সেরা অনুশীলনগুলি সম্পর্কে শিখব, ফ্রেমওয়ার্ক ডিজাইন বা ফ্রেমওয়ার্ক মডেলের দুটি ভিন্নতা যা আমাদের বিবেচনা করতে হবে, সেগুলি: 

  • সেলেনিয়াম ফ্রেমওয়ার্ক মডেল এবং এর ধরণ (আগের অংশে আলোচনা করা হয়েছে )
  • সেলেনিয়াম ডিজাইনের নিদর্শন এবং সেরা অনুশীলনের জন্য ভাষা ডিজাইনের প্যাটার্ন

আমাদের যখন সেলেনিয়াম ফ্রেমওয়ার্ক মডেলটির একটিতে আমাদের কাঠামোটি বিকাশ করা হচ্ছে তখন কেন ভাষা ডিজাইন প্যাটার্ন প্রয়োজন তা আমাদের জানতে এবং বুঝতে হবে। আমরা পূর্ববর্তী বিভাগগুলির মধ্য দিয়ে যেতে পরামর্শ দেব সেলেনিয়াম ফ্রেমওয়ার্ক বিকাশ টিউটোরিয়াল সিরিজ পুরো বোঝা পেতে।

সেলেনিয়াম নকশা নিদর্শন এবং সেলেনিয়াম সেরা অনুশীলন-সংকর কাঠামো
সেলেনিয়াম নকশা নিদর্শন এবং সেলেনিয়াম সেরা অনুশীলন-সংকর কাঠামো

আসুন এটি বিস্তারিতভাবে বুঝতে পারি: 

সেলেনিয়াম নকশা নিদর্শন এবং সেরা অনুশীলন -সেলেনিয়ামে হাইব্রিড কাঠামো

যে কোনও ফ্রেমওয়ার্ক ডিজাইনের সময়, আমাদের কিছু ডিজাইন আর্কিটেকচার, অর্থাৎ সেলেনিয়াম ডিজাইনের নিদর্শন এবং সেরা অনুশীলনগুলি বিবেচনা করা উচিত এবং ফ্রেমওয়ার্ক মডেলের ধরণের প্রয়োজন অনুসারে আমাদের একটি ভাষা নির্বাচন করা দরকার নকশা প্যাটার্ন সামগ্রিকভাবে ফ্রেমওয়ার্ক ডিজাইনের সমস্যা পরিস্থিতি সমাধান করতে।

সুতরাং কেবলমাত্র সিদ্ধান্তে পৌঁছানোর জন্য, আমরা সেলেনিয়াম ফ্রেমওয়ার্ক মডেলটি বেছে নিতে পারি (হাইব্রিড, পেজ অবজেক্ট মডেল, ডেটা ড্রাইভড ইত্যাদি), তবে মডেলটি বাস্তবায়নের জন্য আমাদের কিছু ভাষা নকশা প্যাটার্ন অনুসরণ করতে হবে এবং প্রয়োগ করতে হবে (যেমন, জাভা / সি # ডিজাইনের নিদর্শন) ) 

সেলেনিয়াম ফ্রেমওয়ার্ক তৈরি করার সময় কেন আমাদের সেলেনিয়াম ডিজাইনের প্যাটার্ন এবং সেরা অনুশীলনগুলির প্রয়োজন: 

  • বিভিন্ন সরঞ্জাম এবং ইউটিলিটিগুলি বিকাশের জন্য কাঠামোর স্ট্যান্ড ডিজাইন স্থাপন করা।
  • যে কোনও ভাষার (যেমন, জাভা / সি # ইত্যাদি etc.) একাধিক ডিজাইনের ধরণ রয়েছে এবং প্রতিটি নকশার প্যাটার্নটির নিজস্ব উপকারিতা এবং কনস রয়েছে এবং এটি বিভিন্ন সমস্যার বিবৃতি সমাধান করার জন্য বোঝানো হয়।
  • দলের সদস্যদের জুড়ে স্ট্যান্ডার্ড এবং শক্তিশালী নকশা। 
  • কোড পুনর্ব্যবহার, কাঠামোগত এবং মানিক পদ্ধতিতে।
  • কোড রক্ষণাবেক্ষণ এবং ডিবাগিং সহজ হয়ে যায়।

সেলেনিয়াম ফ্রেমওয়ার্কে কী নকশার নিদর্শনগুলি ব্যবহার করা উচিত: 

ফ্রেমওয়ার্কের বিভিন্ন ক্ষেত্রগুলি প্রয়োগ করতে আপনি কয়েকটি নকশার প্যাটার্ন ব্যবহার করতে পারেন, যেমন একটি উদাহরণ: 

  • কনফিগারযোগ্য ডেটা বাস্তবায়নের জন্য সিঙ্গলটন ডিজাইনের প্যাটার্ন (অটোমেশন কাঠামোর জন্য যেমন ব্রাউজারের নাম, চালানোর পরিবেশ, URL, ইত্যাদি)। 
  • কারখানা এবং বিমূর্ত ফ্যাক্টরি ডিজাইনের প্যাটার্ন (আপনি এই ডিজাইনের প্যাটার্নটি ব্যবহার করে বিভিন্ন একাধিক ড্রাইভার এবং ব্রাউজার বাস্তবায়ন বাস্তবায়ন করতে পারেন এবং এছাড়াও যদি আপনি বিভিন্ন ডেটা ফিড যেমন এক্সেল, বৈশিষ্ট্য, ওয়াইএএমএল, ডাটাবেস, পিডিএফ, চিত্র, ইত্যাদি। তবে আপনি কারখানা / বিমূর্ত নকশার প্যাটার্নটি ব্যবহার করতে পারেন)।

আমরা আসন্ন পোস্টগুলিতে পুরো ফ্রেমওয়ার্কের লাইভ কোডিং টেম্পলেটটি করব।

সেলেনিয়ামে হাইব্রিড কাঠামোর জন্য একক ডিজাইন প্যাটার্ন: 

সিঙ্গলটন ডিজাইন প্যাটার্ন এমন একটি প্যাটার্ন যা আপনি ক্লাস থেকে কেবল একটি অবজেক্ট তৈরি করতে এবং ক্লাসের পদ্ধতিগুলি অ্যাক্সেস করতে একই জিনিস ব্যবহার করতে পারবেন; আমরা কনফিগারারে নকশার প্যাটার্নটি ব্যবহার করতে পারি যেখানে আমাদের কেবলমাত্র কনফিগারেশন ডেটা পড়তে হবে এবং কিছু ডেটা স্টোর (কোনও ধরণের ডেটা স্ট্রাকচার যা কোনও শ্রেণি এবং পদ্ধতি থেকে কার্যকর করার সময় আপনি প্রয়োজন হিসাবে ব্যবহার করতে পারেন) এ লোড করতে পারি) 

সুতরাং আমরা সিঙ্গেলন ডিজাইন প্যাটার্নের সাথে একই ডিজাইনের সময় নীচের পদ্ধতিতে একই অর্জন করতে পারি। 

দ্রষ্টব্য: আমরা টিউটোরিয়াল সিরিজের আসন্ন বিভাগে স্ক্র্যাচ থেকে ফ্রেমওয়ার্কটি ডিজাইন করব এবং বিকাশ করব, তবে এই নির্দিষ্ট টিউটোরিয়ালটি আপনাকে নকশার প্যাটার্নটির প্রয়োজনীয়তার অন্তর্দৃষ্টি প্রদান করবে।

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

এই পদ্ধতির দ্বারা, আমরা সিঙ্গলটন ডিজাইন প্যাটার্নটি ব্যবহার করতে এবং এটি আমাদের কাঠামোর মধ্যে ব্যবহার করতে পারি।

সেলেনিয়াম ফ্রেমওয়ার্কে কারখানার নকশার প্যাটার্ন: 

কারখানার নকশার ধরণে আমরা একটি শ্রেণি তৈরি করি (আমরা একে ফ্যাক্টরি শ্রেণি বলি) এবং অন্যদিকে আমাদের একটি ইন্টারফেস এবং অবশেষে ক্লাস সংখ্যা "এন" দ্বারা প্রয়োগ করা।

কারখানার শ্রেণিটি মূলত উপরের শ্রেণীর অবজেক্টকে (প্রয়োজনীয়তার উপর নির্ভর করে) প্রদান করে, সুতরাং আপনাকে উপরের জিনিসগুলি মোকাবেলা করতে হবে না "এন" শ্রেণীর সংখ্যা 'অবজেক্ট; পরিবর্তে, আপনি কারখানা শ্রেণীর একটি অবজেক্ট তৈরি করতে পারেন এবং কারখানার শ্রেণির পদ্ধতিটি কল করতে পারেন যা অ্যাডোব "এন" শ্রেণীর মধ্যে প্রয়োজনীয় ক্লাসগুলির জন্য প্রয়োজনীয় বেসলাইন অবজেক্টটি প্রদান করে।

এখন, বিভিন্ন ওয়েবড্রাইভার / ব্রাউজার বাস্তবায়ন তৈরি করার সময় আপনি এই নকশাটি বিবেচনা করতে পারেন। 

আমাদের একটি বিভিন্ন ব্রাউজার এবং বিভিন্ন ধরণের সেলেনিয়াম ড্রাইভার (যেমন, লোকালড্রাইভার, রিমোটড্রাইভার, থ্রেডড্রাইভার ইত্যাদি) সহ বাস্তবায়ন রয়েছে এবং যখন আপনার নির্দিষ্ট ধরণের ড্রাইভার এবং নির্দিষ্ট ধরণের ব্রাউজারের প্রয়োজন হয় আপনি কনফিগারেশন ফাইলটিতে উল্লেখ করতে পারেন এবং প্রয়োজনের ভিত্তিতে কারখানা শ্রেণি আপনাকে আরও অটোমেশন স্ক্রিপ্টের জন্য ড্রাইভার এবং ব্রাউজারের উদাহরণ সরবরাহ করবে। 

ড্রাইভার-ব্রাউজার ইন্টারঅ্যাকশন তৈরি করার সময় এই নকশা প্যাটার্নটি বাস্তবায়নের জন্য কোড বেসটি এখানে রয়েছে: 

ইন্টারফেস ডিজাইন: 

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

}

তেমনি, আপনি প্রয়োগ করতে পারেন অ্যাপিয়াম একই নকশা সহ চালক, কেবল বাস্তবায়ন সরবরাহ করুন এবং আইড্রাইভার ইন্টারফেসে একটি পদ্ধতি ঘোষণা করুন। 

উপসংহার: এর সাথে আমরা এখানে উপসংহারে পৌঁছেছি যে সেলেনিয়ামে হাইব্রিড কাঠামোটি বিকাশের সময় আপনি কীভাবে সেলেনিয়াম ডিজাইন নিদর্শন এবং সেরা অনুশীলনের অংশ হিসাবে ভাষা ডিজাইন নিদর্শনগুলি ব্যবহার করতে পারেন; টিউটোরিয়ালের আসন্ন বিভাগগুলিতে, আমরা সেলেনিয়াম অটোমেশনের জন্য পৃষ্ঠা অবজেক্ট মডেল কাঠামোটি তৈরি করব।

পেতে সেলেনিয়াম সামগ্রিক টিউটোরিয়াল, আপনি এখানে দেখতে পারেন

দেবরঘ্যা সম্পর্কে

মাইয়েস্ দেবারঘ্যা রায়, আমি একটি ইঞ্জিনিয়ারিং আর্কিট্যাক্ট ফরচুনি 5 সংস্থার সাথে কাজ করছি এবং ওপেন সোর্স অবদানকারী, বিভিন্ন প্রযুক্তি স্ট্যাকের প্রায় 12 বছরের অভিজ্ঞতা / দক্ষতা অর্জন করছি।
আমি বিভিন্ন প্রযুক্তি যেমন জাভা, সি #, পাইথন, গ্রোভি, ইউআই অটোমেশন (সেলেনিয়াম), মোবাইল অটোমেশন (অ্যাপিয়াম), এপিআই / ব্যাকএন্ড অটোমেশন, পারফরম্যান্স ইঞ্জিনিয়ারিং (জেমেটার, পঙ্গপাল), সুরক্ষা অটোমেশন (মোবিএসএফ, ওউএএসপি, কালি লিনাক্স) এর সাথে কাজ করেছি , অ্যাস্ট্রা, জ্যাপ ইত্যাদি), আরপিএ, প্রসেস ইঞ্জিনিয়ারিং অটোমেশন, মেনফ্রেম অটোমেশন, স্প্রিংবুট, কাফকা, রেডিস, রবিটএমকিউ, ইএলকে স্ট্যাক, গ্রেলোগ, জেনকিন্স সহ ক্লাউড টেকনোলজিস, ডিভোপস ইত্যাদির অভিজ্ঞতা রয়েছে Back
আমি আমার স্ত্রীর সাথে ভারতের বেঙ্গালুরুতে থাকি এবং ব্লগিং, সংগীত, গিটার বাজানো এবং আমার জীবনদর্শন দর্শনের প্রতি অনুরাগ রয়েছে যা ল্যাম্বডিজিক্সের জন্ম দিয়েছিল সবার জন্য শিক্ষা। লিংকড-ইনগুলির সাথে সংযুক্ত হতে দেয় - https://www.linkedin.com/in/debarghya-roy/

মতামত দিন

আপনার ইমেইল প্রকাশ করা হবে না। প্রয়োজনীয় ক্ষেত্রগুলি * চিহ্নিত করা আছে।

লাম্বদা গিক্স