Перейти к содержимому

Фотография

parallel dataprovider Открываются браузеры,но задействован только один

Selenium Java TestNG Dataprovider

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Arch

Arch

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Каримов Алексей

Отправлено 13 февраля 2015 - 06:27

У меня возникла проблема при использовании режима parallel у dataprovider. Суть такова: Открывается несколько браузеров(хром), но страница открывается только на одном из них, и далее тест пытается вбить все данные разом в эту страничку и выпадает ошибка. Остальные браузеры ничего не отображают, у них пустая адресная строка.
Структура теста следующая:

Основной класс

protected WebDriver driver;
@BeforeMethod
public void setUp() {
...
driver=new EventFiringWebDriver(new ChromeDriver());
...
}

Класс с тестом

@DataProvider(name="authdata",parallel=true)
public Iterator<Object[]> createData1() {...}

@Test(dataProvider="authdata")
public void test() throws Exception {
Authorization();
}


Для запуска использую testng.run(), т.к. пока по некоторым причинам нужен готовый jar для сборщика.

До использовании dataprovider, инициализация браузера была в @BeforeClass, и каждый @test был упакован в отдельный класс с одним методом. В этом случае параллельный запуск с testng работал без проблем.

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


  • 0

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 13 февраля 2015 - 11:29

Используйте ThreadLocal для создания по отдельному экземпляру драйвера для каждого потока.


  • 1
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 Arch

Arch

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Каримов Алексей

Отправлено 13 февраля 2015 - 11:53

Используйте ThreadLocal для создания по отдельному экземпляру драйвера для каждого потока.

Как раз это попытался сделать, в итоге стартует 2 браузера, на страницу не переходит. Ошибка nullpointerexception. Выбрасывает при первом обращении к драйверу.  Вот методы установки и возврата драйвера 

 

ThreadLocal<WebDriver> thr = new ThreadLocal<WebDriver>();
public WebDriver getDriver()
{
return thr.get();
}
public void setDriver(WebDriver driver) {
thr.set(driver);
}

 

Для просмотра сделал вывод дравера, вот лог запуска

 

Starting ChromeDriver (v2.9.248315) on port 48797
Starting ChromeDriver (v2.9.248315) on port 10992
ChromeDriver: chrome on XP (3bb3492b7c27b3aa6928dc8f18989558)
ChromeDriver: chrome on XP (3bb3492b7c27b3aa6928dc8f18989558)
ChromeDriver: chrome on XP (b693e6b752b36e2fb8277da172b95322)
ChromeDriver: chrome on XP (b693e6b752b36e2fb8277da172b95322)

...
null
ChromeDriver: chrome on XP (b693e6b752b36e2fb8277da172b95322)

null
ChromeDriver: chrome on XP (3bb3492b7c27b3aa6928dc8f18989558)


  • 0

#4 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 14 февраля 2015 - 19:27

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#5 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 16 февраля 2015 - 05:46

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.

Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.

Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.


  • 1

#6 Arch

Arch

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Каримов Алексей

Отправлено 17 февраля 2015 - 04:38

 

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.

Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.

Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.

 

Alex, действительно проблема решилась, когда сделал первый вызов setdriver() с инициализаций браузера в первом методе вызываемом из @Test. Тесты начали стартовать правильно. Но теперь возникла другая проблема. @AfterMethod тоже не видит локальной переменной driver и не может закрыть браузер. Т.е. тест проходит, но при попытке закрыть браузер выходит NPE


  • 0

#7 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 17 февраля 2015 - 05:47

 

 

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.

Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.

Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.

 

Alex, действительно проблема решилась, когда сделал первый вызов setdriver() с инициализаций браузера в первом методе вызываемом из @Test. Тесты начали стартовать правильно. Но теперь возникла другая проблема. @AfterMethod тоже не видит локальной переменной driver и не может закрыть браузер. Т.е. тест проходит, но при попытке закрыть браузер выходит NPE

 

Проблема ровно та же.

При parallel dataprovider метод теста выполняется полностью в собственном потоке. Все before и after находятся в другом потоке/потоках.

Создайте сущность а-ля WebDriverManager/WebDriverFactory, которая будет хранить Set всех инициализированных драйверов. Через shutdownhook или в afterSuite закрывайте все не закрытые браузеры из этого Set:

 

WebDriverFactory.createDriver();

WebDriverFactory.quitAll()

 

public static synchronized WebDriver createDriver();


  • 1

#8 Arch

Arch

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Каримов Алексей

Отправлено 18 февраля 2015 - 05:22

 

 

 

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.

Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.

Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.

 

Alex, действительно проблема решилась, когда сделал первый вызов setdriver() с инициализаций браузера в первом методе вызываемом из @Test. Тесты начали стартовать правильно. Но теперь возникла другая проблема. @AfterMethod тоже не видит локальной переменной driver и не может закрыть браузер. Т.е. тест проходит, но при попытке закрыть браузер выходит NPE

 

Проблема ровно та же.

При parallel dataprovider метод теста выполняется полностью в собственном потоке. Все before и after находятся в другом потоке/потоках.

Создайте сущность а-ля WebDriverManager/WebDriverFactory, которая будет хранить Set всех инициализированных драйверов. Через shutdownhook или в afterSuite закрывайте все не закрытые браузеры из этого Set:

 

WebDriverFactory.createDriver();

WebDriverFactory.quitAll()

 

public static synchronized WebDriver createDriver();

 

Alex, а не могли бы вы дать пример реализации WebDriverManager/WebDriverFactory или ссылку. Как оказалось в случае провала теста, обертка TestListener, которая должна делать скриншот и заносить в отчет данные, тоже работает в другом потоке, отличном от @test. Соответвенно ни @After ни реализация скриншотов не может корректно отработать. Мне не совсем понятно как передать в них driver от нужного потока (или как увидеть браузер который уже не используется)


  • 0

#9 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 18 февраля 2015 - 06:32

 

 

 

 

Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.

Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.

Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.

 

Alex, действительно проблема решилась, когда сделал первый вызов setdriver() с инициализаций браузера в первом методе вызываемом из @Test. Тесты начали стартовать правильно. Но теперь возникла другая проблема. @AfterMethod тоже не видит локальной переменной driver и не может закрыть браузер. Т.е. тест проходит, но при попытке закрыть браузер выходит NPE

 

Проблема ровно та же.

При parallel dataprovider метод теста выполняется полностью в собственном потоке. Все before и after находятся в другом потоке/потоках.

Создайте сущность а-ля WebDriverManager/WebDriverFactory, которая будет хранить Set всех инициализированных драйверов. Через shutdownhook или в afterSuite закрывайте все не закрытые браузеры из этого Set:

 

WebDriverFactory.createDriver();

WebDriverFactory.quitAll()

 

public static synchronized WebDriver createDriver();

 

Alex, а не могли бы вы дать пример реализации WebDriverManager/WebDriverFactory или ссылку. Как оказалось в случае провала теста, обертка TestListener, которая должна делать скриншот и заносить в отчет данные, тоже работает в другом потоке, отличном от @test. Соответвенно ни @After ни реализация скриншотов не может корректно отработать. Мне не совсем понятно как передать в них driver от нужного потока (или как увидеть браузер который уже не используется)

 

 

У меня такого решения нет :(

Предложенное мной решение относится к задаче закрытия браузера по окончании выполнения всех тестов. Чтобы дифференцировать драйверы по принадлежности к тому или иному тесту нужно думать.

Сходу ничего предложить не могу


  • 0



Темы с аналогичным тегами Selenium, Java, TestNG, Dataprovider

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных