sincronização de instância estática do Webdriver em java

A classe GlobalVariables contém variáveis ​​diferentes que são usadas em minha estrutura, uma delas é a instância do 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);
        }
   }

O GlobalInitializer contém métodos para inicializar todas as variáveis ​​globais:

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();
}

// Alguns outros métodos para inicializar outras variáveis ​​globais. }

Eu tenho muitas classes GetElement que usam a instância do driver para obter elementos de controle da interface do usuário 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.
}

Eu tenho outras classes que executam algumas ações no controle de interface do usuário (esta classes também usam as variáveis ​​globais) 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
}

Minha classe de teste em testng é assim:

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.
}
}

Eu tenho várias classes de teste semelhantes com base em cenários. Agora, esses testes estão funcionando bem se eu os estiver executando individualmente. Mas quando eu tento executá-los em paralelo, então esses testes estão falhando de alguma forma estranha. Ao analisar, descobri que são as variáveis ​​globais estáticas que estão sendo inicializadas por cada teste, deixando os outros testes falharem. Agora, como devo realizar meu objetivo de executar vários testes paralelamente com mudanças mínimas no design do meu framework? Eu tentei procurar por opções, e eu encontrei alguma opção ou seja, 1) uso de sincronizado. 2) Criar instância ThreadLocal (Nota: Eu tentei esta solução, mas ainda o mesmo problema. Testes estão misturando uns com os outros, resultando em falha. Eu tinha marcado a instância WebDriver como ThreadLocal e substitui o método initialValue de ThreadLocal para inicializar a instância do driver. Ainda não tenho certeza se eu tinha implementado corretamente ou não. Agora eu não tenho certeza de como melhor implementar qualquer uma dessas soluções no cenário dado. Qualquer ajuda é apreciada. TIA!

questionAnswers(4)

yourAnswerToTheQuestion