title: static Webdriver instance synchronization in java
body: <p>GlobalVariables class holds different variables which are used across my framework one of them is WebDriver instance:</p>
  
  <pre><code>  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);
          }
     }
  </code></pre>
  
  <p>GlobalInitializer contains methods to initialize all the GlobalVariables:</p>
  
  <pre><code>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();
  }
  </code></pre>
  
  <p>//Some other methods to initialize other global variables.
      }</p>
  
  <p>I have many GetElement classes which use the driver instance to get UI control elements E.g:</p>
  
  <pre><code>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.
  }
  </code></pre>
  
  <p>I have other classes which perform some actions on the UI Control(This classes too use the global variables) E.g:</p>
  
  <pre><code>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
  }
  </code></pre>
  
  <p>My test class in testng looks like this:</p>
  
  <pre><code>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.
  }
  }
  </code></pre>
  
  <p>I have similar multiple test classes based on scenarios.
  Now this tests are running fine if i am running them individually. But when i try to run them in parallel, then this tests are failing in some weird fashion. On analyzing i found out that its the static global variables which are getting initialized by each tests thus leaving the other tests to fail. Now how should i go about achieving my objective to run multiple tests parallely with minimal changes in my framework design? i have tried searching for options, and i have come across some option i.e 1) use of synchronized. 2) Create ThreadLocal instance(Note : I have tried this solution but still same issue. tests are mixing up with each other resulting in failure. I had marked the WebDriver instance as ThreadLocal and overriden the initialValue method of ThreadLocal to initialize the driver instance. Still i am not sure whether i had implemented it correctly or not.). Now i am not sure how best to implement any one of this solution in the given scenario. Any help is appreciated. TIA!</p>