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

Только начинаю экспериментировать с Selenium 2.18. Почему Selenium создает новый экземпляр «Удаленного управления» между каждым тестовым элементом 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 иметь только один постоянный экземпляр «пульта дистанционного управления», а также один постоянный экземпляр веб-браузера в testA, testB и testC?

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

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");  }

person djangofan    schedule 02.02.2012    source источник


Ответы (4)


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

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

Вот пример:

@Before
public void startServer () throws Exception {
        RemoteControlConfiguration settings = new RemoteControlConfiguration();
        settings.setTrustAllSSLCertificates(true);
        SeleniumServer seleniumserver=new SeleniumServer(settings);
        seleniumserver.boot();
        seleniumserver.start();
...
}
person rs79    schedule 02.02.2012
comment
Это действительно очень помогло мне улучшить мою настройку и разборку, но не дало точного ответа на мой вопрос. Тем не менее, спасибо за просвещение. :-) Теперь я использую @BeforeClass для настройки сервера в классе Suite. - person djangofan; 03.02.2012

Почему Selenium создает новый экземпляр «Удаленного управления» между каждым тестовым элементом JUnit?

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

Документация по JUnit API

person el roso    schedule 04.02.2012
comment
Ааа... Думаю, ты можешь быть прав. Я попробую создать объект браузера в классе набора, используя аннотацию @BeforeClass. - person djangofan; 07.02.2012
comment
Попробуйте, если вы хотите поддерживать тот же сеанс браузера в своем наборе тестов, вам нужно убедиться, что вы создаете новый объект DefaultSelenium только один раз. - person el roso; 08.02.2012

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

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

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

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

person Watt    schedule 02.02.2012
comment
Да, это проблема. Кажется, мне нужно использовать метод .open в начале каждого тестового примера. Я не могу повторно использовать экземпляр браузера и сеанс из предыдущего теста. Я намеренно стараюсь оставлять каждый тест в URL-адресе для запуска следующего теста. Итак, кажется, что требование открытия является излишним, не так ли? если вы используете open, то я сомневаюсь, что вы используете тот же браузер, что и в ваших тестах. - person djangofan; 04.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();
    }
}

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

person Kurt Du Bois    schedule 02.02.2012
comment
Я использую Selenium 2 и все еще имею эту проблему. - person djangofan; 02.02.2012
comment
Не могли бы вы опубликовать способ инициализации пульта дистанционного управления? - person Kurt Du Bois; 02.02.2012
comment
Чего я не понимаю, так это того, что вы все еще используете seleniumserver в selenium 2. Вы можете просто использовать webdriver, internetexplorerdriver/firefoxdriver/htmlunitdriver и классы selenium по умолчанию. Я опубликую ответ о том, как я использую селен 2. - person Kurt Du Bois; 03.02.2012
comment
Я попробовал это, и после каждого теста WebDriver закрывает браузер, а затем следующий тест больше не имеет дескриптора экземпляра браузера, потому что он был закрыт. Как будто @Before запускается перед каждым тестом. - person djangofan; 09.02.2012