2011-11-03 14 views
22

में सर्वोत्तम अभ्यास जब आप अपने पेज ऑब्जेक्ट्स को मॉडलिंग कर रहे हैं, तो आप उस पृष्ठ से कैसे निपटेंगे, जिस पर फॉर्म और लगभग 50 इनपुट फ़ील्ड हैं? यहाँ सबसे अच्छा अभ्यास क्या है?पेज ऑब्जेक्ट मॉडल सेलेनियम

क्या आप एक पृष्ठ वस्तु बनायेंगे और प्रत्येक इनपुट कार्रवाई के लिए एक अलग कार्य लिखेंगे? या आप एक समारोह लिखेंगे जो पैरामीटर पास किए जाते हैं और पाठ में प्रवेश करते हैं?

उदा

public void enterFirstName(String firstName) { 
    driver.type("firstNameField", firstName); 
} 

public void enterSecondName(String secondName) { 
    driver.type("secondNameField", secondName); 
} 

या

public void fillInForm(String inputFieldName, String text) { 
    driver.type(inputFieldName, text); 
} 

मैं पहला मॉडल में देख सकते हैं, जब परीक्षण लेखन, परीक्षण और वर्णनात्मक हैं, लेकिन यदि पृष्ठ पर बहुत अधिक इनपुट फ़ील्ड, बनाने शामिल पेज वस्तु बोझिल हो जाता है।

ऑब्जेक्ट्स इस पोस्ट में भी पृष्ठ में सेलेनियम परीक्षण की संरचना में काफी रोचक है Functional Automated Testing Best Practices with Selenium WebDriver

+0

इस पर एक उदाहरण के लिए [मेरे स्टैक ओवरफ्लो प्रश्न] (http://stackoverflow.com/questions/8149808/whats-the-best-way-to-use-selenium-pageobject-design-pattern) पर एक नज़र डालें मैं पेज ऑब्जेक्ट डिज़ाइन पैटर्न का उपयोग करने जा रहा हूं। मैं खुद 100% नहीं हूं लेकिन बहुत से पढ़ने से, मुझे यकीन है कि मैं सही लाइनों पर हूं, उम्मीद है कि मैंने जो चिपकाया है, वह आपकी मदद करता है। –

+0

http://selenium-tutorial.blogspot.com/2012/06/webdriver-page-objects-pattern.html –

+1

आप सभी समान वेबलेमेंट प्रकारों को एक सूची में डाल सकते हैं। इसलिए, यदि आपके पास 40 टेक्स्ट फ़ील्ड हैं तो आप सूची में से एक-एक करके आकर्षित कर सकते हैं, इसे पहचानने के लिए "नाम" या "आईडी" प्राप्त करें, और उसके बाद इसे संचालित करें। – djangofan

उत्तर

9

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

एक बात मैं निश्चित रूप से सिफारिश करेंगे एक FillForm समारोह के बजाय उन व्यक्तिगत कार्यों के सभी के लिए एक वस्तु में पारित करने के लिए किया जाएगा। इस दृष्टिकोण का उपयोग कर कुछ महान फायदे हैं। एक, आपके पास कुछ "सामान्य" पूर्व-कॉन्फ़िगर किए गए ऑब्जेक्ट्स हो सकते हैं जिनका उपयोग आप अपने कई परीक्षण मामलों के लिए करते हैं। उदाहरण के लिए:

public class FormInfo 
{ 
    string Domain; 
    string Name; 
    string Category; 
    // etc... 

    public FormInfo(string domain, string name, string category) 
    { 
    Domain = domain; 
    Name = name; 
    Category = category; 
    // etc... 
    } 
} 


// Somewhere in your initialization code 
public static FormInfo Info1 = new FormInfo("myDomain1", "myName1", "myCategory1"); 
public static FormInfo Info2 = new FormInfo("myDomain2", "myName2", "myCategory2"); 

You can still update one of your common merchants if you need to do something one-off: 

// In your test case: 
Info1.Category = "blah"; 
FormPage.FillForm(Info1); 

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

Info1.Domain = null; //This should make the FillForm function skip doing anything with this field. 
FormPage.FillForm(Info1); 
FormPage.DomainTextBox.Text = "field validation string"; 

इस दृष्टिकोण का एक और महत्वपूर्ण लाभ यह है कि यदि पृष्ठ को फ़ील्ड जोड़ने, हटाने या संशोधित करने के लिए कभी भी अपडेट किया गया है, तो आपको केवल अपनी फॉर्मइन्फो ऑब्जेक्ट और फिलफॉर्म फ़ंक्शन को अपडेट करने की आवश्यकता होगी, और फ़िलफ़ॉर्म फ़ंक्शन को कॉल करने वाले विशिष्ट परीक्षण मामलों को संशोधित करने की आवश्यकता नहीं होगी - मानते हैं कि वे आपकी सामान्य फॉर्मइन्फो वस्तुओं में से एक का उपयोग कर रहे हैं। अधिक कवरेज प्राप्त करने की एक और संभावना है कि आप अपने सामान्य फॉर्मइन्फो ऑब्जेक्ट्स में से प्रत्येक को उन सभी फ़ील्ड के लिए यादृच्छिक तार उत्पन्न करें जो सभी अलग-अलग अनुमत वर्णों के बीच न्यूनतम/अधिकतम लंबाई और चक्र का अनुपालन करते हैं। यह आपको परीक्षणों के एक ही सेट से कुछ अतिरिक्त परीक्षण प्राप्त करने की अनुमति देता है, हालांकि यदि आप केवल विशिष्ट तारों से विफलता परिणाम प्राप्त करना शुरू करते हैं तो यह कुछ शोर भी जोड़ सकता है, इसलिए सावधान रहें।

9

पेज ऑब्जेक्ट मॉडल के पीछे विचार यह है कि यह कार्यान्वयन फोन करने वाले से दूर सार है। पहली तंत्र में, आप सफलतापूर्वक ऐसा कर रहे हैं क्योंकि कॉलर को यह जानने की आवश्यकता नहीं है कि HTML इनपुट फ़ील्ड नाम "firstName" से "user_first_name" में बदलता है, जबकि आपके दूसरे कार्यान्वयन में वास्तविक पृष्ठ में कोई भी परिवर्तन होना होगा अपने पेज ऑब्जेक्ट के सभी कॉलर्स के लिए उलझा हुआ।

इसे और अधिक हो सकता है, अपने पेज वस्तु बनाने के लिए यदि आप कैप्सूलीकरण बनाए रखने के लिए यह लंबे समय में काम बचा सकते हैं जब असली html पृष्ठ अनिवार्य रूप से बदल जाता है करने के लिए सामने तक काम कर सकते हैं।

+0

धन्यवाद डिजिटल जोएल, कैसे बनाएं पृष्ठ के शीर्ष पर परिभाषित सार्वजनिक लोकेटर चर (कैसे) के साथ पृष्ठ और फिर मेरी टेस्ट क्लास में, मैं उस पृष्ठ को तुरंत चालू करता हूं और मैं जेनेरिक fillInform में लोकेटर चर में पास करता हूं। उस अर्थ में, अभी भी मेरे चर एक स्थान पर हैं, पृष्ठ वस्तु, और मेरे सभी परीक्षण उन चरों का संदर्भ देंगे, इसलिए जब वे परिवर्तन करते हैं, तो मुझे अभी भी एक स्थान पर बनाए रखना होगा। –

+0

यह करने का एक तरीका होगा। सार्वजनिक स्थिर अंतिम फ़ील्ड के रूप में नाम रखने और फिर एक विधि की आपूर्ति करना। यह तब तक काम करता है जब तक आपको एक मूल्य के लिए कुछ विशेष प्रसंस्करण करने की आवश्यकता नहीं होती है, तो आपके पास 'myPage.setSpecialValue (blah)' के लिए एक अलग विधि है और अन्य सभी चीज़ों के लिए आपके पास 'myPage.fillInForm (MyPage.MY_NAME, blah)' है और यह है असंगत, लेकिन यह एक ऐसा पुल हो सकता है जिसे आप पार कर सकते हैं जब आप इसके लिए निर्माण करने के बजाय इसके पास आते हैं। यह आप पर निर्भर करता है। – digitaljoel

+2

सर्वश्रेष्ठ "धन्यवाद" कुछ उत्तरों को अप-वोट करना होगा। आपके सवालों के 14 उत्तरों में से आपने केवल 4 उत्तरों को वोट दिया है और किसी भी उत्तर को स्वीकार नहीं किया है। मैं सिर्फ मेरे जवाब के बारे में बात नहीं कर रहा हूं, लेकिन किसी भी उत्तर जो आपको उपयोगी लगता है (जैसे इस प्रश्न पर सैम वुड्स द्वारा) एक को वोट दिया जाना चाहिए। – digitaljoel

0

जिस तरह से मैं अपने रूपों में ऐसा करता हूं वह पृष्ठ पर सभी इनपुट की सूची प्राप्त करना है। फिर प्रदर्शित किए गए किसी भी इनपुट तत्व को हटा दें। उसके बाद मैं प्रत्येक इनपुट में वैध या अमान्य पाठ डाल सकता हूं। वहां से मैं यह सुनिश्चित करने के लिए सत्यापन सारांश प्राप्त करता हूं कि मुझे सही त्रुटि मिल रही है या नहीं। यदि नहीं तो अपवाद लॉग अप करें।

क्या करता है इनपुट पाठ करने के लिए मुझे के रूप में कई आदानों में अनुमति देने के रूप में पृष्ठ पर हैं, और यह अभी भी मुझे अपवाद लॉग इन करें और ई-मेल के माध्यम से उन्हें भेजने के लिए अनुमति देता है। मैं अपनी सूची में टेक्स्टरेस और पासवर्ड फ़ील्ड भी पकड़ता हूं और मेरे पास चेकबॉक्स फ़ील्ड्स और विकल्पों के लिए एक अलग सूची है क्योंकि अलग-अलग चीजें हैं जिन्हें मैं आमतौर पर उन लोगों के साथ करना चाहता हूं।

क्या यह करने पर निर्भर करता सब मैं एक पृष्ठ का परीक्षण करने क्या करना है यह है:

for (int i = 0; i < inputs.Count(); i++) 
{ 
    //This captures the error message string created in the input validation method 
    //nextButton is the IWebElement of the button to click to submit the form for validation 
    //ErrorMessageID is the ID of the Validation Summary display box (i.e. ErrorMessageID = "FormSummary" <asp:ValidationSummary ID="FormSummary" runat="server" CssClass="errorMessage" /> 

    string InputValidationText = utilities.InputValidation(driver, inputs, i, nextButton, ErrorMessageID) 
    if(InputValidationText != string.Empty) 
    { 
    //LogError 
    } 
} 
1

अपने enterWhatever() तरीकों के अलावा, मैं आमतौर पर यह भी एक createWhatever(field1, field2, ...) विधि है, जो मैं बनाने के लिए एक तेज पथ जो कुछ भी रूप बनाता है, उपयोग के लिए जब असली परीक्षण करने के उद्देश्य कुछ और है के रूप में उपयोग कर सकते हैं पैदा करते हैं। इस प्रकार, यदि मुझे टिकट जमा करने के लिए ग्राहक बनाने की आवश्यकता है, तो परीक्षण CreateACustomer पृष्ठ पर जाता है और केवल createCustomer(firstName, lastName, emailAddress, ...) को आमंत्रित करता है, और फिर उस ग्राहक का उपयोग करके टिकट बनाने के अधिक प्रचलित कार्य पर जारी रहता है।

1

मैं पाठकों के लाभ के लिए एक पुराने प्रश्न का उत्तर देते।

यहां अन्य अच्छे उत्तरों के साथ, मैं उन लोगों के लिए यहां कुछ सुझाव जोड़ना चाहता हूं जो पीओएम के लिए नए हैं।

पृष्ठ ऑब्जेक्ट्स एक प्रसिद्ध डिजाइन पैटर्न है, जिसे स्वचालन इंजीनियरों द्वारा व्यापक रूप से स्वीकार किया जाता है, ताकि प्रत्येक तत्व के लिए अलग-अलग वर्ग फ़ाइल बनाने के लिए वर्ग के तरीकों के रूप में सभी तत्वों को गुणों और उनके व्यवहार/व्यावसायिक कार्यक्षमताओं के रूप में समूहित किया जा सके। लेकिन यह एक पृष्ठ के लिए एक वर्ग बनाने में कुछ मुद्दों है - खासकर जब पेज एक ग्रिड/कैलेंडर विजेट/HTML तालिका आदि

वर्ग भी कई जिम्मेदारियों शामिल हो सकता है जैसे तत्वों/जटिल तत्व की अधिक/विभिन्न सेट है संभालने के लिए। इसे पुनर्गठित किया जाना चाहिए और छोटे वर्गों में तोड़ दिया जाना चाहिए। हां, Single Responsibility Responsible के बाद।

इस विचार के लिए यहां छवि को देखें।

enter image description here

यही है, पुन: प्रयोज्य पेज टुकड़े बनाने & मुख्य पृष्ठ वस्तु पेज टुकड़े की सेवा करते हैं।

अधिक जानकारी के लिए here देखें।

संबंधित मुद्दे