खोज…


परिचय

वेब साइटों और वेब अनुप्रयोगों को स्वचालित करने में एक महत्वपूर्ण भूमिका स्क्रीन पर वस्तुओं की पहचान करना और उनके साथ बातचीत करना शामिल है। स्थान और By क्लास के उपयोग के माध्यम से सेलेनियम में आइटम पाए जाते हैं। ये लोकेटर और इंटरैक्शन डुप्लिकेट कोड से बचने और रखरखाव को आसान बनाने के लिए पेज ऑब्जेक्ट के अंदर एक सर्वोत्तम अभ्यास के रूप में डाले गए हैं। यह WebElements को मान WebElements और मान WebElements कि पृष्ठ पर (या किसी वेब ऐप में पृष्ठ का हिस्सा) व्यवहार और जानकारी लौटा दी जाए।

टिप्पणियों

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

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

कुछ महत्वपूर्ण बिंदु जो आपको पृष्ठ ऑब्जेक्ट डिज़ाइन करते समय ध्यान में रखने चाहिए:

  1. पृष्ठ ऑब्जेक्ट आमतौर पर केवल पृष्ठों के लिए ही नहीं बनना चाहिए, बल्कि आपको पृष्ठ के महत्वपूर्ण तत्वों के लिए भी इसका निर्माण करना चाहिए। उदाहरण के लिए, आपके शिक्षाविदों के विभिन्न चार्ट दिखाने के लिए कई टैब वाले पृष्ठ में टैब की गिनती के समान पृष्ठ होने चाहिए।

  2. एक दृश्य से दूसरे तक नेविगेट करने से पृष्ठ कक्षाओं का उदाहरण वापस आ जाना चाहिए।

  3. उपयोगिता के तरीके जो केवल एक विशिष्ट दृश्य या वेबपेज के लिए होना आवश्यक है, केवल उस पृष्ठ वर्ग से संबंधित होने चाहिए।

  4. मुखर तरीकों को पृष्ठ कक्षाओं द्वारा ध्यान नहीं दिया जाना चाहिए, आपके पास बूलियन वापस करने के तरीके हो सकते हैं लेकिन उन्हें वहां सत्यापित न करें। उदाहरण के लिए, उपयोगकर्ता का पूरा नाम सत्यापित करने के लिए आपके पास बूलियन मान प्राप्त करने की विधि हो सकती है:

     public boolean hasDisplayedUserFullName (String userFullName) {
         return driver.findElement(By.xpath("xpathExpressionUsingFullName")).isDisplayed();
     }
    
  5. यदि आपका वेबपेज iframe पर आधारित है, तो iframes के लिए पृष्ठ कक्षाएं भी पसंद करें।

पेज ऑब्जेक्ट पैटर्न के लाभ:

  1. टेस्ट कोड और पेज कोड के बीच साफ अलगाव
  2. वेबपेज के यूआई में किसी भी परिवर्तन के मामले में, कई स्थानों पर अपना कोड बदलने की आवश्यकता नहीं है। केवल पृष्ठ कक्षाओं में बदलें।
  3. कोई बिखरे हुए तत्व लोकेटर नहीं।
  4. कोड को समझने में आसान बनाता है
  5. आसान रखरखाव

परिचय (जावा का उपयोग करके)

पेज ऑब्जेक्ट पैटर्न के आधार पर लॉगिन टेस्ट करने के लिए एक उदाहरण:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

/**
 * Class which models the view of Sign-In page
 */
public class SignInPage {
    
    @FindBy(id="username")
    private usernameInput;

    @FindBy(id="password")
    private passwordInput;

    @FindBy(id="signin")
    private signInButton;

    private WebDriver driver;

    public SignInPage(WebDriver driver) {
        this.driver = driver;
    }
    
    /**
     * Method to perform login
     */
    public HomePage performLogin(String username, String password) {
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        signInButton.click();
        return PageFactory.initElements(driver, HomePage.class);
    }
}


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
/**
 * Class which models the view of home page
 */
public class HomePage {
    @FindBy(id="logout")
    private logoutLink;

    private WebDriver driver;

    public HomePage(WebDriver driver) {
        this.driver = driver;
    }
    
    /**
     * Method to log out
     */
    public SignInPage logout() {
        logoutLink.click();
        wait.ForPageToLoad();
        return PageFactory.initElements(driver, SignInPage.class);
    }
}

/**
 * Login test class
 */
public class LoginTest {
    public void testLogin() {
        SignInPage signInPage = new SignInPage(driver);
        HomePage homePage = signInPage.login(username, password);
        signInPage = homePage.logout();
    }
}

सी#

पृष्ठ ऑब्जेक्ट्स में व्यवहार होना चाहिए, मुखरता के लिए वापसी जानकारी और संभवतः आरंभीकरण पर पृष्ठ तैयार राज्य विधि के लिए एक विधि। सेलेनियम एनोटेशन का उपयोग करके पेज ऑब्जेक्ट का समर्थन करता है। C # में यह इस प्रकार है:

using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;

public class WikipediaHomePage
{
    private IWebDriver driver;
    private int timeout = 10;
    private By pageLoadedElement = By.ClassName("central-featured-logo");

    [FindsBy(How = How.Id, Using = "searchInput")]
    [CacheLookup]
    private IWebElement searchInput;

    [FindsBy(How = How.CssSelector, Using = ".pure-button.pure-button-primary-progressive")]
    [CacheLookup]
    private IWebElement searchButton;

    public ResultsPage Search(string query) 
    {
        searchInput.SendKeys(query);
        searchButton.Click();
    }

    public WikipediaHomePage VerifyPageLoaded() 
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)).Until<bool>((drv) =>  return drv.ExpectedConditions.ElementExists(pageLoadedElement));

        return this;
    }
}

टिप्पणियाँ:

  • CacheLookup कैश में तत्व को बचाता है और प्रत्येक कॉल पर एक नया तत्व वापस करने से बचाता है। यह प्रदर्शन में सुधार करता है लेकिन गतिशील रूप से बदलते तत्वों के लिए अच्छा नहीं है।
  • searchButton के 2 वर्ग नाम और कोई ID नहीं है, इसीलिए मैं वर्ग नाम या आईडी का उपयोग नहीं कर सकता।
  • मैंने सत्यापित किया कि मेरे लोकेटर मुझे उस तत्व को वापस कर देंगे जिसे मैं डेवलपर टूल (क्रोम के लिए) का उपयोग करना चाहता हूं, अन्य ब्राउज़रों में आप फायरबग या इसी तरह का उपयोग कर सकते हैं।
  • Search() विधि किसी अन्य पृष्ठ ऑब्जेक्ट ( ResultsPage ) को वापस करती है क्योंकि खोज आपको किसी अन्य पृष्ठ पर पुनर्निर्देशित करती है।

बेस्ट प्रैक्टिसेज पेज ऑब्जेक्ट मॉडल

  • शीर्ष लेख और पाद लेख के लिए अलग-अलग फ़ाइलें बनाएँ (क्योंकि वे सभी पृष्ठों के लिए सामान्य हैं और यह उन्हें एक पृष्ठ का हिस्सा बनाने के लिए कोई मतलब नहीं है)
  • अलग-अलग फ़ाइल में सामान्य तत्व (जैसे खोज / पिछला / अगला आदि) रखें (विचार किसी भी तरह के दोहराव को हटाने और अलगाव को तार्किक रखने के लिए है)
  • चालक के लिए, एक अलग चालक वर्ग बनाने और चालक को स्थिर रखने के लिए एक अच्छा विचार है ताकि इसे सभी पृष्ठों तक पहुँचा जा सके! (मैं अपने सभी वेबपेजों का विस्तार DriverClass)
  • PageObjects में उपयोग किए गए फ़ंक्शंस को आवृत्ति और उस तरीके को ध्यान में रखते हुए सबसे छोटे संभव चैंक में तोड़ा जाता है (जिस तरह से आपने लॉगिन के लिए किया है- हालाँकि लॉगिन को एंटरयूनेम और एंटरपेस फ़ंक्शन में तोड़ा जा सकता है लेकिन फिर भी इसे बनाए रखना क्योंकि अधिकांशतः लॉगिन फंक्शन अधिक तार्किक होता है, इसलिए एंटर यू फ़ंक्शन को एंटरयूजरनाम और एंटरपासवर्ड फ़ंक्शन के लिए अलग-अलग कॉल के बजाय कॉल किया जाएगा)
  • PageObjects का उपयोग करने से ही एलिमेंट्स से टेस्ट स्क्रिप्ट को अलग करता है
  • अलग बर्तन फ़ोल्डर में उपयोगिता कार्य (जैसे DateUtil, excelUtils आदि)
  • अलग-अलग गोपनीय फ़ोल्डर में कॉन्फ़िगरेशन है (जैसे वातावरण को सेट करना जिस पर परीक्षण चलाने की आवश्यकता है, आउटपुट और इनपुट फ़ोल्डर को कॉन्फ़िगर करना)
  • विफलता पर स्क्रीनकैपर को शामिल करें
  • DriverClass में कुछ स्थिर प्रतीक्षा समय के साथ एक स्थिर प्रतीक्षा चर है जैसा कि आपने हमेशा किया है कि स्थिर प्रतीक्षा की बजाय सशर्त प्रतीक्षा करने की कोशिश करें: Wait.until (ExpectedConditions)। यह सुनिश्चित करता है कि प्रतीक्षा अनावश्यक रूप से निष्पादन को धीमा नहीं कर रही है।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow