私は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
して有効なオブジェクトを提供するソリューションを知っている人はいますか?