Как сделать вход в до аннотированный метод с использованием графена?

Я изучаю графен и создал на странице объекты для страницы входа и страницы приветствия.

Страница авторизации

@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 и предоставить действительные объекты?

0 ответов

Другие вопросы по тегам