Selenium الإطار: البيانات والكلمات الرئيسية والهجينة
ما هي تفاصيل Selenium نطاق؟
تشير Selenium إطار الأتمتة إن بنية الكود تجعل صيانة الكود سهلة وفعالة. فبدون الأطر، قد يضع المستخدمون "الكود" و"البيانات" في نفس المكان الذي لا يمكن إعادة استخدامه أو قراءته. تنتج الأطر نتائج مفيدة مثل زيادة إمكانية إعادة استخدام الكود، وزيادة قابلية النقل، وتقليل تكلفة صيانة البرنامج النصي، وتحسين قابلية قراءة الكود، وما إلى ذلك.
انواع من Selenium الإطار
هناك ثلاثة بشكل رئيسي نوع الأطر التي أنشأتها Selenium WebDriver لأتمتة حالات الاختبار اليدوي
- الإطار المبني على البيانات
- إطار يحركه الكلمات الرئيسية
- إطار مدفوع هجين
الإطار المبني على البيانات في Selenium
الإطار المبني على البيانات في Selenium هي طريقة لفصل مجموعات البيانات عن حالة الاختبار. بمجرد فصل مجموعات البيانات عن حالة الاختبار، يمكن تعديلها بسهولة لوظيفة محددة دون تغيير التعليمات البرمجية. يتم استخدامه لجلب حالات الاختبار والأجنحة من ملفات خارجية مثل Excelأو .csv أو .xml أو بعض جداول قاعدة البيانات.
لقراءة أو كتابة ملف Excel، يوفر Apache مكتبة POI مشهورة جدًا. هذه المكتبة قادرة بما يكفي على القراءة والكتابة XLS XLSX تنسيق ملف اكسل.
ليقرأ XLS الملفات، ان HSSF يتم توفير التنفيذ من خلال مكتبة POI.
ليقرأ XLSX, XSSF بداية شئ POI مكتبة سيكون الاختيار. دعونا ندرس هذه التطبيقات بالتفصيل.
لقد تعلمنا بالفعل عن الاختبار المبني على البيانات في موقعنا البرنامج التعليمي السابق
إطار يحركه الكلمات الرئيسية في Selenium
إطار يحركه الكلمات الرئيسية في Selenium هي طريقة تستخدم لتسريع الاختبار الآلي من خلال فصل الكلمات الرئيسية لمجموعة مشتركة من الوظائف والتعليمات. تتم كتابة جميع العمليات والتعليمات التي سيتم إجراؤها في ملف خارجي مثل ورقة Excel. يمكن للمستخدمين التحكم بسهولة وتحديد الوظائف التي يريدون اختبارها.
هنا كيف يبدو الإطار الكامل
كما ترى، إنه إطار عمل مكون من خمس خطوات. دعنا ندرسه خطوة بخطوة بالتفصيل
الخطوة 1)
- سيقوم البرنامج النصي لبرنامج التشغيل Execute.java باستدعاء ReadGuru99ExcelFile.java
- يحتوي ReadGuru99ExcelFile.java على برنامج نصي POI لقراءة البيانات من برنامج Excel
الخطوة 2)
- سيقوم ReadGuru99ExcelFile.java بقراءة البيانات من TestCase.xlsx
- هنا كيف تبدو الورقة-
- وفقًا للكلمات الأساسية المكتوبة في ملف Excel، سيقوم الإطار بإجراء العملية على واجهة المستخدم.
- على سبيل المثال، نحن بحاجة إلى النقر على زر "تسجيل الدخول". في المقابل، سيكون لبرنامج Excel الخاص بنا كلمة رئيسية "انقر". الآن يمكن أن يحتوي AUT على مئات الأزرار على الصفحة، لتحديد زر تسجيل الدخول، في Excel، سندخل اسم الكائن كزر تسجيل الدخول ونوع الكائن كاسم (انظر الصف المميز في الصورة أعلاه). يمكن أن يكون نوع الكائن هو Xpath أو اسم CSS أو أي قيمة أخرى
الخطوة 3) سيقوم ReadGuru99ExcelFile.java بتمرير هذه البيانات إلى البرنامج النصي لبرنامج التشغيل Execute.java
الخطوة 4)
- بالنسبة لجميع عناصر الويب الخاصة بواجهة المستخدم الخاصة بنا، نحتاج إلى إنشاء مستودع كائنات حيث سنضع محدد موقع العناصر الخاص بها (مثل Xpath، والاسم، ومسار CSS، واسم الفئة، وما إلى ذلك)
- سوف يقوم Execute.java (برنامج التشغيل الخاص بنا) بقراءة مستودع الكائنات بالكامل وتخزينه في متغير
- لقراءة مستودع الكائنات هذا، نحتاج إلى فئة ReadObject التي تحتوي على طريقة getObjectRepository لقراءتها.
NOTE: قد تتساءل لماذا نحتاج إلى إنشاء مستودع كائنات. الجواب يساعد في صيانة التعليمات البرمجية. على سبيل المثال، نحن نستخدم الزر الذي يحمل الاسم = btnlogin في 10 حالات اختبار مختلفة. في المستقبل، يقرر المطور تغيير الاسم من btnlogin إلى الإرسال. سيكون عليك إجراء تغيير في جميع حالات الاختبار العشرة. في حالة مستودع الكائنات، ستقوم بإجراء التغيير مرة واحدة فقط في المستودع.
الخطوة 5)
- سيقوم برنامج التشغيل بتمرير البيانات من Excel & Object Repository إلى واجهة المستخدمOperaفئة نشوئها
- UIOperaتحتوي الفئة على وظائف لتنفيذ الإجراءات المقابلة للكلمات الرئيسية مثل CLICK وSETTEXT وما إلى ذلك... المذكورة في ملف Excel
- UIOperaفئة نشوئها هي Java الفئة التي تحتوي على التنفيذ الفعلي للكود لإجراء العمليات على عناصر الويب
سيبدو المشروع الكامل مثل-
دعونا ننظر في مثال:
سيناريو الاختبار: نحن نقوم بتنفيذ حالتين اختباريتين
- حالة الاختبار 1:
- غوتو
http://demo.guru99.com/V4/
- أدخل معرف المستخدم
- أدخل كلمة المرور
- انقر فوق إعادة تعيين
- حالة الاختبار 2:
- غوتو
http://demo.guru99.com/V4/
- أدخل معرف المستخدم
- أدخل كلمة المرور
- انقر فوق تسجيل الدخول
خصائص الموضوع
url=http://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
قراءة Guru99ExcelFile.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 ملفات المشروع للعرض التوضيحي في هذا البرنامج التعليمي
إطار مدفوع هجين
إطار مدفوع هجين in Selenium هو مفهوم نستخدم فيه ميزة كل من إطار العمل المعتمد على الكلمات الرئيسية بالإضافة إلى إطار العمل المعتمد على البيانات. إنه إطار عمل سهل الاستخدام يسمح للمختبرين اليدويين بإنشاء حالات اختبار بمجرد النظر إلى الكلمات الرئيسية وبيانات الاختبار ومستودع الكائنات دون الحاجة إلى ترميز في إطار العمل.
هنا بالنسبة للكلمات الرئيسية، سنستخدم ملفات Excel للحفاظ على حالات الاختبار، وبالنسبة لبيانات الاختبار، يمكننا استخدام البيانات، وموفر تستنج الإطار.
هنا في إطار عملنا المختلط، لا نحتاج إلى تغيير أي شيء في إطار العمل الذي يعتمد على الكلمات الرئيسية، هنا نحتاج فقط إلى استبدال ملف 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 برنامج تشغيل الويب.
- A Selenium إطار عمل الأتمتة الذي يمكن تصنيفه إلى أطر عمل تعتمد على البيانات، وأخرى تعتمد على الكلمات الرئيسية، وأطر عمل هجينة.
- يمكننا تحقيق إطار عمل يعتمد على البيانات باستخدام TestNGمزود البيانات.
- في إطار العمل المبني على الكلمات الرئيسية، تتم كتابة الكلمات الرئيسية في بعض الملفات الخارجية مثل ملف Excel وسيقوم كود Java باستدعاء هذا الملف وتنفيذ حالات الاختبار.
- الإطار المختلط عبارة عن مزيج من إطار عمل يعتمد على الكلمات الرئيسية وإطار عمل يعتمد على البيانات.
تحميل Selenium ملفات المشروع للعرض التوضيحي في هذا البرنامج التعليمي