2012-04-25 15 views
9

सेलेनियम वेबड्राइवर में पृष्ठ ऑब्जेक्ट्स के बारे में त्वरित प्रश्न। हमारी साइट बहुत सारे गतिशील और विभिन्न प्रमाणीकरण राज्यों के साथ बहुत गतिशील है। प्रत्येक पेज ऑब्जेक्ट को परिभाषित करने का तरीका समझना मुश्किल है लेकिन कहें कि मैंने यह पाया है कि हमारी साइट का प्रतिनिधित्व करने वाले कई पेज ऑब्जेक्ट्स को परिभाषित और परिभाषित किया गया है।सेलेनियम वेबड्राइवर पेज ऑब्जेक्ट

आप पृष्ठ से पृष्ठ पर क्रॉसिंग कैसे संभालेंगे। तो मुझे अपने होम पेज के लिए एक पेज ऑब्जेक्ट मिलता है और एक मेरे खाता पृष्ठ के लिए और एक मेरे परिणाम पृष्ठ के लिए मिलता है। तो मुझे एक ऐसे परीक्षण को लिखने की ज़रूरत है जो मेरे सभी पृष्ठों को एक ऐसे उपयोगकर्ता को अनुकरण करने के लिए पार करे जो एकाधिक क्रियाएं कर रही हो।

आप कैसे कहते हैं कि मुझे एक नया उपयोग बनाने के लिए होमपेज ऑब्जेक्ट दें -> फिर कुछ उपयोगकर्ता क्रियाएं करने के लिए खाता पृष्ठ ऑब्जेक्ट प्राप्त करें - फिर एक ही स्क्रिप्ट से उन कार्रवाइयों को सत्यापित करने के लिए परिणाम पृष्ठ ऑब्जेक्ट प्राप्त करें।

लोग यह कैसे कर रहे हैं?

कहो, नीचे मुख पृष्ठ का प्रतिनिधित्व करने के कोड है:

धन्यवाद

+0

"पृष्ठ ऑब्जेक्ट" से आपका क्या मतलब है? – Alp

उत्तर

10

जब आप उपयोगकर्ता में एक नया URL दर्ज होने का अनुकरण कर रहे हैं ब्राउजर का यूआरएल बार, फिर पेज ऑब्जेक्ट को बनाने के लिए टेस्ट क्लास की ज़िम्मेदारी है।

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

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

मान लें कि आपके पास एक खोज पृष्ठ है। जब आप सर्चपेज पर फॉर्म जमा करते हैं, तो यह परिणाम पृष्ठ देता है। और जब आप परिणाम पर क्लिक करते हैं, तो आपको एक उत्पाद पृष्ठ मिलता है। तो कक्षाएं कुछ इस तरह (सिर्फ प्रासंगिक तरीकों को संक्षिप्त) दिखेगा:

public class SearchPage { 

    public void open() { 
     return driver.get(url); 
    } 

    public ResultsPage search(String term) { 
     // Code to enter the term into the search box goes here 
     // Code to click the submit button goes here 
     return new ResultsPage(); 
    } 

} 

public class ResultsPage { 

    public ProductPage openResult(int resultNumber) { 
     // Code to locate the relevant result link and click on it 
     return new ProductPage(); 
    } 

} 

इस कहानी को निष्पादित करने के कुछ इस तरह दिखेगा परीक्षा पद्धति:

@Test 
public void testSearch() { 

    // Here we want to simulate the user going to the search page 
    // as if opening a browser and entering the URL in the address bar. 
    // So we instantiate it here in the test code. 

    SearchPage searchPage = new SearchPage(); 
    searchPage.open(); // calls driver.get() on the correct URL 

    // Now search for "video games" 

    ResultsPage videoGameResultsPage = searchPage.search("video games"); 

    // Now open the first result 

    ProductPage firstProductPage = videoGameResultsPage.openResult(0); 

    // Some assertion would probably go here 

} 
तो जैसा कि आप देख सकते हैं

, पेज ऑब्जेक्ट्स का यह "चेनिंग" है जहां प्रत्येक व्यक्ति अगले को लौटाता है।

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

+0

यही वह है जो मैंने सोचा था कि मुझे करने की ज़रूरत है। यह थोड़ा सा गुंजाइश लगता है क्योंकि हमारी साइट बहुत अजीब है और साइट पर कार्रवाई अलग-अलग स्थानों पर लौटती है, इस पर निर्भर करता है कि उपयोगकर्ता वर्तमान में किस राज्य में है। – ducati1212

+0

इस कोड के साथ समस्या यह है कि प्रत्येक पृष्ठ को PageFactory.initObjects() और कॉल करने की आवश्यकता होती है। ड्राइवर उदाहरण सभी ऑब्जेक्ट्स को 2 अलग-अलग पृष्ठों पर प्रारंभ नहीं कर सकता है (मान लें कि वे 2 अलग-अलग विंडो या एम्बेडेड फ्रेम हैं)। इसलिए, जब मैं मानता हूं कि यह कई चीजों के लिए एक महान डिजाइन पैटर्न है, तो यह पैटर्न कुछ अनुप्रयोगों के लिए केवल काम करने के लिए जल्दी टूट जाता है। वेबड्राइवर पेजफैक्टरी जिस तरह से डिज़ाइन किया गया है, पेज ऑब्जेक्ट खोलने के लिए यह बेहतर है, इसका इस्तेमाल करें, इसे कचरा संग्रह के लिए चिह्नित करें, फिर अगले पृष्ठ को तुरंत चालू करें, इसका उपयोग करें, आदि। शायद आप वर्कअराउंड के रूप में पेजफैक्टरी का विस्तार कर सकते हैं। – djangofan

4

ठीक है, मैं अपने खुद के जावा वर्गों जो पृष्ठों का प्रतिनिधित्व बनाया। यहां उपयोगकर्ता लॉगिन कर सकता है:

public class HomePage{ 
    private WebDriver driver; 
    private WebElement loginInput; 
    private WebElement passwordInput; 
    private WebElement loginSubmit; 

    public WebDriver getDriver(){ 
    return driver; 
    } 

    public HomePage(){ 
    driver = new FirefoxDriver(); 
    } 

    public CustomerPage login(String username, String password){ 
    driver.get("http://the-test-page.com"); 
    loginInput = driver.findElement(By.id("username")); 
    loginInput.sendKeys(username); 
    passwordInput = driver.findElement(By.id("password")); 
    passwordInput.sendKeys(password); 
    loginSubmit = driver.findElement(By.id("login")); 
    loginSubmit.click(); 
    return new CustomerPage(this); 
    } 


} 

और ग्राहक के लिए पृष्ठ इस तरह दिख सकता है। यहाँ मैं प्रदर्शन कर रहा हूँ, कैसे प्राप्त करने के लिए, कहते हैं, उपयोगकर्ता द्वारा प्रवेश:

public class CustomerPage{ 
    private HomePage homePage; 
    private WebElement loggedInUserSpan; 

public CustomerPage(HomePage hp){ 
    this.homePage = hp; 
    } 

public String getLoggedInUser(){ 
     loggedInUserSpan = homePage.getDriver().findElement(By.id("usrLongName")); 
     return loggedInUserSpan.getText(); 
} 

} 

और परीक्षण इस तरह जा सकते हैं:

@Test 
public void testLogin(){ 
    HomePage home = new HomePage(); 
    CustomerPage customer = home.login("janipav", "extrasecretpassword"); 
    Assert.assertEquals(customer.getLoggedInUser(), "Pavel Janicek"); 
} 
1

मेरा सुझाव है कि आप एक ढांचे का उपयोग करें जो इन पैटर्न के लिए समर्थन प्रदान करता है। Geb वहां सबसे अच्छे में से एक है।नीचे उनके मैनुअल

Browser.drive { 
    to LoginPage 
    assert at(LoginPage) 
    loginForm.with { 
     username = "admin" 
     password = "password" 
    } 
    loginButton.click() 
    assert at(AdminPage) 
} 

class LoginPage extends Page { 
    static url = "http://myapp.com/login" 
    static at = { heading.text() == "Please Login" } 
    static content = { 
     heading { $("h1") } 
     loginForm { $("form.login") } 
     loginButton(to: AdminPage) { loginForm.login() } 
    } 
} 

class AdminPage extends Page { 
    static at = { heading.text() == "Admin Section" } 
    static content = { 
     heading { $("h1") } 
    } 
} 
0

से लिया गया एक उदाहरण है, मुझे पेज ऑब्जेक्ट पैटर्न का उपयोग करके सेलेनियम वेबड्राइवर परीक्षण लिखने का आनंद मिलता है। लेकिन व्यक्तिगत रूप से तत्काल तुरंत चालू करने और अगले पृष्ठ या पृष्ठ घटक को वापस करने की शब्दावली और पुनरावृत्ति पर नाराज था। तो पायथन के मेटाक्लास के लाभ के साथ मैंने library, called Keteparaha, that automatically figures out what should be returned from a selenium page object's method calls लिखा था।

2

आप आमतौर पर मॉडल करना चाहते हैं कि उपयोगकर्ता आपकी साइट का उपयोग करते समय वास्तव में क्या करता है। पेज ऑब्जेक्ट्स का उपयोग करते समय यह डोमेन विशिष्ट भाषा (डीएसएल) का रूप लेता है। हालांकि यह पुन: प्रयोज्य पेज घटकों के साथ भ्रमित हो जाता है।

अब जावा 8 डिफ़ॉल्ट विधियों के साथ बाहर है, पुन: प्रयोज्य पृष्ठ घटकों को डिफ़ॉल्ट विधियों का उपयोग करके मिश्रित के रूप में माना जा सकता है। मेरे पास यहां कुछ कोड नमूने के साथ एक ब्लॉग पोस्ट है जो इसे अधिक विस्तार से समझाता है: http://blog.jsdevel.me/2015/04/pageobjects-done-right-in-java-8.html

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