0

我正在学习 Graphene 并创建了登录页面和欢迎页面的页面对象。

登录页面

@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

  }      
}

这可行,但我想从测试用例中提取冗余登录,这样我只有一个需要维护的地方。我在过去几个小时内阅读的所有教程和 wiki 文章总是在每种测试方法中一遍又一遍地登录。由于我想避免这种情况,我尝试将其提取到这样的@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-method 来手动打开登录页面,类似于几个(较旧的)selenium questions like this one中的建议。因此,我创建了以下课程,但在打开我的登录页面的 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:无法找到 ID 为标签的元素

有谁知道将登录提取到非冗余方法中的解决方案,在每个方法之前执行@Test并提供有效对象?

4

0 回答 0