সম্পূর্ণ পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক -2021

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

আমরা সব নিয়ে আলোচনা করেছিলাম পৃষ্ঠা অবজেক্ট মডেল সহ সেলেনিয়ামে কাঠামোর ধরণ , এখানে আমরা গভীরতার মধ্য দিয়ে যেতে হবে।

পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক
পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক ডেভেলপমেন্ট

আমরা নীচের বৈশিষ্ট্যগুলি ডিজাইন এবং বিকাশ করব।

সেলেনিয়ামে পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক ডিজাইন কী  

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

ধরা যাক আপনার একটি জিমেইল অ্যাপ্লিকেশন রয়েছে যা আপনি স্বয়ংক্রিয় করবেন; অতএব জিমেইল লগইন পৃষ্ঠাতে সেখানে আপনার কয়েকটি প্রধান কার্যকারিতা রয়েছে যেমন লগইন, অ্যাকাউন্ট তৈরি করা ইত্যাদি

এখানে আমরা GmailLoginPage হিসাবে একটি জাভা ক্লাস তৈরি করব, এবং আমরা পারফরমেশনলগিন (), ক্রয় ইউজারঅ্যাকউন্ট, ইত্যাদি নামে পদ্ধতিগুলি লিখব 

ধরা যাক আপনি একবার আপনার জিমেইল অ্যাকাউন্টে লগ ইন করার পরে আপনার অনেকগুলি বৈশিষ্ট্য রয়েছে যেমন ইনবক্স, প্রেরিত আইটেম, ট্র্যাশ ইত্যাদি Now এখন প্রতিটি মডিউলের জন্য আপনি একটি জাভা ক্লাস তৈরি করেন এবং জাভা পদ্ধতিতে জাভা পদ্ধতি হিসাবে তাদের কার্যকারিতা রাখেন keep 

পৃষ্ঠা অবজেক্ট মডেল কেন

পৃষ্ঠা অবজেক্ট মডেল একটি খুব দৃust় এবং উন্নত ফ্রেমওয়ার্ক ডিজাইন মডেল যেখানে আপনি নীচের ক্ষেত্রগুলির যত্ন নিতে পারেন: 

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

হাইব্রিড পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক কাঠামো

মধ্যে পূর্ববর্তী টিউটোরিয়াল, আমরা সংকর পৃষ্ঠা অবজেক্ট মডেল বুঝতে পেরেছি, এবং এখন আমরা একটি কাঠামো ডিজাইন করব এবং বিকাশ করব।

পৃষ্ঠা অবজেক্ট মডেল কাঠামোর আর্কিটেকচার

আমরা কেবল একটি মভেন প্রজেক্ট তৈরি করতে পারি এবং প্রাথমিকভাবে ফ্রেমওয়ার্কের জন্য প্রয়োজনীয় POM.xML ফাইলের মধ্যে নির্ভরতাগুলি অন্তর্ভুক্ত করতে পারি যা এটির মতো দেখাচ্ছে: 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>demo</groupId>
	<artifactId>DemoAutomation</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>DemoAutomation</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.0</version>
				<configuration>
					<source>7</source>
					<target>7</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.4.2</version>
				<configuration>
					<suiteXmlFiles>
						<suiteXmlFile>testNg.xml</suiteXmlFile>
					</suiteXmlFiles>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<reporting>
		<plugins>
			<plugin>
				<groupId>org.reportyng</groupId>
				<artifactId>reporty-ng</artifactId>
				<version>1.2</version>
				<configuration>
				    <outputdir>/target/testng-xslt-report</outputdir>
				    <sorttestcaselinks>true</sorttestcaselinks>
			            <testdetailsfilter>FAIL,SKIP,PASS,CONF,BY_CLASS</testdetailsfilter>
				    <showruntimetotals>true</showruntimetotals>
				</configuration>
			</plugin>
		</plugins>
	</reporting>
	<dependencies>
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-server</artifactId>
			<version>2.53.0</version>
		</dependency>
		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>6.8.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.8</version>
		</dependency>

		<dependency>
			<groupId>com.googlecode.json-simple</groupId>
			<artifactId>json-simple</artifactId>
			<version>1.1</version>
		</dependency>

		<dependency>
			<groupId>net.sourceforge.jexcelapi</groupId>
			<artifactId>jxl</artifactId>
			<version>2.6</version>
		</dependency>
	</dependencies>
</project>

এর পরে, আমরা ছোট মডিউল এবং ইউটিলিটিগুলি তৈরি করব, যেখানে আমরা কেবলমাত্র উচ্চ-স্তরের অন্তর্দৃষ্টি / দৃশ্য সরবরাহ করতে নীচে এই স্ন্যাপশটটি সংযুক্ত করেছি। আমরা একের পর এক ইউটিলিটি তৈরি করব। 

সেলেনিয়াম পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক কাঠামো

নীচের মডিউলগুলি এখানে আমরা বিকাশ করব; আমরা এর জন্য কোড স্নিপেট সরবরাহ করেছি: 

ড্রাইভারউইটিস - পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক

এই মডিউলটি বিভিন্ন ব্রাউজারগুলিতে (ক্রোম, ফায়ারফক্স, ইত্যাদির) সাথে কাজ করার জন্য সমস্ত ইউটিলিটি এবং সহায়তা সরবরাহ করে This এই ইউটিলিটিটি কারখানার নকশা প্যাটার্নের উপর ভিত্তি করে তৈরি করা হয়েছে, যেমনটি আমরা এখানে পূর্ববর্তী টিউটোরিয়ালে আলোচনা করেছি।

package com.base.driverUtils;

import org.openqa.selenium.WebDriver;

public interface IDriver {

  public WebDriver init(String browserName);
}

লোকালড্রাইভার বাস্তবায়ন, যা স্থানীয়ভাবে সেলেনিয়াম ওয়েবড্রাইভারের সাথে সম্পাদন করবে:

package com.base.driverUtils;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class LocalDriver implements IDriver {

  public WebDriver init(String browserName) {
     switch (browserName) {
     case "firefox":
        return new FirefoxDriver();

     case "chrome":
        System.setProperty("webdriver.chrome.driver",
              "..\\DummyAutomation\\DriverExe\\chromedriver.exe");
        return new ChromeDriver();

     case "ie":
        System.setProperty("webdriver.ie.driver",
              "..\\DummyAutomation\\DriverExe\\IEDriverServer.exe");
        return new InternetExplorerDriver();
     default:
        return new FirefoxDriver();
     }
  }

}

রিমোট ওয়েবড্রাইভার: রিমোট ওয়েবড্রাইভার (যেমন সেলেনিয়াম গ্রিড) এর সাথে কাজ করার জন্য আপনার ব্রাউজার ড্রাইভারের একটি রিমোট রেফারেন্স প্রয়োজন, যা এর মতো হয়: 

package com.base.driverUtils;

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

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

public class RemoteDriver implements IDriver {

  DesiredCapabilities caps;
  String remoteHuburl;

  @Override
  public WebDriver init(String browserName) {
     switch (browserName) {
     case "firefox":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox());
        } catch (MalformedURLException e2) {
           // TODO Auto-generated catch block
           e2.printStackTrace();
        }
     case "chrome":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.chrome());
        } catch (MalformedURLException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
        }
     case "ie":
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.internetExplorer());
        } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
     default:
        try {
           return new RemoteWebDriver(new URL(remoteHuburl), caps.firefox());
        } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
     }
     return null;
  }
 

}

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

package com.base.driverUtils;

public class DriverProvider {

  public IDriver getDriver(String typeOfDriverExecution){
     switch(typeOfDriverExecution){
     case "local":
        return new LocalDriver();
     case "remote":
        return new RemoteDriver();
     default :
        return new LocalDriver();
     }
  }
}

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

এখানে খুব বেসিক কনফিগারেশন ফাইল রয়েছে; আপনি একটি বৈশিষ্ট্য ফাইল তৈরি করতে পারেন এবং এর মতো মান সংরক্ষণ করতে পারেন: 

modeOfExecution=local
browser=chrome
url=http://www.applicationUrl.com/

ডেটা ইউটিলেস-পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক: 

ড্রাইভার ব্রাউজারের মডিউলগুলি প্রয়োগ করে আমরা যেমনটি তৈরি করেছি তেমন ফ্যাক্টরি ডিজাইনের প্যাটার্ন হিসাবে আমরা ডেটা ইউটিলিটিগুলি এখানে ডিজাইন করেছি।

এটির জন্য এখানে নীচের কোড স্নিপেট; ফ্রেমওয়ার্কে, আমরা এক্সেল ব্যবহারগুলি এবং বৈশিষ্ট্যগুলির ব্যবহারগুলি দেখিয়েছি, আপনি YAML, পিডিএফ ইত্যাদির মতো অন্যান্য ডেটা ইউটিলিটিগুলিকে সমর্থন করতে আরও বাড়িয়ে তুলতে পারেন .: 

The Olymp Trade প্লার্টফর্মে ৩ টি উপায়ে প্রবেশ করা যায়। প্রথমত রয়েছে ওয়েব ভার্শন যাতে আপনি প্রধান ওয়েবসাইটের মাধ্যমে প্রবেশ করতে পারবেন। দ্বিতয়ত রয়েছে, উইন্ডোজ এবং ম্যাক উভয়ের জন্যেই ডেস্কটপ অ্যাপলিকেশন। এই অ্যাপটিতে রয়েছে অতিরিক্ত কিছু ফিচার যা আপনি ওয়েব ভার্শনে পাবেন না। এরপরে রয়েছে Olymp Trade এর এন্ড্রয়েড এবং অ্যাপল মোবাইল অ্যাপ। ইন্টারফেস এখানে এই মত যায়: 

package com.base.dataUtils;

public interface IDataProvider {

  public Object[][] fetchDataSet(String... dataFileInfo);
  public String fetchData(String... dataFileInfo);
}

এখানে বাস্তবায়ন এক্সেল ডেটা সরবরাহকারী

package com.base.dataUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelDataProvider implements IDataProvider {

  FileInputStream fis = null;
  private static XSSFWorkbook workBook = null;
  private static XSSFCell Cell;
  private static XSSFSheet sheet;

  public static String[][] excelDataSet = null;

  @Override
  public Object[][] fetchDataSet(String... dataFileInfo) {
     String excelFilePath = dataFileInfo[0];
     String excelSheetName = dataFileInfo[1];
     File file = new File(excelFilePath);

     try {
        fis = new FileInputStream(file);
     } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     try {
        workBook = new XSSFWorkbook(fis);
     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     sheet = workBook.getSheet(excelSheetName);
     int ci, cj;
     int rowCount = sheet.getLastRowNum();
     int totalCols = sheet.getRow(0).getPhysicalNumberOfCells();
     excelDataSet = new String[rowCount][totalCols - 1];
     ci = 0;
     for (int i = 1; i <= rowCount; i++, ci++) {
        cj = 0;
        for (int j = 1; j <= totalCols - 1; j++, cj++) {

           try {
              excelDataSet[ci][cj] = getCellData(i, j);
           } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
        }
     }
     return excelDataSet;

  }

  public static String getCellData(int RowNum, int ColNum) throws Exception {

     try {

        Cell = sheet.getRow(RowNum).getCell(ColNum);

        int dataType = Cell.getCellType();

        if (dataType == 3) {

           return "";

        }

        else if (dataType == XSSFCell.CELL_TYPE_NUMERIC) {
           int i = (int) Cell.getNumericCellValue();
           return Integer.toString(i);
        }

        else {

           String CellData = Cell.getStringCellValue();

           return CellData;

        }
     } catch (Exception e) {

        throw (e);

     }

  }

  @Override
  public String fetchData(String... dataFileInfo) {
     // TODO Auto-generated method stub
     return null;
  }

}

প্রোপার্টি ডেটা সরবরাহকারী: 

package com.base.dataUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesDataProvider implements IDataProvider {

  FileInputStream fis=null;

  @Override
  public Object[][] fetchDataSet(String... dataFileInfo) {
     // TODO Auto-generated method stub
     return null;
  }

  @Override
  public String fetchData(String... dataFileInfo) {

     String dataValue;
     String pathToFile = dataFileInfo[0];
     String key = dataFileInfo[1];
     Properties properties = new Properties();
     try {
        fis=new FileInputStream(pathToFile);
        properties.load(fis);
     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
     dataValue = properties.getProperty(key);
     return dataValue;
  }

}

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

package com.base.dataUtils;

public class DataHelperProvider {

  public IDataProvider getDataHelperProvider(String typeOfDataHandler) {
     switch (typeOfDataHandler) {
     case "excel":
        return new ExcelDataProvider();
     case "properties":
        return new PropertiesDataProvider();
     }
     return null;

  }
}

ওয়েবঅ্যাকশন ইউটিলিটিস -পেজ অবজেক্ট মডেল ফ্রেমওয়ার্ক

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

ওয়েবঅ্যাকশন ইউটিলিটিসের জন্য কোড স্নিপেট এখানে রয়েছে: 

package com.base.webActionHelperUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;


public class WebActionsHelperUtils {

  protected WebDriver driver;

  public WebActionsHelperUtils(WebDriver driver) {

     this.driver = driver;
  }

  public void safeClick(By element) {

     waitForElementToBeClickAble(element, 30);
     driver.findElement(element).click();
  }

  public List<WebElement> getElements(By elements) {
     return driver.findElements(elements);
  }

  public void waitForWebElementsToBeDisplayed(By elements, int timeOuts) {
     WebDriverWait wait = new WebDriverWait(driver, timeOuts);
     wait.until(ExpectedConditions.visibilityOfAllElements(getElements(elements)));
  }

  public void waitForElementToBeClickAble(By element, int timeOutSeconds) {
     WebDriverWait waitForElement = new WebDriverWait(driver, timeOutSeconds);
     waitForElement.until(ExpectedConditions.elementToBeClickable(element));
  }

  public void waitForElementToBeDisplayed(By element, int timeOuts) {
     WebDriverWait wait = new WebDriverWait(driver, timeOuts);
     wait.until(ExpectedConditions.visibilityOfElementLocated(element));
  }

  public void enterTextIntoElement(By element, String textToBeEntered) {
     driver.findElement(element).sendKeys(textToBeEntered);
  }

  public String getText(By element) {
     return driver.findElement(element).getText();

  }

  public String getAttribute(By element, String attribute) {
     return driver.findElement(element).getAttribute(attribute);
  }

  public boolean isSelected(By element) {
     boolean isElementSelected = false;
     if (driver.findElement(element).isSelected() == true) {
        isElementSelected = true;
     }
     return isElementSelected;
  }

  public void clearField(By element) {
     driver.findElement(element).clear();
  }

  public void implicitlyWait(int timeOuts) {
     driver.manage().timeouts().implicitlyWait(timeOuts, TimeUnit.SECONDS);
  }

  public boolean isElementPresent(By element) {
     try {
        driver.findElement(element);
        return true;
     } catch (Exception e) {
        return false;
     }
  }

  public void switchToTab(int indexOfTab) {
     ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
     driver.switchTo().window(tabs.get(indexOfTab));

  }
}

পৃষ্ঠা মডিউল ইউটিলিটিস - পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক

যেমনটি আমরা জানি, আমাদের পৃষ্ঠা শ্রেণি তৈরি করতে হবে এবং পৃষ্ঠা পদ্ধতিগুলিতে পৃষ্ঠা কার্যকারিতা রাখতে হবে, সুতরাং এখন পৃষ্ঠা অবজেক্ট মডেল কাঠামোর জন্য পৃষ্ঠা মডিউলটি তৈরি করতে হবে: 

প্রতিটি পৃষ্ঠা ক্লাস আবার ওয়েবঅ্যাকশন ইউটিলিগুলি প্রসারিত করে যে আমরা এখনই এবং উন্নত পৃষ্ঠা ইন্টারফেস প্রয়োগ করেযেখানে পৃষ্ঠার ইন্টারফেসগুলি সম্পর্কিত পৃষ্ঠার ওয়েব উপাদান / লোকেটারগুলি রাখতে ইন্টারফেস ছাড়া কিছুই নয় but

এখন কেন আমাদের লোকেরা সংরক্ষণ করার জন্য ইন্টারফেসের প্রয়োজন: 

  • সেখান থেকে লোকেটার রাখার জন্য আমরা কোনও বৈশিষ্ট্য / এক্সেল ফাইল ব্যবহার করতে পারি, তবে এই পদ্ধতির ক্ষেত্রে, প্রতিবারের পদ্ধতিগুলি যেখানে পৃষ্ঠা জটিলতায় বৃদ্ধি পাবে সেখানে আমরা এটি ব্যবহার করতে চাইলে প্রতিবারে লোকেটারগুলি আনতে হবে, তাই আমরা স্টোরটি সংরক্ষণ করি নি ফাইলগুলিতে লোকেশন। 
  • আমরা একই শ্রেণিটি ব্যবহার করতে পারি (@ ফাইন্ডবাই টিকা সহ পৃষ্ঠা ফ্যাক্টরী বাস্তবায়ন সহ পেজক্লাস), তবে আমরা এই ক্লাসিক পৃষ্ঠা অবজেক্ট মডেলটি ব্যবহার করি নি কারণ সংশ্লিষ্ট পৃষ্ঠা শ্রেণিতে স্বতন্ত্র লোকের সংরক্ষণ করা, কোডটি অপঠনযোগ্য এবং আনাড়ি হবে, আমরা আলাদা করতে চেয়েছিলাম কোড থেকে পরিষ্কার কোডবেস এবং রক্ষণাবেক্ষণ এবং ডিবাগিং এবং পুনঃব্যবহারযোগ্যতা বজায় রাখার জন্য কোডগুলি থেকে চিহ্নিতকারীগুলিও এই পদ্ধতিতে বৃদ্ধি পাবে।
  • আমরা লোকেটারগুলিকে পৃথক ক্লাসে সংরক্ষণ করতে পারি, কিন্তু কল করার কারণে আমরা তা করিনি "এন" পৃষ্ঠা লোকেটার ক্লাসে, আমাদের "এন" সংখ্যক অবজেক্টের সংখ্যার বস্তু তৈরি করতে হয়েছিল; সুতরাং স্থান জটিলতা প্রভাবিত হবে।

সুতরাং আমরা এই পদ্ধতির দ্বারা পৃথক পৃষ্ঠা লোকেটারগুলির জন্য পৃথক ইন্টারফেস ব্যবহার করেছি; আমরা উপরের সমস্ত সমস্যার বিবৃতিগুলি সমাধান করি যা সময় জটিলতা, স্পেস জটিলতা এবং ইন্টারফেসের মতো পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য কোডবেস, আমাদেরকে লোকেটারগুলিতে অ্যাক্সেসের জন্য অবজেক্ট তৈরি করতে হবে না।

package com.base.pageModules;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.base.commonUtils.JSonHandler;
import com.base.webActionHelperUtils.WebActionsHelperUtils;
import com.page.locatorModules.HomePageLocators;

public class HomePage extends WebActionsHelperUtils implements HomePageLocators {

  JSonHandler jsonHandler = new JSonHandler();

  public HomePage(WebDriver driver) {
     super(driver);
     this.driver = driver;
  }

  public void enterSearchdataToSearchField(String searchData) {

     waitForElementToBeClickAble(SEARCH_BOX, 10);
     enterTextIntoElement(SEARCH_BOX, searchData);

  }

  public void navigatToUrl() {
     driver.get(url);
  }

  public void captureSearchSuggestion(String pathToJsonDataStore, String searchData) {
     List<WebElement> elements = getElements(SUGGESTION_BOX);
     jsonHandler.captureAndWriteJsonData(elements, pathToJsonDataStore, searchData);
  }

  public void genericWait(int timeOuts) {
     implicitlyWait(timeOuts);
  }

  public void clikcOnSelectedElement(String option) {
     int optionSelection = Integer.parseInt(option);
     safeClick(By.xpath("//div[@id='s-separator']/following-sibling::div[" + optionSelection + "]"));
  }

}

তেমনি, আপনি পৃষ্ঠার বৈশিষ্ট্যগুলি পৃষ্ঠা সম্পর্কিত বিভিন্ন পৃষ্ঠা পদ্ধতিতে সম্পর্কিত পৃষ্ঠা শ্রেণীর ভিতরে অন্তর্ভুক্ত রাখতে পারেন। 

এখানে কিভাবে পৃষ্ঠা লোকেটার ইন্টারফেস মত চেহারা: 

package com.page.locatorModules;

import org.openqa.selenium.By;

public interface HomePageLocators {

 
  By SEARCH_BOX=By.id("twotabsearchtextbox");
  By SUGGESTION_BOX=By.xpath("//div[@id='suggestions']/div");
 
}

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

বেসসেটআপ ক্লাসটি দেখে মনে হচ্ছে: 

package com.demo.testS;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.DataProvider;

import com.base.dataUtils.DataHelperProvider;
import com.base.dataUtils.IDataProvider;
import com.base.driverUtils.DriverProvider;

public class BaseSetUp {

	public WebDriver driver;
	DriverProvider browserProvider = new DriverProvider();
	DataHelperProvider datahelperProvider = new DataHelperProvider();
	IDataProvider dataProvider = datahelperProvider.getDataHelperProvider("properties");
	IDataProvider dataProviderExcel = datahelperProvider.getDataHelperProvider("excel");
	public final String configProperties = "..\\DummyAutomation\\TestConfigsData\\config.properties";
	public String url = dataProvider.fetchData(configProperties, "url");
	String modeOfExecution = dataProvider.fetchData(configProperties, "modeOfExecution");
	String browserName = dataProvider.fetchData(configProperties, "browser");
	String pathToJasonDataStore = "..\\DummyAutomation\\ProductJsonData\\";
	String pathToExcelData = "..\\DummyAutomation\\TestConfigsData\\TestData.xlsx";

	public WebDriver getDriver() {
		return driver;
	}

	protected void setDriver() {
		driver = browserProvider.getDriver(modeOfExecution).init(browserName);
	}

	@DataProvider(name = "SearchFunctionality")
	public Object[][] getCityDetails() {
		Object[][] arrayObject = dataProviderExcel.fetchDataSet(pathToExcelData, "DataFeed");
		return arrayObject;
	}
}

পরীক্ষা ক্লাস: যেহেতু আমরা এখানে টেস্টএনজি ব্যবহার করব, সুতরাং পরীক্ষার স্ক্রিপ্টটি বিকাশের জন্য আপনার @ টেক্সট পদ্ধতিটি লিখতে হবে, যেমন: 

টেস্ট ক্লাসগুলির কোড স্নিপেট এখানে  

package com.demo.testS;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.base.pageModules.HomePage;
import com.base.pageModules.SearchPage;

public class DemoTest extends BaseSetUp {

  HomePage homePage;
  SearchPage searchPage;

  @BeforeMethod
  public void setUpTest() {
     setDriver();
     homePage = new HomePage(driver);
     searchPage = new SearchPage(driver);
     homePage.navigatToUrl();
  }

  @Test(dataProvider = "SearchFunctionality")
  public void search(String searchData, String selectOption) {
     homePage.enterSearchdataToSearchField(searchData);
     homePage.genericWait(5);
     homePage.captureSearchSuggestion(pathToJasonDataStore, searchData);
     homePage.clikcOnSelectedElement(selectOption);
     searchPage.clickOnFirstProduct();
     searchPage.switchToProductSpecificPage();
     searchPage.captureProductData(pathToJasonDataStore, searchData);

  }

  @AfterMethod
  public void tearDown() {
     if (driver != null) {
        driver.quit();
     }
  }

}

TestNgXML ফাইল ML -পেজ অবজেক্ট মডেল কাঠামো

আপনাকে টেংটি.এক্সএমএল এর জন্য একটি এক্সএমএল শ্রেণি নির্ধারণ করতে হবে যা মূলত একটি ইউনিট পরীক্ষার কাঠামো এবং আপনার অটোমেশনের প্রবাহকে নিয়ন্ত্রণ করে; আপনি নিজেরাই সেখানে পরীক্ষার ক্লাস উল্লেখ করতে পারেন।

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter" parallel="tests" thread-count="3">

<test name="DemoAutomation_TarGet">
<classes>
<class name="com.demo.testS.DemoTest"></class>

</classes>
</test>
</suite>

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

বৈশিষ্ট্য-পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্কের প্রতিবেদন করা

আপনি উপলভ্য যে কোনও প্রতিবেদন বৈশিষ্ট্য ব্যবহার করতে পারেন মোহন, ব্যাপ্তি রপ্তানি, টেস্টএনজি রিপোর্ট, বা অগ্রিম প্রতিবেদন ব্যবহার করে ELK স্ট্যাক, প্রভৃতি 

কেবল সরলতা বজায় রাখতে, আমরা এখানে প্রতিবেদনের বৈশিষ্ট্যটি এক্সটেন্ট রিপোর্টের সাথে দেখছি যা এর সাথে অনেকগুলি বৈশিষ্ট্য রয়েছে এবং এটি প্রতিবেদনের মধ্যবর্তী স্তর হিসাবে বিবেচিত হতে পারে। 

এক্সটেন্ট রিপোর্টের সাথে কাজ করার জন্য আপনাকে একটি ক্লাস তৈরি করতে হবে এবং এটি করার সময় আপনাকে এটিকে বাস্তবায়ন করতে হবে টেস্টএনজি থেকে ইন্টারফেস আইটিস্টালিস্টার; নীচের কোডটি কীভাবে দেখায়: 

package com.cyborg.core.generic.reportUtils;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.cyborg.core.generic.dataUtils.PropertiesDataUtils;

import io.appium.java_client.android.AndroidDriver;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.Reporter;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class ExtentReportUtils implements ITestListener {

  String screenShotPath = "";

  static ExtentReports extentReports;
  ExtentHtmlReporter extentHtmlReporter;
  protected ExtentTest extentTest;


  static String pathOfFile = "./configurator.properties";
  PropertiesDataUtils propertiesDataUtils = PropertiesDataUtils.getInstance(pathOfFile);
   Boolean log_to_kibana=Boolean.parseBoolean(PropertiesDataUtils.configDataStore.get("log_to_kibana"));
 
   public void setup() {
     try {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        Date now = new Date();
        String currentTime = simpleDateFormat.format(now);
        extentHtmlReporter = new ExtentHtmlReporter(
              new File(System.getProperty("user.dir") + "_Reports_" + currentTime + ".html"));
        extentHtmlReporter.loadXMLConfig(
              new File(System.getProperty("user.dir") + "/src/test/resources/config/extent-config.xml"));
        extentReports = new ExtentReports();
        extentReports.setSystemInfo("Environment", PropertiesDataUtils.configDataStore.get("Environment"));
        extentReports.setSystemInfo("AppName", PropertiesDataUtils.configDataStore.get("AppName"));
        extentReports.setSystemInfo("ModeOfExecution", PropertiesDataUtils.configDataStore.get("modeOfExecution"));

        extentReports.attachReporter(extentHtmlReporter);
        System.out.println("DONE SETUP FOR extent Report");
     } catch (Exception ex) {
        ex.printStackTrace();
     }
  }

  public void setup(String reportName) {
     extentReports = getExtent(reportName);
  }

  public ExtentReports getExtent(String reportName) {
     if (extentReports != null)
        return extentReports; // avoid creating new instance of html file
     extentReports = new ExtentReports();

     extentReports.attachReporter(getHtmlReporter(reportName));
     return extentReports;
  }

  private ExtentHtmlReporter getHtmlReporter(String reportName) {

     extentHtmlReporter = new ExtentHtmlReporter("./reports/" + reportName + ".html");
     extentHtmlReporter.loadXMLConfig("./src/test/resources/config/extent-config.xml");

     // make the charts visible on report open
     extentHtmlReporter.config().setChartVisibilityOnOpen(true);
     extentHtmlReporter.config().setDocumentTitle(PropertiesDataUtils.configDataStore.get("AppName"));
     extentHtmlReporter.config().setReportName("Regression Cycle");

     // Append the existing report
     extentHtmlReporter.setAppendExisting(false);
     Locale.setDefault(Locale.ENGLISH);
     return extentHtmlReporter;
  }

  public void registerTestMethod(Method method) {
     String testName = method.getName();
     extentTest = extentReports.createTest(testName);

  }

  public void sequenceScreenShot(AndroidDriver driver, String application, String step) {
     try {
        extentTest.addScreenCaptureFromPath(screenshotStepWise(driver, application, step));
     } catch (Exception e) {
        e.printStackTrace();
     }
  }

  public void screenshotAnyCase(ITestResult result, WebDriver driver, String application) {

     String testName = result.getName();
     File file = new File(".");
     String filename = testName + ".png";
     String filepath = null;
     try {
        filepath = file.getCanonicalPath() + "/ScreenShots/" + application + "/" + putLogDate() + filename;
     } catch (IOException e1) {
        e1.printStackTrace();
     }

     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        screenShotPath = "job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDate() + filename;
     else
        screenShotPath = System.getProperty("user.dir") + "/ScreenShots/" + application + "/" + putLogDate()
              + filename;
     try {
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshotFile = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotFile, new File(filepath));
        File reportFile = new File(filepath);
        reportLogScreenshot(reportFile, filename, application);
     } catch (Exception e) {
        Reporter.log("Unable to get the screenshot");
     }
  }

  public String screenshotStepWise(WebDriver driver, String application, String step) throws Exception {

     File file = new File(".");
     String filename = step + ".png";
     String filepath = null;
     try {
        filepath = file.getCanonicalPath() + "/ScreenShots/" + application + "/" + putLogDateWithoutmm() + filename;
     } catch (IOException e1) {
        e1.printStackTrace();
     }

     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        screenShotPath = "job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDateWithoutmm() + filename;
     else
        screenShotPath = System.getProperty("user.dir") + "/ScreenShots/" + application + "/"
              + putLogDateWithoutmm() + filename;
     try {
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshotFile = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotFile, new File(filepath));
     } catch (Exception e) {
        Reporter.log("Unable to get the screenshot");
     }
     return screenShotPath;
  }

  protected void reportLogScreenshot(File file, String fileName, String application) {
     System.setProperty("org.uncommons.reportng.escape-output", "false");
     String absolute = file.getAbsolutePath();
     if (PropertiesDataUtils.configDataStore.get("run_on_jenkins").equalsIgnoreCase("true"))
        absolute = " /job/Cyborg2/" + PropertiesDataUtils.configDataStore.get("build_number")
              + "/artifact/ScreenShots/" + application + "/" + putLogDate() + fileName;
     else
        absolute = System.getProperty("user.dir") + "/ScreenShots/" + application + "/" + putLogDate() + fileName;
     screenShotPath = absolute;

  }

  public void captureStatus(ITestResult result) {
     if (result.getStatus() == ITestResult.SUCCESS) {
        extentTest.log(Status.PASS, "The test method Named as :" + result.getName() + " is PASSED");
        try {
           extentTest.addScreenCaptureFromPath(screenShotPath);
        } catch (IOException e) {

           e.printStackTrace();
        }
     } else if (result.getStatus() == ITestResult.FAILURE) {
        extentTest.log(Status.FAIL, "The test method Named as :" + result.getName() + " is FAILED");
        extentTest.log(Status.FAIL, "The failure : " + result.getThrowable());
        extentTest.log(Status.FAIL, "StackTrace: " + result.getThrowable());
        try {
           extentTest.addScreenCaptureFromPath(screenShotPath);
        } catch (IOException e) {

           e.printStackTrace();
        }
     } else if (result.getStatus() == ITestResult.SKIP) {
        extentTest.log(Status.SKIP, "The test method Named as :" + result.getName() + " is SKIPPED");

     }

  }

  public String putLogDate() {
     Calendar c = new GregorianCalendar();
     c.add(Calendar.DATE, +0);
     Date s = c.getTime();
     String dateString = new SimpleDateFormat("_EEE_ddMMMyyyy_hhmm").format(s);
     return dateString;
  }

  public String putLogDateWithoutmm() {
     Calendar c = new GregorianCalendar();
     c.add(Calendar.DATE, +0);
     Date s = c.getTime();
     String dateString = new SimpleDateFormat("_EEE_ddMMMyyyy_hh").format(s);
     return dateString;
  }

  public void cleanup() {
     extentReports.flush();
  }

  public void onTestStart(ITestResult result) {

     /*
      * try { DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH-mm-ss"); Date
      * date = new Date();
      */
     /*
      * record = new ATUTestRecorder(System.getProperty("user.dir")+"/videos",
      * dateFormat.format(date), false); record.start();
      *//*
         *
         * } catch (ATUTestRecorderException e) { e.printStackTrace(); }
         */

  }

  public void onTestSuccess(ITestResult result) {

     /*
      * try { record.stop(); } catch (Exception e) { e.printStackTrace(); }
      */

     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testDescription.split("_")[1];
     String status = "PASSED";
     String exceptionType = "NA";
     String detailedError = "NA";
    
     String data ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

     

  }

  @Override
  public void onTestFailure(ITestResult result) {
    
     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testCaseNumber.split("_")[1];
     String status = "FAILED";
     String exceptionType = String.valueOf(result.getThrowable().getClass().getSimpleName());
     String detailedError = String.valueOf(result.getThrowable().getMessage());
    
     String data ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

    
     // TODO Auto-generated method stub

  }

  @Override
  public void onTestSkipped(ITestResult result) {
     String testDescription = result.getMethod().getDescription();
     String testCaseNumber = testDescription.split("_")[0];
     String testDesc = testCaseNumber.split("_")[1];
     String status = "SKIPPED";
     String exceptionType = result.getThrowable().getClass().getSimpleName();
     String detailedError = result.getThrowable().getMessage();
    
     String data ="{\n" +
           "   \"testCaseNumber\" : \""+testCaseNumber+"\",\n" +
           "   \"status\" : \""+status+"\",\n" +
           "   \"testDescription\" : \""+testDesc+"\",\n" +
           "   \"exceptionType\" : \""+exceptionType+"\",\n" +
           "   \"detailedError\":\""+detailedError+"\"\n" +
           "   \n" +
           "}";

  }

  @Override
  public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
     // TODO Auto-generated method stub

  }

  @Override
  public void onStart(ITestContext context) {
     // TODO Auto-generated method stub

  }

  @Override
  public void onFinish(ITestContext context) {
     // TODO Auto-generated method stub

  }
}

উপসংহার: এটির সাহায্যে আমরা সেলেনিয়াম পৃষ্ঠা অবজেক্ট মডেল ফ্রেমওয়ার্ক বিকাশ শেষ করছি, যার মাধ্যমে আপনি পৃষ্ঠা অবজেক্ট মডেল কাঠামো তৈরি করতে শুরু করতে পারেন এবং এটি উন্নত স্তরে নিয়ে যেতে পারেন, টিউটোরিয়ালের আসন্ন সিরিজে আমরা সেলেনিয়াম কাঠামোর উন্নত বৈশিষ্ট্যগুলি নিয়ে আরও আলোচনা করব । সিরিজের মধ্য দিয়ে যেতে সেলেনিয়াম টিউটোরিয়াল আপনি এখানে যেতে পারেন।

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

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

মতামত দিন

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

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