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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

पैकेज com.cyborg.core.generic.dataUtils; आयात java.io.FileInputStream; आयात java.io.FileNotFoundException; java.io.IOException आयात करें; आयात java.io.InputStream; आयात java.util.LinkedHashMap; आयात java.util.Properties; आयात java.util.Set; आयात org.apache.log4j.PropertyConfigurator; // यह सिंगलटन क्लास पब्लिक क्लास है PropertiesDataUtils {निजी गुण गुण = शून्य; सार्वजनिक स्थैतिक LinkedHashMap configDataStore = नया LinkedHashMap (); इनपुटस्ट्रीम = शून्य है; // यह उस वर्ग का स्थिर और निजी संदर्भ है जिसे आप अपने ढांचे में कहीं भी उपयोग कर सकते हैं निजी स्थैतिक गुणडेटा उपयोग गुणडेटा उपयोग = शून्य; बूलियन केंद्रीकृत लॉग = झूठा; // यह ऑब्जेक्ट बनाने के लिए प्राइवेट कंस्ट्रक्टर है लेकिन आप सिंगलटन पैटर्न यानी केवल एक ऑब्जेक्ट क्रिएशन के डिजाइन को बनाए रखने के लिए इसे क्लास के बाहर से एक्सेस नहीं कर सकते।
 निजी गुणडेटा उपयोग (स्ट्रिंग फ़ाइलपाथ) {जेनरेटडेटास्टोर (फ़ाइलपाथ); CentralizeLog = Boolean.parseBoolean (PropertiesDataUtils.configDataStore.get("centralizedLog")); if(centralizeLog) PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_central.properties"); और PropertyConfigurator.configure(System.getProperty("user.dir")+"//src//test//resources//config//log4j_local.properties"); } निजी PropertiesDataUtils() { } // यह विधि मूल रूप से सिंगलटन वर्ग सार्वजनिक स्थैतिक PropertiesDataUtils getInstance(String filePath) का उदाहरण बनाती है { if (propertiesDataUtils == null) propertiesDataUtils = new PropertiesDataUtils(filePath); गुण वापस करेंDataUtils; }//यह विधि मूल रूप से डेटास्टोर बनाती है जहां आप सभी कॉन्फिग डेटा को स्टोर करना चाहते हैं, जैसा कि पहले चर्चा की गई थी निजी शून्य जेनरेटडेटास्टोर (स्ट्रिंग फाइलपाथ) {कोशिश करें {this.properties = new Properties(); है = नया फ़ाइल इनपुटस्ट्रीम (फ़ाइलपाथ); गुण। लोड (है); ओवरराइडफ्रॉम एनवायरनमेंट (); समूह कुंजियाँ = loadAllKeys (); के लिए (ऑब्जेक्ट k: कुंजियाँ) {स्ट्रिंग कुंजी = (स्ट्रिंग) k; configDataStore.put (कुंजी, getPropertyValue (कुंजी)); } } पकड़ें (FileNotFoundException fileNotFoundException) { StringExceptionData = String.valueOf(fileNotFoundException.getCause().getMessage()); } पकड़ें (IOException ioException) {स्ट्रिंग अपवादडेटा = String.valueOf(ioException.getCause().getMessage()); } अंत में { अगर (शून्य! = है) {कोशिश { is.close (); } पकड़ें (अपवाद ई) {स्ट्रिंग अपवादडेटा = String.valueOf(e.getCause().getMessage()); } } } } // इस विधि का उपयोग गुण फ़ाइल से सभी कुंजियों को लोड करने के लिए किया जाता है।

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

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

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

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

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

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

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

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

पैकेज com.cyborg.core.web.utils.driverUtils; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.remote.RemoteWebDriver; सार्वजनिक इंटरफ़ेस IDriver {सार्वजनिक वेबड्राइवर init (स्ट्रिंग ब्राउज़रनाम); }

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

पैकेज com.cyborg.core.web.utils.driverUtils; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.chrome.ChromeDriver; आयात org.openqa.selenium.edge.EdgeDriver; आयात org.openqa.selenium.firefox.FirefoxDriver; आयात org.openqa.selenium.ie.InternetExplorerDriver; आयात org.openqa.selenium.safari.SafariDriver; पब्लिक क्लास लोकलड्राइवर IDriver लागू करता है { सार्वजनिक वेबड्राइवर init(स्ट्रिंग ब्राउज़रनाम) {स्ट्रिंग pathToDriver = getDriverPath(ब्राउज़रनाम); यदि (शून्य! = ब्राउज़र नाम) { स्विच (ब्राउज़र नाम) { केस "क्रोम": System.setProperty ("webdriver.chrome.driver", pathToDriver); नया ChromeDriver लौटाएँ(); केस "फ़ायरफ़ॉक्स": System.setProperty("webdriver.gecko.driver", pathToDriver); नया फ़ायरफ़ॉक्सड्राइवर लौटाएँ(); डिफ़ॉल्ट: System.setProperty('webdriver.chrome.driver', pathToDriver); नया ChromeDriver लौटाएँ(); } } अन्य { System.setProperty("webdriver.chrome.driver", pathToDriver); नया ChromeDriver लौटाएँ(); } } निजी स्ट्रिंग getDriverPath(स्ट्रिंग ब्राउज़रनाम) { स्ट्रिंग osData = System.getProperty("os.name").toLowerCase().split("\\\\s")[0]; यदि (शून्य != osData) { यदि (osData.equalsIgnoreCase("mac")) { वापसी "./DriversExe/" + osData + "_" + ब्राउज़रनाम; } अन्यथा यदि (osData.contains("nux") || (osData.contains("nix"))) { return "./DriversExe/linux_" + ब्राउज़रनाम; } अन्यथा यदि (osData.contains("win")) {वापसी "./DriversExe/" + osData + "_" + ब्राउज़रनाम + ".exe"; } }वापसी शून्य; } }

यहाँ दूरस्थ चालक वर्ग का कार्यान्वयन है: 

पैकेज com.cyborg.core.web.utils.driverUtils; आयात org.openqa.selenium.WebDriver; आयात org.openqa.selenium.remote.DesiredCapabilities; आयात org.openqa.selenium.remote.RemoteWebDriver; आयात com.cyborg.core.generic.dataUtils.PropertiesDataUtils; आयात java.net.MalformedURLException; java.net.URL आयात करें; पब्लिक क्लास रिमोटड्राइवर IDriver लागू करता है {वांछित क्षमता कैप्स; स्ट्रिंग RemoteHuburl=PropertiesDataUtils.configDataStore.get("WEB_GRID_IP"); @ ओवरराइड पब्लिक वेबड्राइवर इनिट (स्ट्रिंग ब्राउजरनाम) {अगर (ब्राउज़रनाम! = नल) {स्विच (ब्राउज़रनाम) {केस "फ़ायरफ़ॉक्स": कोशिश करें {नया रिमोटवेबड्राइवर (नया यूआरएल (रिमोट हबरल), कैप्स.फ़ायरफ़ॉक्स ()); } पकड़ें (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace (); } केस "क्रोम": कोशिश करें { नया रिमोटवेबड्राइवर लौटाएं (नया यूआरएल (रिमोटहुबर्ल), कैप्स क्रोम ()); } पकड़ें (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace (); } मामला "यानी": कोशिश करें {नया रिमोटवेबड्राइवर (नया यूआरएल (रिमोट हबरल), कैप्स.इंटरनेट एक्सप्लोरर ()); } पकड़ें (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace (); } डिफ़ॉल्ट: कोशिश करें { नया रिमोटवेबड्राइवर लौटाएं (नया यूआरएल (रिमोटहुबर्ल), कैप्स.क्रोम ()); } पकड़ें (MalformedURLException malformedUrlEx) { malformedUrlEx.getCause().getMessage(); malformedUrlEx.printStackTrace (); } } वापसी शून्य; } और {वापसी शून्य; } }

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

पैकेज com.cyborg.core.web.utils.driverUtils; पब्लिक क्लास ड्राइवरप्रोवाइडर {पब्लिक IDriver getDriver (स्ट्रिंग टाइपऑफ़ड्राइवर) {if (टाइपऑफ़ड्राइवर! = नल) {स्विच (टाइपऑफ़ड्राइवर) {केस "लोकल": नया लोकलड्राइवर (); मामला "रिमोट": नया रिमोटड्राइवर लौटाएं (); डिफ़ॉल्ट: नया लोकलड्राइवर लौटाएं (); }} और {वापसी शून्य; } } }

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

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

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

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