У меня возникла проблема при использовании режима 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
parallel dataprovider Открываются браузеры,но задействован только один
#1
Отправлено 13 февраля 2015 - 06:27
#2
Отправлено 13 февраля 2015 - 11:29
Используйте ThreadLocal для создания по отдельному экземпляру драйвера для каждого потока.
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#3
Отправлено 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)
#4
Отправлено 14 февраля 2015 - 19:27
Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#5
Отправлено 16 февраля 2015 - 05:46
Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.
Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.
Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.
#6
Отправлено 17 февраля 2015 - 04:38
Этой информации недостаточно. Потому что непонятно, где вызывается setDriver, действительно ли это происходит в каждом потоке.
Проблема с parallel dataprovider состоит в том, что beforeMethod выполняется в одном потоке, а сам тест - в другом. Поэтому ThreadLocal, инициализированный вне метода теста будет давать NPE.
Решение: инициализировать переменные в методе теста. Или реализовывать какой-то собственный диспетчер, который будет отдавать ресурсы конкретному тесту. Это довольно трудоемко.
Alex, действительно проблема решилась, когда сделал первый вызов setdriver() с инициализаций браузера в первом методе вызываемом из @Test. Тесты начали стартовать правильно. Но теперь возникла другая проблема. @AfterMethod тоже не видит локальной переменной driver и не может закрыть браузер. Т.е. тест проходит, но при попытке закрыть браузер выходит NPE
#7
Отправлено 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();
#8
Отправлено 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 от нужного потока (или как увидеть браузер который уже не используется)
#9
Отправлено 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 от нужного потока (или как увидеть браузер который уже не используется)
У меня такого решения нет :(
Предложенное мной решение относится к задаче закрытия браузера по окончании выполнения всех тестов. Чтобы дифференцировать драйверы по принадлежности к тому или иному тесту нужно думать.
Сходу ничего предложить не могу
Темы с аналогичным тегами Selenium, Java, TestNG, Dataprovider
Тестирование →
Автоматизированное тестирование →
Логин на сайт не работает через selenium, но не в браузереАвтор Trololo, 13 фев 2024 selenium, selenoid |
|
|||
Тестирование →
Автоматизированное тестирование →
Selenium - Functional Testing →
Передача результата функции с параметром request в фикстуру (pytest)Автор Kristall89, 03 фев 2024 selenium, webdriver, python и 2 еще... |
|
|||
Тестирование →
Автоматизированное тестирование →
Selenium - Functional Testing →
Какую версию Java поддерживает Selenium WebDriver?Автор Ksenia, 28 апр 2023 Selenium, Java |
|
|||
Тестирование →
Автоматизированное тестирование →
Настройка запуска Java автотестов в Jenkins.Автор VIRTOK, 15 апр 2023 Java, автотествы, Jenkins |
|
|||
Тестирование →
Автоматизированное тестирование →
Selenium - Functional Testing →
Передать текст в инпутыАвтор vladid, 07 апр 2023 python, selenium |
|
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных