TestNG Selenium Grid 2 не запускает тесты параллельно

Кажется, у меня возникла проблема при попытке запустить тесты параллельно с использованием TestNG вместе с Selenium Grid 2.

Хотя открыто нужное количество браузеров, чтобы соответствовать количеству тестов, которые я запускаю, все инструкции для всех тестов запускаются в одно и то же окно браузера. Например, каждый тест откроет страницу и попытается войти в систему. Откроются четыре окна браузера, но одно окно браузера перейдет на страницу входа четыре раза, а затем 4 раза наберет имя пользователя, в то время как остальные окна браузера останутся неактивный.

Вот как я запускаю сетку:

java -jar selenium-server-standalone-28.0.jar -role hub
java -jar selenium-server-standalone-28.0.jar -webdriver.chrome.driver="*location*/chromedriver_mac" -role node 

Вот как настроен пакет xml:

<suite name="testng" verbose="1" parallel="classes">
    <test name="chrome">
        <packages>
            <package name="login"/>
            <package name="lists"/>
        </packages>
    </test>
</suite>

А вот пример того, как выкладываются тесты:

public class login_logout extends TestBase {
    @Test
    public void login(){
        //initiates login page object and call super user login
        LoginPage login = LoginPage.navigateTo(driver, base_url)
        LoggedInPage loggedIn = login.superuserlogin();
        }
    }

Тестовая база устроена следующим образом:

public class TestBase {
    public static WebDriver driver;
    public static DesiredCapabilitiess capabilities;
    @BeforeClass
    public static void setUp(){
        base_url = "*login page url*;
        capabilities = DesiredCapabilities.chrome();
        driver = new RemoteWebDriver(capabilities);
        driver.get(base_url);
    }
}

Вероятно, что-то действительно очевидное, что мне не хватает, но любая помощь будет принята с благодарностью.

Заранее спасибо.


person user2071812    schedule 14.02.2013    source источник


Ответы (2)


Объект драйвера статический. Итак, у вас происходит 4 инициализации и запускается 4 браузера, но драйвер является статическим, он будет содержать только ссылку на последний инициализированный браузер, и, следовательно, все ваши команды выполняются для одного и того же драйвера. Вы можете попробовать изучить объекты Threadlocal для параллельных запусков.

person niharika_neo    schedule 14.02.2013
comment
Да, статический объект WebDriver теперь изменен, и сетка работает без сбоев. ++ для предложения Threadlocal. Спасибо - person user2071812; 15.02.2013
comment
@niharika_neo: не могли бы вы привести небольшой пример, который я пробовал, но безуспешно. во время параллельного выполнения я сталкиваюсь со странными проблемами, например, внезапно тесты одного тестового класса запускаются в каком-то другом экземпляре браузера или других тестов. Любая помощь будет принята с благодарностью. ТИА !!! - person Mrunal Gosar; 28.09.2013
comment
@MrunalGosar Вам нужно будет показать, что вы используете в своем коде, чтобы помочь мне понять, что происходит не так. - person niharika_neo; 30.09.2013
comment
@niharika_neo Я решил свою проблему, используя ваше решение ThreadLocal. http://stackoverflow.com/questions/19067885/static-webdriver-instance-synchronization-in-java/19074040?noredirect=1#comment28211070_19074040 посмотрите здесь. - person Mrunal Gosar; 30.09.2013

С моей точки зрения, вы сделали правильный выбор, выбрав WebDriver и TestNG. Но поскольку это действительно мощные инструменты, вам следует знать некоторые основы.

На первом этапе важно иметь некоторый опыт программирования в целом.

Во-вторых, вы можете добавить несколько специальных приемов.

Почему бы вам не инициализировать WebDriver в каждом отдельном тестовом классе (либо в конструкторе, либо в @BeforeClass)?

Позже вы также можете использовать шаблоны @DataProvider и @Factory для настройки.

Это круто!

person Franz Ebner    schedule 18.02.2013
comment
Если драйвер инициализируется до класса, то параллельное выполнение на уровне метода все равно вызовет проблемы. - person niharika_neo; 18.02.2013
comment
Правильно, лично я инициализирую конструктор с помощью TestNG Factory и вводю настройки с помощью DataProvider. Я думаю, что это лучший способ. - person Franz Ebner; 19.02.2013