Как правильно настроить Selenium Maven Plugin для работы с Xvfb для запуска без головы

Фон:
Я использую selenium-server-2.25.0 в сочетании с J-Unit 4 для запуска нескольких сценариев тестирования пользовательского интерфейса для моего приложения GWT. В моей среде IDE (Netbeans 7.2) я могу щелкнуть правой кнопкой мыши по моему проекту, выбрать "Тест" и увидеть, как окна Firefox всплывают (как и должны), когда тесты Selenium работают так, как ожидалось. Из командной строки я также могу запустить mvn integration-test и увидеть то же самое.

Цель:
Я пытаюсь заставить эти тесты работать без головок на дисплее Xvfb, но у меня, похоже, возникают проблемы с этим, чтобы работать с Maven. Я могу вручную запустить export display=:2 (: 2, являющийся моим дисплеем Xvfb) заранее, а затем тесты затем выполняются на невидимом дисплее успешно.

Вопрос:
Кажется, что ничего не меняет , когда я включаю полную запись <plugin> из здесь в мой pom.xml и запускаю mvn integration-test. Я по-прежнему вижу, что Windows всплывает, и тесты, выполняемые не, отображаются на дисплее Xvfb. Если я выберу это и снова забегу, те же результаты. Когда я изменяю фазу от pre-integration-test до qwertyasdf, однако Maven делает жалобы на недопустимую фазу жизненного цикла, поэтому я знаю, что не полностью игнорирую ее, и я редактирую соответствующий файл pom.xml.

Спасибо!

Ответ 1

Оказывается, цели "start-server" и "stop-server" предназначены для запуска/остановки серверов SeleniumRC. Это НЕ то, что я хотел, поскольку все мои тесты используют API WebDriver.

По-видимому, цель "xvfb" в pom DOES запускает сеанс Xvfb в течение указанной фазы жизненного цикла - я думаю, я просто не видел этого раньше. И в этой конфигурации вы указываете, где писать подробные описания реквизита, на которых отображается Xvfb. В коде Java этот файл можно прочитать, а значение передано в FirefoxBinary, используемое при создании WebDriver.

Соответствующие биты 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>

Это запускает Xvfb на первом бесплатном дисплее (: 20 или выше) и записывает значение в файл реквизита, который я читаю и использую позже в своем Java-коде.

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

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

Теперь драйвер будет контролировать экземпляр Firefox, развернутый на соответствующем дисплее. Вуаля!