Я относительно новый инженер 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;
}
}
Это более общий вопрос программирования и на самом деле не привязан к Селену. Это скорее вопрос «какой смысл в OO, если я могу просто использовать статические переменные повсюду?» ..... http://programmers.stackexchange.com/questions/98083/cant-i-just- use-all-static-methods .... рассмотрим, есть ли у вас два диалога на экране. Как бы вы отличались друг от друга? – Arran
Я думаю, что мой вопрос действительно касается случая объекта страницы в частности. В этом приложении, если у вас есть доступ к данной странице, он выглядит примерно так же, локаторы не меняются. Даже если кнопка не отображается, если вы не являетесь администратором, я хочу иметь возможность использовать локатор для проверки и убедиться, что его нет. Мне всегда говорили, что мои методы статичны, если они не зависят от каких-либо конкретных переменных экземпляра. Не могли бы вы сделать переменные экземпляра локатора вместо статического? – mleewing
Я думаю, что создание объектов страницы как статических создает проблему, когда вы запускаете свой тест параллельно с разными браузерами, так как в многопоточных операциях статический не будет использоваться между двумя и более потоками. Просто попробуйте выполнить те же тесты параллельно с разными браузерами (драйверами) и проверить.Например: когда вы используете статический драйвер WebDriver и позже меняете его: драйвер = хром в одном потоке, а драйвер = firefox может создать проблему. – Babulu