статическая синхронизация экземпляра Webdriver в Java

Класс GlobalVariables содержит различные переменные, которые используются в моей среде, одна из которых - экземпляр WebDriver:

  public class GlobalVariables
        {
        public static WebDriver driver;
    //Some other static global variables required across my framework
        public GlobalVariables(String propertiesFile)
        {
        initializeVariables(propertiesFile);
        }
        public void initializeVariables(String propertiesFile)
        {
        GlobalInitializer obj=new GlobalInitializer();
        obj.initialize(String propertiesFile);
        }
   }

GlobalInitializer содержит методы для инициализации всех GlobalVariables:

public class GlobalInitializer extends GlobalVariables
{
public void initialize(String propertiesFile)
{
  //Some logic to read properties file and based on the properties set in it, call other initialization methods to set the global variables.
}
public void initializeDriverInstance(String Browser)
{
driver=new FireFoxDriver();
}

// Некоторые другие методы для инициализации других глобальных переменных. }

У меня есть много классов GetElement, которые используют экземпляр драйвера для получения элементов управления пользовательского интерфейса E.g:

public class GetLabelElement extends GlobaleVariables
{
public static WebElement getLabel(String someID)
{
return driver.findElement(By.id(someId));
}
//Similar methods to get other types of label elements.
}

public class GetTextBoxElement extends GlobaleVariables
{
public static WebElement getTextBox(String someXpath)
{
return driver.findElement(By.xpath(someXpath));
}
//Similar methods to get other types of text box elements.
}

У меня есть другие классы, которые выполняют некоторые действия с элементом управления пользовательского интерфейса (эти классы тоже используют глобальные переменные) E.g:

public class GetLabelProperties extends GlobalVariables
{
public static String getLabelText(WebElement element)
{
return element.getText();
}
}

public class PerformAction extends GlobalVariables
{
public static void setText(String textBoxName,String someText)
{
driver.findElement(someLocator(textBoxName)).setText("someText");
}
    //Some other methods which may or may not use the global variables to perform some action
}

Мой тестовый класс в testng выглядит так:

public class TestClass
{
GlobalVariables globalObj=new GlobalVariables(String propertiesFile);
@Test(priority=0)
{
GlobalVariables.driver.get(someURL);
//Some assertion.
}
@Test(priority=1)
{
WebElement element=GetLabelElement.getLabel(someID);
String labelName=GetLabelProperties.getLabelText(element);
//Some assertion.
}
@Test(priority=2)
{
WebElement element=GetTextBoxElement.getTextBox(someXpath);
PerformAction.setText(element.getText(),someText);
//Some assertion.
}
}

У меня есть несколько аналогичных тестовых классов на основе сценариев. Теперь эти тесты работают нормально, если я запускаю их по отдельности. Но когда я пытаюсь запустить их параллельно, тогда эти тесты проваливаются каким-то странным образом. При анализе я обнаружил, что это статические глобальные переменные, которые инициализируются каждым тестом, оставляя другие тесты неудачными. Теперь, как мне идти к достижению моей цели - запускать несколько тестов параллельно с минимальными изменениями в моей структуре фреймворка? Я попытался найти варианты, и я столкнулся с некоторыми вариантами, т. е. 1) использование синхронизированных. 2) Создать экземпляр ThreadLocal (Примечание. Я пробовал это решение, но проблема все еще та же. Тесты смешиваются друг с другом, что приводит к сбою. Я пометил экземпляр WebDriver как ThreadLocal и переопределил метод initialValue ThreadLocal для инициализации экземпляра драйвера. Тем не менее я не уверен, правильно ли я это реализовал или нет.). Теперь я не уверен, как лучше реализовать какое-либо из этих решений в данном сценарии. Любая помощь приветствуется. ТИА!

Ответы на вопрос(4)

Ваш ответ на вопрос