statische Webdriver-Instanzsynchronisation in Java

Die GlobalVariables-Klasse enthält verschiedene Variablen, die in meinem Framework verwendet werden. Eine davon ist die WebDriver-Instanz:

  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 enthält Methoden zum Initialisieren aller 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();
}

// Einige andere Methoden zum Initialisieren anderer globaler Variablen. }

Ich habe viele GetElement-Klassen, die die Treiberinstanz verwenden, um UI-Steuerelemente abzurufen, z.

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

Ich habe andere Klassen, die einige Aktionen auf dem UI-Steuerelement ausführen (Diese Klassen verwenden auch die globalen Variablen). ZB:

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
}

Meine Testklasse in testng sieht so aus:

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

Ich habe mehrere ähnliche Testklassen basierend auf Szenarien. Jetzt laufen diese Tests gut, wenn ich sie einzeln laufen lasse. Aber wenn ich versuche, sie parallel zu betreiben, scheitern diese Tests auf seltsame Weise. Bei der Analyse habe ich herausgefunden, dass es sich um die statischen globalen Variablen handelt, die von jedem Test initialisiert werden, sodass die anderen Tests fehlschlagen. Wie soll ich nun vorgehen, um mein Ziel zu erreichen, mehrere Tests parallel mit minimalen Änderungen in meinem Framework-Design durchzuführen? Ich habe versucht, nach Optionen zu suchen, und ich bin auf eine Option gestoßen, d. h. die Verwendung von Synchronized. 2) ThreadLocal-Instanz erstellen (Hinweis: Ich habe diese Lösung ausprobiert, aber immer noch das gleiche Problem. Die Tests verwechseln sich und schlagen fehl. Ich habe die WebDriver-Instanz als ThreadLocal markiert und die initialValue-Methode von ThreadLocal überschrieben, um die Treiberinstanz zu initialisieren. Trotzdem bin ich mir nicht sicher, ob ich es richtig implementiert habe oder nicht.). Jetzt bin ich mir nicht sicher, wie ich eine dieser Lösungen im gegebenen Szenario am besten implementieren kann. Jede Hilfe wird geschätzt. TIA!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage