Почему Selenium создает новый экземпляр RC и / или браузера между каждым тестовым элементом JUnit? - PullRequest
1 голос
/ 02 февраля 2012

Просто начинаю экспериментировать с Selenium 2.18. Почему Selenium создает новый экземпляр «Remote Control» между каждым тестовым элементом JUnit?

Я создал несколько модульных тестов под названием testA, testB, testC, и вот что происходит:

setUp:
0.  Create static instance of DefaultSelenium

testA:
1.  Selenium starts instance of "Remote Control"
2.  Selenium starts web browser an opens app

testB:
3.  Selenium starts new instance of "Remote Control"
4.  Selenium kills first instance of "Remote Control"
5.  Script sends existing browser to a URL on the local system (probably
    a temp file of some kind)

Итак, мой вопрос: почему я не могу заставить Selenium иметь только один постоянный экземпляр «Remote Control», а также один постоянный экземпляр веб-браузера в testA, testB и testC?

ПРИМЕЧАНИЕ: шаг № 5 касается меня: если этот шаг не перенаправил на локальный файл, возможно, что пульт дистанционного управления на шаге № 4 мог найти содержимое на странице. Это происходит потому, что новый экземпляр «Remote Control» не знает о существовании браузера, запущенного первым экземпляром «Remote Control»?

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;

@RunWith(Suite.class)
@SuiteClasses({ Tests.class })

public class AllTests {

    static SeleniumServer seleniumserver;

    @BeforeClass
    public static void setUpClass() throws Exception {
        RemoteControlConfiguration settings = new RemoteControlConfiguration();
        settings.setTrustAllSSLCertificates(true);
        seleniumserver=new SeleniumServer(settings);
        seleniumserver.boot();
        seleniumserver.start();
        System.out.println("Finished suite setUpClass");
    }
     ...

А для моего клиента:

public class Tests extends SeleneseTestBase {
private static DefaultSelenium selenium;

@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://localhost:8181/");
selenium.start();
}

public void testA() {  System.out.println("TestA");  }
public void testB() {  System.out.println("TestB");  }
public void testC() {  System.out.println("TestC");  }

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

Это должен быть способ, которым вы создаете экземпляр сервера. Попробуйте вызвать ваш экземпляр сервера с параметром -singleWindow.

Если вы вызываете сервер программно, инкапсулируйте вызов в аннотации @Before.

Вот пример:

@Before
public void startServer () throws Exception {
        RemoteControlConfiguration settings = new RemoteControlConfiguration();
        settings.setTrustAllSSLCertificates(true);
        SeleniumServer seleniumserver=new SeleniumServer(settings);
        seleniumserver.boot();
        seleniumserver.start();
...
}
2 голосов
/ 04 февраля 2012

Почему Selenium создает новый экземпляр "Remote Control" между каждым тестовым элементом JUnit?

Я думаю, это потому, что вы говорите это. Вы создаете свой объект селена в методе setUp () с аннотацией @Before jUnit. Это говорит jUnit запускать этот метод перед каждым тестом.

JUnit API Doc

0 голосов
/ 02 февраля 2012

Не могли бы вы опубликовать фрагмент вашего кода для уточнения? А также дайте нам знать, если вы используете jUnit 4.

В моем модульном тесте у меня только один браузер селена (или Selenium Remote control) для всех тестовых случаев.

Для каждого теста вы можете просто использовать функцию .open ("url"). Я инициализирую удаленное управление селеном только в одном месте внутри функции setUpBeforeClass () и закрываю удаленное управление селеном в tearDownAfterClass ()

Мой ответ основан на догадках, что вы не так делаете. Я могу помочь вам больше, когда увижу фрагмент кода.

0 голосов
/ 02 февраля 2012

В селене 2 это уже не так, но в версии 1 это действительно так.Я не нашел обходного пути для этого.

    private DefaultSelenium selenium;

private WebDriver driver;

@Before
public void setUp() throws Exception {
    startClient();
    startupHook();
}

protected abstract void startupHook() throws Exception;

private void startClient() {
    String sBrowserType = "*iexplore"; // For Firefox, use *firefox
    this.driver = new InternetExplorerDriver();
    selenium = new WebDriverBackedSelenium(driver, sBrowserType);
}

@After
public void tearDown() throws Exception {
    shutdownHook();
    stopClient();
}

protected abstract void shutdownHook() throws Exception;

private void stopClient() {
    if (selenium != null) {
        selenium.stop();
    }
}

Я добавил хук запуска и выключения на случай, если мне нужно очистить другие дополнительные ресурсы.

...