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

PageObject pattern..в каждом PageObject создать новый WebDriver object?


(Inessa) #1

Здраствуйте,
Я никогда не использовала свои тесты в parallel mode (TestNG, Java, WebDriver), а сейчас решилась. Мне кажется что я не смогу использовать static single instance of WebDriver for running tests in parallel mode. Это из-за того что multiples threads might access driver instance and try to change it concurrently?
Как мне тогда лучше создать instances of WebDriver?
Я использую PageObject pattern…в каждом PageObject создать новый
WebDriver object?

class Suite{
     public static WebDriver driver;
    
    		static{
    			driver=WebDriverManager.startDriver("firefox");
    
    		}
    
    }

(asolntsev) #2

Попробуйте ru.selenide.org , она сама создаёт и закрывает вебдрайвер тогда, когда нужно.


(Sergey Korol) #3

Драйвер - это нечто очень низкоуровневое. Пейджи - это уровень вашего домена. Вы не должны миксовать доменную логику с технической составляющей вашего фреймворка. Самым подходящим местом для инициализации драйвера будет некий Runner класс аля BaseTest, который сделает это автоматически при помощи одной из семейства аннотаций TestNG (e.g. @BeforeMethod) перед каждым запуском тестового метода. Этого можно достичь в случае наследования данного класса всеми тестами. При этом, вы должны будете либо вовсе избавиться от статики, либо обернуть драйвер, к примеру, в ThreadLocal контейнер для обеспечения потокобезопасности.


(Sergey Pirogov) #4

Создавать в каждом Page Object драйвер неправильно. Последуйте совету ArtOfLife .Просто в вашем методе WebDriverManager.startDriver возвращайте ThreadLocal Driver передавайте его в конструктор пейдж обжекта и все


(Inessa) #5

Понятно. :blush:
А может быть тогда в каждом классе который тест создавать новый webdriver instance in @BeforeClass and kill it in @AfterClass?
Из плюсов я вижу что могу не переживать из за different threads и все понятно с первого взгляда на класс.
Из минусов пока ничего не вижу(except redundant repetitive code for starting killing driver:)

У меня есть такой раннер класс
all PageObjects extend LoadableComponent class ;
all PageObjectTests extend BaseSuite (to control tests with @AfterSuite, @BeforeSuite etc)
Из минусов теперь мне надо думать про priority of every test class in testng.xml.
Из плюсов удобно что driver global.


(Sergey Pirogov) #6

С таким подходом вы себе головняка приобретете на каждый класс! Почему не проще создать ThreadLocalDriver и с помощью того же testNg не распараллелить по классу?