Как сделать вход в до аннотированный метод с использованием графена?
Я изучаю графен и создал на странице объекты для страницы входа и страницы приветствия.
Страница авторизации
@Location("myurl/login.xhtml")
public class LoginPage {
@Drone
private WebDriver driver;
@FindBy(id = "username")
private WebElement txtUserName;
@FindBy(id = "password")
private WebElement txtPassword;
@FindBy(id = "loginbutton")
private WebElement btnLogin;
public WebElement txtUserName() {
return txtUserName;
}
public WebElement getTxtPassword() {
return txtPassword;
}
public WebElement getBtnLogin() {
return btnLogin;
}
public void login(String username, String password) {
this.txtUserName().clear();
this.getTxtPassword().clear();
this.txtUserName().sendKeys(username);
this.getTxtPassword().sendKeys(password);
// Submit form and get redirect to welcome page
Graphene.guardHttp(this.getBtnLogin()).click();
}
}
Страница приветствия:
@Location("myurl/")
public class WelcomePage {
@Drone
private WebDriver driver;
@FindBy(tagName = "nav")
NavigationFragment navigation;
@FindBy(id = "version")
WebElement labelVersion;
public WebElement getLabelVersion() {
return labelVersion;
}
public NavigationFragment getNavigation() {
return navigation;
}
}
Как вы можете видеть объекты моей страницы, используя @Location
аннотаций. Затем я создал два тестовых класса, по одному для каждой страницы:
Тест страницы входа. Попробуйте войти и проверить элемент следующей (приветственной) страницы.
public class LoginpageTest {
@Drone
protected WebDriver browser;
@ArquillianResource
protected URL baseUrl;
@Test
public void testLogin(@InitialPage LoginPage page) {
// Login into page
page.login("username", "password");
// Check version label is showing correct version
WebElement versionLabel = browser.findElement(By.id("version"));
Assert.assertEquals("Wrong version", "Version 0.2.4", versionLabel.getText());
}
}
Тестовая страница приветствия.
public class WelcomepageTest {
@Drone
protected WebDriver browser;
@ArquillianResource
protected URL baseUrl;
@Page
private WelcomePage page;
@Test
public void testVersion(@InitialPage LoginPage loginpage) {
// Login into page
loginpage.login("username", "password");
// Check version label is showing correct version
Assert.assertEquals("Versionslabel falsch", "Version 0.2.4", page.getLabelVersion().getText());
}
@Test
public void testSomethingElse(@InitialPage LoginPage loginpage) {
// Login into page
loginpage.login("username", "password");
// Check something else
}
}
Это работает, но я хотел бы извлечь избыточный логин из тестового набора, чтобы у меня было только одно место, где его нужно поддерживать. Все учебники и вики-статьи, которые я прочитал за последние несколько часов, всегда выполняют вход снова и снова в каждом тестовом методе. Поскольку я хотел бы избежать этого, я попытался извлечь его в @Before
метод как это:
public class BeforeWelcomepageTest {
@Drone
protected WebDriver browser;
@ArquillianResource
protected URL baseUrl;
@Page
private WelcomePage page;
@Before
public void login(@InitialPage LoginPage loginpage) {
// Load loginpage via @InitialPage and do login
loginpage.login("username", "password");
}
@Test
public void testVersion() {
// Login should be done via @Before - method
// Check version label is showing correct version
Assert.assertEquals("Versionslabel falsch", "Version 0.2.4", page.getLabelVersion().getText());
}
}
Но это дает мне следующее IllegalArgumentException
исключение:
java.lang.IllegalArgumentException: неверное количество аргументов
Так что я думаю, что метод аннотируется @Before
не должно содержать никаких аргументов.
Затем я попытался написать @Before
-метод, чтобы вручную открыть страницу входа, аналогично предложениям в нескольких (более старых) вопросах селена, подобных этому. Поэтому я создал следующий класс, но изо всех сил пытался открыть URL-адрес моей страницы входа в систему, логина и "земли" на моей странице приветствия.
public class SecondBeforeWelcomepageTest {
@Drone
protected WebDriver browser;
@ArquillianResource
protected URL baseUrl;
@Page
private LoginPage loginpage;
@Page
private WelcomePage page;
@Before
public void login() {
// Load loginpage via browser
browser.get(baseURL + "myurl/");
// Same with
// Graphene.goTo(LoginPage.class)
// do login
loginpage.login("username", "password");
}
@Test
public void testVersion() {
// Login should be done via @Before - method
// Check version label is showing correct version
Assert.assertEquals("Versionslabel falsch", "Version 0.2.4", page.getLabelVersion().getText());
}
}
Но это приносит две проблемы: во-первых, URL-адрес моего объекта страницы жестко запрограммирован в тесте (может быть, [использование отражающего API, как в этом вопросе) - это обходной путь. Вторая проблема: он не работает как WelcomePage
страница не открывается, и поэтому метка версии не найдена.
org.openqa.selenium.NoSuchElementException: невозможно найти элемент с идентификатором: label
Кто-нибудь знает решение для извлечения имени входа в не избыточный метод, выполняемый перед каждым @Test
и предоставить действительные объекты?