Parallel test execution in Selenium Java + TestNG

Всем привет!
Занимаюсь автоматизацией несколько месяцев, дома на досуге пишу свой фреймворк в нерабочее время. У меня изначально инстанс WebDriver’a был статическим, т.к. я запускал каждый тест в одиночку, когда писал его и не было нужды тогда заниматься параллелизацией. Сейчас решил это исправить, уже много разных вариантов пробовал, но всеравно натыкаюсь на NPE во время параллельного запуска нескольких тестов через testng.xml.

Вот мои сниппеты:

testng.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="FitSuite" parallel="methods">

  <listeners>
    <listener class-name="resources.Listeners"/>
  </listeners>

  <test name="HomePageTest">
    <classes>
      <class name="selenium.tests.HomePageTest"/>
      <class name="selenium.tests.LoginPageTest"/>
      <class name="selenium.tests.MyClassesTest"/>
</suite>

TestBase.class

public class TestBase {
  public  /*static*/ WebDriver driver;
  protected Properties properties;
  public Logger log = LogManager.getLogger(TestBase.class.getName());
  public static String propertiesFilePath =
    System.getProperty("user.dir") + "//src//main//java//resources//TestProperties.properties";

  public WebDriver initializeDriver() {

    try {
      properties = new Properties();
      properties.load(new FileInputStream(propertiesFilePath));
      String browserName = properties.getProperty("browser");

      if (browserName.equalsIgnoreCase("chrome")) {
        System.setProperty("webdriver.chrome.driver",
          System.getProperty("user.dir") + "//src//main//java//resources//chromedriver");
        driver = new ChromeDriver();
      }
      else if (browserName.equalsIgnoreCase("chrome-headless")) {
        System.setProperty("webdriver.chrome.driver",
          System.getProperty("user.dir") + "//src//main//java//resources//chromedriver");

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--headless");
        // chromeOptions.setHeadless(true); -- this is the same as above.
        driver = new ChromeDriver(chromeOptions);
      }
      else if (browserName.equalsIgnoreCase("firefox")) {
        System.setProperty("webdriver.gecko.driver",
          System.getProperty("user.dir") + "//src//main//java//resources//geckodriver");
        driver = new FirefoxDriver();
      }
      else driver = new SafariDriver();

    } catch (IOException e) {
      e.printStackTrace();
      log.fatal("Driver initialization has been crashed");
    }

    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
    log.info("Driver has been initialized successfully");

    return driver;
  }

  public void tearDown() {
    driver.manage().deleteAllCookies();
    driver.quit();
    driver = null;
    log.info("Driver session has been ended successfully");
  }

  public void takeScreenshot(String testResult) {
    try {
      File screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
      FileUtils.copyFile(screenshotFile, new File(
        System.getProperty("user.dir") + "//ScreenshotsFailure//"
        + testResult + "__" + "failure.png"));

      log.info("Screenshot of " + testResult + "'s failure has been created successfully");
    } catch (IOException e) {
      e.printStackTrace();
      log.error("Screenshot of " + testResult + "'s failure has not been created");
    }
  }
}

HomePageTest.class


public class HomePageTest extends TestBase {
  public Logger log = LogManager.getLogger(HomePageTest.class.getName());
  private HomePage homePage;
  private SoftAssert softAssertion;
//  private WebDriver driver;


  @BeforeMethod
  void initialize() {
    driver = initializeDriver();
    log.info("Driver for " + HomePageTest.class.getName() + " has been invoked successfully");
    driver.get(properties.getProperty("baseurl"));
  }


  @Test
  void checkHomePageUI() {
    homePage = new HomePage(driver);
    softAssertion = new SoftAssert();

    softAssertion.assertEquals(homePage.getHomePageTitleReal(), homePage.getHomePageTitleExp());
    softAssertion.assertTrue(homePage.navigationBarIsDisplayed());
    softAssertion.assertTrue(homePage.faceSloganIsDisplayed());
    softAssertion.assertTrue(homePage.faceTextIsDisplayed());
    softAssertion.assertTrue(homePage.headerImageIsDisplayed());
    softAssertion.assertTrue(homePage.createAccountButtonIsDisplayed());
    softAssertion.assertTrue(homePage.loginButtonIsDisplayed());
    softAssertion.assertTrue(homePage.footerSectionIsDisplayed());
    softAssertion.assertAll();

    log.info("checkHomePageUI() Test has been performed successfully");
  }

  @Test
  void checkFooterSocialMedia() {
    homePage = new HomePage(driver);
    softAssertion = new SoftAssert();

    softAssertion.assertTrue(homePage.socialMediaButtonsCheck());
    softAssertion.assertAll();
    log.info("checkFooterSocialMedia() Test has been performed successfully");
  }

  @Test
  void checkFooterLinks() {LoginPageTest
    homePage = new HomePage(driver);
    softAssertion = new SoftAssert();

    softAssertion.assertTrue(homePage.footerLinksCheck());
    softAssertion.assertAll();
    log.info("checkFooterLinks() Test has been performed successfully");
  }


  @AfterMethod
  void closeDriver() {
//    tearDown();
    driver.quit();
  }
}

LoginPageTest.class

public class LoginPageTest extends TestBase {
  public Logger log = LogManager.getLogger(LoginPageTest.class.getName());
  private LoginPage loginPage;
  private SoftAssert softAssert;
//  private WebDriver driver;

  @BeforeMethod
  void initialize() {
    driver = initializeDriver();
    log.info("Driver for " + LoginPageTest.class.getName() + " has been invoked successfully");
    driver.get(properties.getProperty("login"));
  }

  @Test
  void loginPositive() {
    loginPage = new LoginPage(driver);
    SearchPage searchPage = new SearchPage(driver);
    softAssert = new SoftAssert();

    loginPage.enterEmail();
    loginPage.enterValidPassword();
    loginPage.clickLoginButton();
    softAssert.assertTrue(searchPage.navigationBarIsDisplayed());
    softAssert.assertTrue(searchPage.searchHeaderIsDisplayed());
    softAssert.assertTrue(searchPage.searchContentIsDisplayed());
    softAssert.assertEquals(searchPage.getTitleReal(), searchPage.getTitleExp());
    softAssert.assertAll();

    log.info("loginPositive() Test has been performed successfully");
  }

  @Test
  void loginNegative() {
    loginPage = new LoginPage(driver);
    softAssert = new SoftAssert();

    loginPage.enterEmail();
    loginPage.enterInvalidPassword();
    loginPage.clickLoginButton();

    softAssert.assertTrue(loginPage.errorPopUpIsDisplayed());
    softAssert.assertAll();

    log.info("loginNegative() Test has been performed successfully");
  }


  @AfterMethod
  void closeDriver() {
    tearDown();
  }

}

Буду очень признателен за советы более опытных коллег. Спасибо большое наперед

Пример ошибки бы ещё…