Всем привет.
Изучаю Page Object Pattern. Написал два класса для реализации этого шаблона и проверил два тест-кейса (все работает). Хотелось бы услышать насколько то, что я написал, похоже на Page Object (правильно ли я понимаю идею), на что обратить внимание при написании, какие вопросы стояли перед вами, когда вы писали свой первый Page Object фреймворк? В общем любые советы.
Класс один GoogleTest:
package Google;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class GoogleTest extends InitialTestClass {
private String url = "https://www.google.com/ncr";
private By searchFieldLocator = By.name("q");
private String requiredText = "Selenium";
private By searchResultLocator = By.xpath("//div[@class='srg']//a[text()='Selenium - Web Browser Automation']");
private String expectedResultText = "Selenium - Web Browser Automation";
private By signInButton = By.xpath("//a[text()='Sign in']");
private By emailField = By.id("identifierId");
private String requiredEmail = "selenium@selenium.org";
private By emailResultLocator = By.xpath("//div[contains(text(), 'find your Google Account')]");
private String expectedEmailResultText = "Couldn't find your Google Account";
@BeforeMethod
public void setup() {
initializeDriver();
}
@Test
public void googleSearchText() {
setPropertyWindow(driver);
open(url);
searchText(driver, searchFieldLocator, requiredText);
assertEquals(actual(searchResultLocator), expectedResultText);
}
@Test
public void googleSignInWrongEmail() {
setPropertyWindow(driver);
open(url);
signIn(driver, signInButton);
inputEmail(driver, emailField, requiredEmail);
assertEquals(actual(emailResultLocator), expectedEmailResultText);
}
@AfterMethod
public void closeDown() {
delay(3000); //чисто для посмотреть
driver.close();
}
}
И второй класс InitialTestClass:
package Google;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
public class InitialTestClass {
static WebDriver driver;
public WebDriver initializeDriver() {
DesiredCapabilities capabilitiesFirefox = new DesiredCapabilities();
capabilitiesFirefox.setCapability("marionette", true);
System.setProperty("webdriver.gecko.driver", "e:\\Autogecko\\Udemy\\src\\test\\resources\\Geckodriver 0.16.1\\geckodriver.exe");
driver = new FirefoxDriver(capabilitiesFirefox);
return driver;
}
public WebDriver setPropertyWindow(WebDriver driver) {
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
return driver;
}
public void open(String url) {
driver.get(url);
}
public void delay (long millisec) {
try {
Thread.sleep(millisec);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public WebDriver searchText(WebDriver driver, By locator, String text) {
driver.findElement(locator).sendKeys(text, Keys.ENTER);
return driver;
}
public String actual(By locator) {
return driver.findElement(locator).getText();
}
public WebDriver signIn(WebDriver driver, By locator) {
driver.findElement(locator).click();
return driver;
}
public WebDriver inputEmail(WebDriver driver, By locator, String text) {
driver.findElement(locator).sendKeys(text, Keys.ENTER);
return driver;
}
}
Есть ощущение, что первые две строки в методах setPropertyWindow(driver);
и open(url);
тоже можно куда-то вынести, но, если, например, в третьем тесте, который здесь потенциально будет URL изменится, то уже и резона как бы нет…
Есть ощущения, что в классе InitialTestClass
хорошо бы оставить только методы для инициализации драйвера и настройки окна браузера initializeDriver()
и setPropertyWindow()
, а остальные методы, которые отображают непосредственно саму реализацию методов вынести куда-то в третий класс исключительно для реализации логики методов.
После каждого теста я закрываю драйвер и для следующего теста я открываю его заново. По времени, конечно дольше, но, вроде как для чистоты теста то что надо, как мне кажется. Может не правильно?