2012-10-31 15 views
7

मैं एक ऐसी टीम पर काम कर रहा हूं जो कुछ महीनों के लिए सेलेनियम वेबड्राइवर इंफ्रास्ट्रक्चर विकसित कर रहा है, और परीक्षण मामलों और पेज ऑब्जेक्ट्स से ड्राइवर ऑब्जेक्ट तक पहुंचने के तरीके के बारे में कुछ मुझे परेशान कर रहा है।वेबड्राइवर के काम की प्रतिलिपि बनाने/गुजरने के तरीके, और क्या यह खतरनाक है?

हमारे परीक्षण के मामले एक नया वेबड्राइवर उदाहरण बनाते हैं और ब्राउज़र खोलते हैं। यह नया उदाहरण टेस्ट केस क्लास में संग्रहीत है।

फिर, परीक्षण केस पृष्ठ वस्तु को तुरंत चालू करता है। Selenium's Page Object Pattern के साथ-साथ, ये पृष्ठ ऑब्जेक्ट वेबड्राइवर को उनके कन्स्ट्रक्टर में पैरामीटर के रूप में लेते हैं (हालांकि मुझे लगता है कि हमारे संस्करण में यह अंतिम नहीं है)। विभिन्न पेज ऑब्जेक्ट विधियां उस पृष्ठ का उपयोग करती हैं जो पेज ऑब्जेक्ट के कन्स्ट्रक्टर में सेट की गई थी जो वे करते हैं। यदि कोई पृष्ठ ऑब्जेक्ट विधि किसी नए पृष्ठ ऑब्जेक्ट पर नेविगेट करता है, तो वेबड्राइवर इसे पास कर दिया जाता है। बस सेलेनियम के उदाहरण की तरह:

public class LoginPage { 
    private final WebDriver driver; 

    public LoginPage(WebDriver driver) { 
     this.driver = driver; 

     // Check that we're on the right page. 
     if (!"Login".equals(driver.getTitle())) { 
      // Alternatively, we could navigate to the login page, perhaps logging out first 
      throw new IllegalStateException("This is not the login page"); 
     } 
    } 

    // Conceptually, the login page offers the user the service of being able to "log into" 
    // the application using a user name and password. 
    public HomePage loginAs(String username, String password) { 
     // This is the only place in the test code that "knows" how to enter these details 
     driver.findElement(By.id("username")).sendKeys(username); 
     driver.findElement(By.id("passwd")).sendKeys(password); 
     driver.findElement(By.id("login")).submit(); 

     // Return a new page object representing the destination. Should the login page ever 
     // go somewhere else (for example, a legal disclaimer) then changing the method signature 
     // for this method will mean that all tests that rely on this behaviour won't compile. 
     return new HomePage(driver); 
    } 
} 

इस बनाता है यह प्रतीत मानो WebDriver उदाहरण, अद्वितीय और महत्वपूर्ण है एक मशाल कि पेज वस्तु से पेज वस्तु को भेजे जाने चाहिए की तरह। कोड की शैली ने मुझे यह सोचने के लिए प्रेरित किया कि मुझे हमेशा यह सुनिश्चित करना था कि मैं ड्राइवर के उसी उदाहरण का उपयोग कर रहा था जिसका उपयोग अंतिम ऑपरेशन में किया गया था।

लेकिन यह "मशाल से गुजरना" ऐसी परिस्थितियों के साथ जटिल या असंभव हो जाता है जहां पृष्ठ पर एकाधिक पृष्ठ वस्तुएं होती हैं, और पृष्ठ ऑब्जेक्ट विधियां उस पृष्ठ ऑब्जेक्ट को वापस नहीं करती हैं जिसे आप अगले के साथ काम करने की योजना बना रहे हैं। जब आप स्क्रीन पर दो पेज ऑब्जेक्ट प्राप्त करते हैं, तो आप उसी वेबड्राइवर इंस्टेंस पर कैसे काम कर सकते हैं, और आपको नए पेज पर स्विच किए बिना या नए पेज ऑब्जेक्ट्स बनाने के बिना, उनके बीच वैकल्पिक करने की आवश्यकता है?

यह सब भ्रम मुझे विश्वास दिलाता है कि मशाल का कोई गुजरना वास्तव में आवश्यक नहीं है, या यहां तक ​​कि हो रहा है (क्या ये सभी पृष्ठ ऑब्जेक्ट्स उसी वेबड्राइवर इंस्टेंस के संदर्भ संग्रहीत कर रहे हैं?), लेकिन तब मुझे नहीं पता कि क्यों सेलेनियम द्वारा दिए गए विवरण में पैटर्न का सुझाव दिया गया था।

तो, क्या मुझे "मशाल पार करने" के बारे में चिंता करने की ज़रूरत है? या किसी भी पेज ऑब्जेक्ट को अपने वेबड्राइवर के साथ तुरंत चालू करने के बाद ठीक से काम करेगा, भले ही अन्य पेज ऑब्जेक्ट्स इंटरमीम में उसी वेबड्राइवर के अपने संस्करणों के साथ संचालन कर सकें?

क्या वेबड्राइवर को एक सिंगलटन बनाने के लिए यह आसान/बेहतर होगा, सभी के लिए सुलभ, क्योंकि हम किसी भी समय एक से अधिक वेबड्राइवर प्रति JVM का उपयोग नहीं करेंगे? फिर हमें कन्स्ट्रक्टर में वेबड्राइवर को पास करने की आवश्यकता नहीं होगी। किसी भी इनपुट के लिए पहले से ही धन्यवाद।

+1

अच्छी तरह से, अपने प्रोजेक्ट में मैं निम्नलिखित संरचना मिल गया है टेस्ट एनोटेशन)। तो बेससेलेनियमटेस्ट.जावा में मैं वेबड्राइवर ड्राइवर घोषित करता हूं; स्थिर चर के रूप में और इस तरह से मैं कई वेब ड्राइवर उदाहरण बनाने से बचता हूं। –

+0

बस इसे बाहर निकालने के लिए, कुछ ऐसे मामले हैं जहां आप कई वेबड्राइवर उदाहरण चाहते हैं यदि आपको किसी दिए गए उपयोग के मामले में दो अलग-अलग ब्राउज़रों के साथ काम करने की ज़रूरत है। – grumpasaurus

+0

"...तो मुझे नहीं पता कि सेलेनियम द्वारा दिए गए विवरण में उस पैटर्न का सुझाव क्यों दिया गया था। "क्या आप इसे एक लिंक प्रदान कर सकते हैं? मेरी यादें यह थी कि उन्होंने स्थिर तरीकों से वेबड्राइवर उदाहरण पारित किया। – grumpasaurus

उत्तर

4

पूरे ढांचे के लिए वेबड्राइवर को सिंगलटन के रूप में चिह्नित करना बेहतर है। मैं वर्तमान में इस पैटर्न का उपयोग कर रहा था और यह ठीक काम करता है।
नोट: समांतर निष्पादन से निपटने के दौरान देखभाल की जानी चाहिए।

@CodeEnthusiastic उदाहरण के लिए, एक वर्ग GeneralLibrary ले कि में एक WebDriver पैदा करते हैं। BaseSeleniumTest.java जो अन्य वर्गों (साथ @ tets का सेट युक्त के लिए बढ़ा दी है:

सुपर वर्ग के रूप में GeneralLibrary साथ में पृष्ठ ऑब्जेक्ट मॉडल कक्षाओं का विस्तार

+0

I निश्चित रूप से एक सिंगलटन का उपयोग करना पसंद करेंगे, खासकर यदि वेबड्राइवर वास्तव में कुछ प्रकार की राज्य जानकारी बनाए रखता है जो यह आवश्यक बनाता है कि सभी पेज ऑब्जेक्ट्स और ऑपरेशंस _same_ WebDriver का उपयोग करें। मैं _think_ नहीं करता हूं, हम उसी मशीन पर समानांतर निष्पादन करने की योजना बनाते हैं, उसी JVM के साथ। सेलेनियम के साथ अब तक मेरा अनुभव मुझे चिंता करता है कि ऐसा करने के लिए यह बहुत नाजुक है - मैं एक ब्राउज़र पर क्रियाओं को लेकर किसी अन्य पर निष्पादन को गड़बड़ कर रहा हूं। –

+0

@Rironin, प्रत्येक वेबड्राइवर इंस्टेंस एक सत्र आईडी से जुड़ा होता है, जिसे यादृच्छिक जेनरेट 32 बिट कुंजी के रूप में माना जा सकता है। तो एक ब्राउज़र क्रियाएं –

+0

पर अन्य को प्रभावित नहीं करती हैं यह समझ में आता है कि एक ब्राउज़र अन्य पर सीधे प्रभावित नहीं करेगा, लेकिन आईई विंडो फोकस में नहीं होने पर आईई विशेष रूप से स्वचालन चलाने में समस्या नहीं है? यदि ब्राउज़र विंडो को कम किया गया है, तो ब्राउजर विंडो को एक अलग ब्राउज़र विंडो द्वारा कवर किया गया है, तो सभी ऑटोमेशन कॉल समान रूप से अच्छी तरह से कार्य करते हैं? मुझे लगता है कि यह गारंटी देना असंभव होगा कि ब्राउज़र पर संचालित होने पर ध्यान केंद्रित किया जाएगा या यदि आप एक ही मशीन पर एक साथ कई परीक्षण चला रहे थे तो दिखाई देगा। –

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