TL;DR: @Page-injected オブジェクトに対してロードする (相対) URL をグラフェンに伝えるにはどうすればよいですか?
「最先端」、つまりArquillian、Arquillian Drone、Selenium 2、Graphene 2の組み合わせを使用して、Webフロントエンド統合テストをセットアップしようとしています.
Arquillian、Drone、およびプレーンな Selenium WebDriver (つまり、Graphene 固有のものなし) を使用すると、テストは次のようになります。
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RunWith(Arquillian.class)
public class LoginIT {
private static final Logger LOG = LoggerFactory.getLogger(LoginIT.class);
@Deployment
public static WebArchive createDeployment() {
return Maven.resolver().loadPomFromFile("pom.xml")
.resolve("de.zalando:purchasing-frontend-general:war:?")
.withoutTransitivity().asSingle(WebArchive.class);
}
@Drone
WebDriver driver;
@ArquillianResource
URL deploymentUrl;
@Test
@RunAsClient
public void testLoginPage() {
LOG.info("executing test!");
driver.get(deploymentUrl + "");
final String title = driver.getTitle();
LOG.info("title: " + title);
Assert.assertEquals("Login page title is wrong",
"Zalando General Purchasing – Login", title);
}
}
(ShrinkWrap のドキュメントが最新ではないため、展開を正しく行うのに時間がかかりました。)
この簡単なテストは、ホームページからログイン ページにリダイレクトされるかどうか、およびそのタイトルが正しいかどうかを確認するだけです。できます。
Graphene 2 は、重要な新機能「自動配線」ページの抽象化を追加します。次に、私のテストは次のようになります (上記のインポートと展開部分を省略します)。
@RunWith(Arquillian.class)
public class LoginIT {
private static final Logger LOG = LoggerFactory.getLogger(LoginIT.class);
@Deployment
public static WebArchive createDeployment() {
// as above
}
@Page
LoginPage loginPage;
@Test
@RunAsClient
public void testLoginPage() {
String title = loginPage.getTitle();
LOG.info("title: " + title);
Assert.assertEquals("Login page title is wrong",
"Zalando General Purchasing – Login", title);
}
}
この「ページ抽象化」オブジェクトの使用:
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class LoginPage {
@FindBy(tagName = "title")
private WebElement titleElement;
public String getTitle() {
return titleElement.getText();
}
}
これは実際に機能し、私のテストは失敗せず、正しいタイトルも出力します。
しかし、これはまったく機能しません (なぜ機能すると思われるのかはわかりません。以前のテストの出力を見たに違いありません) ...
「org.openqa.selenium.NoSuchElementException: Unable to locate element with name: title」という非常に長いスタック トレースが表示されます (Arquillian、Graphene、Java Reflection API、Maven Surefire プラグイン、および 2 行のコードのすべて)。 )。
メソッドをデバッグすると、最終的に Html-Element へのアクセスが試行され、手元にあるabout:blank
HtmlPage はログイン ページではなくページであることがわかります。
これはどのように機能するはずですか?そして、なぜそれは私にとってうまくいかないのですか?
次に、ログイン ページ以外のページをテストしたいので、別の開始 URL を使用する必要があります。
プレーンな Drone+ Selenium Webdriver では、単純に使用します
driver.get(deploymentUrl + "/otherPage");
テストの最初の行として。しかし、Graphene 2 の @Page-Annotation をどうするのでしょうか?
@Page-injected オブジェクトをロードする URL (deploymentUrl に関連する) をグラフェンに伝えるにはどうすればよいですか?