2014-11-11 3 views
4

Я относительно новый инженер QA, который работает над изучением Selenium (на Java), и я хочу использовать объекты страниц для моделирования моих страниц.Почему я должен создавать экземпляры страницы, а не статические?

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

Я просто называю эти методы так, как они мне нужны, в моем тестовом коде.

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

Я знаю, что это признанная лучшая практика, но я хочу понять, почему. Благодарю.

Вот мой pageObject код, мои тесты вызывают методы, как LoginPage.login(username, password);

package pageObjects; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 


public class LogInPage { 
    private static By emailTxtB = By.id("user_email"); 
    private static By passwordTxtB = By.id("user_password"); 
    private static By logInButton = 
           By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/button"); 
    private static By signUpButton = By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/a"); 
    private static By valErrorMessage = By.id("flash_alert"); 

    public static void logIn(WebDriver driver, String email, String password){  
     //Fill out form 
     driver.findElement(emailTxtB).sendKeys(email); 
     driver.findElement(passwordTxtB).sendKeys(password); 

     //Submit form 
     driver.findElement(logInButton).click(); 
    } 


    public static void goToSignUp(WebDriver driver){ 
     driver.findElement(signUpButton).click(); 
    } 

    public static String getValErrorMessage(WebDriver driver){ 
     return driver.findElement(valErrorMessage).getText(); 
    } 

    public By getEmailTxtB(){ 
     return emailTxtB; 
    } 

    public By getPasswordTxtB(){ 
     return passwordTxtB; 
    } 

    public By getLogInButton(){ 
     return logInButton; 
    } 

    public By getSignUpButton(){ 
     return signUpButton; 
    } 
} 
+0

Это более общий вопрос программирования и на самом деле не привязан к Селену. Это скорее вопрос «какой смысл в OO, если я могу просто использовать статические переменные повсюду?» ..... http://programmers.stackexchange.com/questions/98083/cant-i-just- use-all-static-methods .... рассмотрим, есть ли у вас два диалога на экране. Как бы вы отличались друг от друга? – Arran

+0

Я думаю, что мой вопрос действительно касается случая объекта страницы в частности. В этом приложении, если у вас есть доступ к данной странице, он выглядит примерно так же, локаторы не меняются. Даже если кнопка не отображается, если вы не являетесь администратором, я хочу иметь возможность использовать локатор для проверки и убедиться, что его нет. Мне всегда говорили, что мои методы статичны, если они не зависят от каких-либо конкретных переменных экземпляра. Не могли бы вы сделать переменные экземпляра локатора вместо статического? – mleewing

+1

Я думаю, что создание объектов страницы как статических создает проблему, когда вы запускаете свой тест параллельно с разными браузерами, так как в многопоточных операциях статический не будет использоваться между двумя и более потоками. Просто попробуйте выполнить те же тесты параллельно с разными браузерами (драйверами) и проверить.Например: когда вы используете статический драйвер WebDriver и позже меняете его: драйвер = хром в одном потоке, а драйвер = firefox может создать проблему. – Babulu

ответ

2

Я начал работать с Selenium и Object Objects 2 месяца назад. И я также интересуюсь этой темой. Я решил пойти с классами и статическими методами около месяца назад. Но поскольку кодовая база выросла, я начал думать о переключении на экземпляры объектов. Основная причина - объекты могут иметь состояние. В объекте я могу проверить, действительно ли я работаю с правильной страницей. С классами я могу только предположить, что текущий html соответствует классу (или раздувает мой код с утверждениями в каждом статическом методе объекта страницы). Другая причина - автозаполнение. Статические методы побуждают тестировщиков использовать классы, а не переменные класса. Поэтому становится все труднее и сложнее найти правильный класс для вызова метода. С объектами вам придется объявить переменную, если вы хотите вызвать какой-либо метод. Таким образом, вы ограничены тем, что вы можете назвать. С классами и статическими методами вы можете вызывать любой метод в любое время (и не вызывать проверку, потому что ожидаемый html недоступен, например). Он начинает перерастать в проблему, когда вы пытаетесь научить членов вашей команды использовать ваш код. До тех пор, пока вы являетесь единственным автором теста, все может быть в порядке.

0

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

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