10

背景:
Selenium-server-2.25.0 を J-Unit 4 と組み合わせて使用​​して、GWT アプリのいくつかの UI テスト シナリオを実行しています。私の IDE (Netbeans 7.2) で、プロジェクトを右クリックして [テスト] を選択すると、Firefox ウィンドウが (当然のことながら) 全体にポップアップし、Selenium テストが期待どおりに実行されます。コマンドラインから、同じものを実行mvn integration-testして表示することもできます。

目標:
これらのテストを Xvfb ディスプレイでヘッドレスで実行しようとしていますが、これを Maven で動作させるのに問題があるようです。事前に手動で実行できますexport display=:2(:2 は私の Xvfb ディスプレイです)。その後、テストは非表示のディスプレイで正常に実行されます。

問題:ここからの完全なエントリをpom.xml に含めて run して
、 何も変わらないようです。Windows が全体的にポップアップし、Xvfb ディスプレイで実行されていないテストがまだ表示されます。取り出して再度実行しても、同じ結果になります。ただし、フェーズを から に変更すると、Maven無効なライフサイクル フェーズについて不平を言います。そのため、それが完全に無視されているわけではないことがわかり、適切な pom.xml を編集しています。<plugin>mvn integration-testpre-integration-testqwertyasdf

ありがとう!

4

1 に答える 1

8

「start-server」および「stop-server」の目標は、SeleniumRCサーバーを開始/停止することです。すべてのテストで代わりにWebDriverAPIを使用しているため、これは私が望んでいたことではありません。

どうやら、pomの「xvfb」ゴールは、指定されたライフサイクルフェーズ中にXvfbセッションを開始します-私はそれを前に見たことがなかったと思います。そして、その構成では、Xvfbが実行されているディスプレイの詳細を示すpropsファイルを書き込む場所を指定します。Javaコードでは、このファイルを読み取って、WebDriverの作成時にFirefoxBinaryに値を渡すことができます。

関連するpom.xmlビットは次のとおりです。

<properties>
    <displayProps>target/selenium/display.properties</displayProps>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <systemPropertyVariables>
                    <display.props>${displayProps}</display.props>
                </systemPropertyVariables>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>selenium-maven-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <id>xvfb</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>xvfb</goal>
                    </goals>
                    <configuration>
                        <displayPropertiesFile>${displayProps}</displayPropertiesFile>
                    </configuration>
                </execution> 
            </executions>  
        </plugin>
    </plugins>
</build>

これにより、最初の空きディスプレイ(:20以上)でXvfbが起動し、後でJavaコードで読み取って使用するpropsファイルに値が書き込まれます。

String xvfbPropsFile = System.getProperty("display.props");

FirefoxBinary ffox = new FirefoxBinary();
ffox.setEnvironmentProperty("DISPLAY", /*read value from xvfbPropsFile*/);
WebDriver driver = new FirefoxDriver(ffox);

これで、ドライバーは適切なディスプレイに表示されるFirefoxインスタンスを制御できるようになります。出来上がり!

于 2012-09-25T21:45:56.310 に答える