2

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:blankHtmlPage はログイン ページではなくページであることがわかります。

これはどのように機能するはずですか?そして、なぜそれは私にとってうまくいかないのですか?

次に、ログイン ページ以外のページをテストしたいので、別の開始 URL を使用する必要があります。

プレーンな Drone+ Selenium Webdriver では、単純に使用します

driver.get(deploymentUrl + "/otherPage");

テストの最初の行として。しかし、Graphene 2 の @Page-Annotation をどうするのでしょうか?

@Page-injected オブジェクトをロードする URL (deploymentUrl に関連する) をグラフェンに伝えるにはどうすればよいですか?

4

2 に答える 2

2

私は個人的に継承とジェネリックを使用してこれを実現しています(ただし、これは最善の解決策ではないかもしれません)。たとえば、ここで見ることができます。このように AbstractPage を定義する必要があります

public interface AbstractPage {

    public abstract String getURL();
}

@RunWith(Arquillian.class)
public abstract class AbstractWebDriverTest<P extends AbstractPage> {

    @Page
    private P page;

    @Before
    public void goToUrl() {
        driver.get(deploymentURL + page.getURL());
    }
}

次に、各テスト クラスが でAbstractPage指定されたページで実装され<>ます。そのサンプル プロジェクトを見てください。お役に立てば幸いです。

于 2013-08-05T07:09:39.880 に答える