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注釈を使用したページ オブジェクトです。次に、各ページに 1 つずつ、2 つのテスト クラスを作成しました。

ログインページのテスト。ログインして、次の (ようこそ) ページの要素を確認してください。

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

  }      
}

これは機能しますが、テストケースから冗長なログインを抽出して、維持する必要がある場所を 1 つだけ取得したいと考えています。過去数時間に読んだすべてのチュートリアルと 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ようないくつかの(古い)セレンの質問の提案と同様に、ログインページを手動で開くメソッドを作成しようとしました。そのため、次のクラスを作成しましたが、ログインページの 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());
  }

} 

しかし、これには 2 つの問題があります。最初に、私のページ オブジェクトの URL がテストでハード コードされています (おそらく [この質問のようなリフレクション API を使用する] が回避策です)。2 番目の問題は、WelcomePageページが開かれていないため機能しないことです。バージョン ラベルが見つかりません。

org.openqa.selenium.NoSuchElementException: ID の要素が見つかりません: ラベル

ログインを非冗長メソッドに抽出し、それぞれの前に実行@Testして有効なオブジェクトを提供するソリューションを知っている人はいますか?

4

0 に答える 0