Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Неправильное выполнение параллельных тестов


(Kovalev07) #1

Доброго времени суток.

 

При последовательном выполнении тестов никаких проблем не возникает.

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

Имеется selenium hub и 3 Selenium node. Всё расположено на разных машинах. (4 машины)

Когда тесты выполнятся иногда бывает такая ситуация что код одного теста начинает выполнятся на другом ноде.

из за чего может происходить такая проблема?

 

Тесты запускаю при помощи TestNG

<suite name="Selenium tests suite" parallel="tests" thread-count="3">

 


(Shaman) #2

а модно пополробней посмотреть на конфигурацию сьюта, и что именно плохого в вашем случае в том что код одного теста начинает выполнятся на другой ноде ?


(Mykhailo Poliarush) #3

собственно в чем проблема?

selenium grid hub сам принимает решение, где ему запускать тесты

или у этого есть какие-то побочные эффекты?


(Kovalev07) #4

testng.xml

<suite name="Selenium tests suite" parallel="tests" thread-count="3">

 

    <test name="Test1">
        <classes>
            <class name="net.Test1"/>
        </classes>
    <test name="Test2">
        <classes>
            <class name="net.Test2"/>
        </classes>
    <test name="Test3">
        <classes>
            <class name="net.Test3"/>
        </classes>
    </test>
</suite>
 
и т.д.
 
То что selenium grid hub сам принимает решение, где ему запускать тесты это не вызывает никакой проблемы.
 
Каждый тест тестирует какую то свою стриничку.
Test1 тестирует index1.html
Test2 тестирует index2.html
Например: в Test 1 я нажимаю кнопку button1 а в Test 2 я нажимаю кнопку button 2.
 
Так вот иногда у меня кнопка button1 пытается нажаться на ноде на котором работает Test2.
Но там соответсвенно нету такой кнопки.
После этого я открываю скриншот который сделался в Test1. и вижу соответсвенно в нем  страницу index2.html.
Сответсвенно Test1 у меня падает с ошибкой что кнопка button1 не была найдена. А Test 2 сам собой как то по тихому заканчивается без ошибки.
 
с браузером я работаю через RemoteWebDriver

 


(Mykhailo Poliarush) #5

хм... не сталкивался с такой проблемой ранее

может быть действительно баг в selenium grid

если есть публичные страницы в интернете могу попробовать запустить у себя, чтобы посмотреть будет ли воспроизводиться ошибка или нет


(Kovalev07) #6

Публичных страниц в интернете нету.

Может быть мне надо как то сконфигурировать selenium hub? я его запускаю сейчас без параметров.


(Mykhailo Poliarush) #7

кстати у вас теги test в testng.xml не закрыты

это вы ошиблись когда писали пост или у вас точно также в реальном testng.xml?


(Mykhailo Poliarush) #8

ну таких настроек нету, которые бы решали вашу задачу

есть всякие таймауты, версии браузеров, количество сессий и так далее

более детально можно посмотреть тут http://code.google.com/p/selenium/wiki/Grid2


(Sergey Korol) #9

Покажите содержимое нодов и код инициализации драйвера + вызова первой страницы тестов.


(Kovalev07) #10

в реальном testng.xml теги закрыты


(Kovalev07) #11

ноды запускаю следующим образом:

java -jar selenium-server-standalone-2.25.0.jar -role node -nodeConfig C:\NodeConfig.json -Dwebdriver.chrome.driver=C:\chromedriver.exe

 

NodeConfig.json:

 

{
  "capabilities":
      [
        {
          "platform": "WINDOWS",
          "browserName": "chrome",
          "maxInstances": 1,
          "seleniumProtocol": "WebDriver"
        }
      ],
  "configuration":
  {
    "maxSession": 1,
    "port": 5555,
    "hubHost": localhost,
    "register": true,
    "registerCycle": 5000,
    "hubPort": 4444,
  }
}
 
у меня 3 нода. на одном у меня порт 5555 на втором 5556 на третьем 5557
 
Код инициализации драйвера:
protected WebDriver webDriver;
public DesiredCapabilities capability;
 
capability = DesiredCapabilities.chrome();
capability.setBrowserName(browser);
capability.setCapability("chrome.switches",Arrays.asList("--disable-translate", "--always-authorize-plugins"));
webDriver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
 
 

webDriver создается в абстрактном классе. все тесты наследуются уже от абстрактного класса.

 

Вызов первой страницы

webDriver.get( ".......blank.html");

 

сейчас вышел selenium-server-standalone-2.26.0.jar

может быть он решит проблему


(Sergey Korol) #12

Первая страница передается из дата провайдера теста или вы ее хардкодите в том же классе, где вызывается метод get? Интересно взглянуть на саму последовательность вызовов методов в вашем фреймворке.

 


(barancev) #13

Попробуйте обновить Selenium до версии 2.27.

В более ранних версиях в качестве идентификатора сессии использовался timestamp, поэтому могли возникать одинаковые идентификаторы. Начиная с версии 2.27 в качестве идентификатора используется UUID.

 


(Kovalev07) #14

Обновил. Проблема осталась.


(Kovalev07) #15

Пробовал использовать http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

для переменной WebDriver. Тоже не помогло.


(barancev) #16

1. Думаю, следует завести баг: http://code.google.com/p/selenium/issues

2. Приложите информацию о том, как сконфигурирован грид и логи выполнения тестов на клиентской и серверной стороне, где происходит "перескакивание".

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

На клиенте повысьте уровень логирования для команд Selenium:

driver.setLogLevel(Level.INFO);

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

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