2012-04-25 4 views
9

Быстрый вопрос об объектах страницы в веб-селене. наш сайт очень динамичен с большим количеством состояний ajax и различных состояний аутентификации. Трудно понять, как определить каждый объект страницы, но позволяет сказать, что я понял это и определил несколько объектов страницы, которые представляют наш сайт.Объект страницы Selenium WebDriver

Как вы справляетесь с переходом со страницы на страницу. Поэтому я получаю объект страницы для своей домашней страницы и один для моей учетной записи и один для моей страницы результатов. Затем мне нужно написать тест, который пересекает все мои страницы, чтобы имитировать пользователя, выполняющего несколько действий.

Как вы говорите, дайте мне объект HomePage для создания нового использования -> затем запустите объект страницы учетной записи, чтобы выполнить некоторые действия пользователя, а затем получите объект страницы результатов, чтобы проверить все действия из одного сценария.

Как люди это делают?

благодаря

+0

Что именно вы подразумеваете под «страничным объектом»? – Alp

ответ

10

Когда вы имитируя имея пользователь вводит новую ссылку в строке URL-адреса браузера, тогда тестовый класс отвечает за создание требуемого объекта страницы.

С другой стороны, когда вы выполняете какую-либо операцию на странице, которая приведет к тому, что браузер укажет на другую страницу - например, нажав ссылку или отправив форму, - тогда это несет ответственность за эту страницу объект для возврата объекта следующей страницы.

Поскольку я не знаю достаточно о взаимоотношениях между вашей домашней страницей, страницей аккаунта и страницей результатов, чтобы рассказать вам, как именно это будет происходить на вашем сайте, я буду использовать приложение интернет-магазина в качестве примера вместо.

Предположим, у вас есть SearchPage. Когда вы отправляете форму в SearchPage, она возвращает страницу результатов. И когда вы нажимаете на результат, вы получаете ProductPage. Таким образом, классы будут выглядеть следующим образом (сокращенно только соответствующими методами):

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

Это то, что я думал, что мне нужно делать. это просто немного неуклюже, так как наш сайт очень ajaxy, и действия на сайте возвращаются в разные места в зависимости от того, в каком состоянии находится пользователь. – ducati1212

+0

Проблема с этим кодом заключается в том, что каждой странице нужно вызвать PageFactory.initObjects() и экземпляр драйвера не может инициализировать все объекты на двух разных страницах (скажем, это два разных окна или встроенный фрейм). Итак, хотя я согласен, что это отличный дизайн для многих вещей, этот шаблон быстро ломается и работает только для определенных приложений. Способ WebDriver PageFactory разработан, гораздо лучше открыть объект страницы, использовать его, пометить его для сбора мусора, затем создать экземпляр следующей страницы, использовать его и т. Д. Возможно, вы могли бы расширить PageFactory, возможно, обходным путем. – djangofan

4

Ну, я создал свои собственные классы Java, которые представляют собой страницы:

скажем, ниже код, чтобы представить домашнюю страницу. Здесь пользователь может войти в систему:

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

Мне нравится писать тесты Selenium Webdriver с использованием шаблона объекта страницы. Но лично раздражался многословием и повторением необходимости всегда явно создавать экземпляр и возвращать следующий компонент страницы или страницы. Поэтому, пользуясь метаклассами Python, я написал library, called Keteparaha, that automatically figures out what should be returned from a selenium page object's method calls.

2

Обычно вы хотите смоделировать то, что на самом деле делает пользователь при использовании вашего сайта. При использовании страниц страницы это заканчивается тем, что используется в виде домена (DSL). Тем не менее, он запутывается с компонентами страниц многократного использования.

Теперь, когда Java 8 отключен с использованием методов по умолчанию, повторно используемые компоненты страниц можно рассматривать как mixins, используя методы по умолчанию. У меня есть сообщение в блоге с некоторыми примерами кода, найденными здесь, что объясняет это более подробно: http://blog.jsdevel.me/2015/04/pageobjects-done-right-in-java-8.html

Смежные вопросы