Как избежать потерянных браузеров, которые остаются при выполнении параллельных тестов с TestNG - PullRequest
0 голосов
/ 26 января 2019

Хотя я запускаю параллельные тестовые случаи с использованием TestNG и selenium-webdriver, есть некоторые экземпляры браузера, которые открываются пустыми и не закрываются даже после завершения выполнения.Я прочитал несколько тем на разных форумах, в которых спрашивали о похожих проблемах, но ни одна из них, похоже, не является той же самой проблемой.

Также кажется, что больше пустых браузеров открыты, когда я добавляю больше тестов в комплект.Ниже приведена информация, относящаяся к java-классам и testng xml:

  • Я использую (как уже упоминалось) TestNG - веб-драйвер, с которым я работаю с шаблоном объектов
  • .Я запускаю свою автоматизацию из интерфейса javafx,
  • , который позволяет пользователю выбирать некоторые параметры.Я использую ChromeDriver
  • для эмуляции мобильных устройств.Я использую локальный поток драйвера
  • , который позволяет мне использовать эксклюзивный статический драйвер для каждого теста.
  • Пустой браузер не открывается, когда я не запускаю параллельно.

Это мой TestNg.xml:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Automation Suite" verbose="2" parallel="classes" thread-count="5">
    <listeners>
        <listener class-name="com.qa.extentreportlistener.ExtentReportListener"></listener>
    </listeners>
    <test name="Sanity Test0" parallel="methods" thread-count="3" >
        <classes>
            <class name="test.test0" />
        </classes>
    </test>
    <test name="Sanity Test1" parallel="methods" thread-count="3">
        <classes>
            <class name="test.test1" />
        </classes>
    </test>
    <test name="Sanity Test2" parallel="methods" thread-count="3">
        <classes>
            <class name="test.test2" />
        </classes>
    </test>
    <test name="Sanity Test3" parallel="methods" thread-count="3">
        <classes>
            <class name="test.test3" />
        </classes>
    </test>
</suite>

Ниже приведен класс, используемый дляустановить и получить локальный веб-драйвер Thread:

public class WebdriverFactory {

private static ThreadLocal<WebDriver> tlDriver = new ThreadLocal<>();

public synchronized static void setTLDriver () {
    String type = TestConfig.getInstance().getProperty(TestConfigKeys.BROWSER).toLowerCase().trim();
    if (type.equals("firefox")) {
        tlDriver = ThreadLocal.withInitial(() -> new FirefoxDriver(OptionsManager.getFirefoxOptions()));
    } else if (type.equals("chrome")) {
        tlDriver = ThreadLocal.withInitial(() -> new ChromeDriver(OptionsManager.getChromeOptions()));
    }
    Log.info("Running setTLDriver -- Browser is "+type +" and Thread Id is "+ Thread.currentThread().getId() );
}

public synchronized static WebDriver getTLDriver () 
 {
    Log.info("Running getTLDriver -- Thread Id is "+ Thread.currentThread().getId());
    return tlDriver.get();
 }
}

AbstractTestCase вызывает локальный драйвер Thread из WebDriverFactory и расширяется каждым классом теста:

public abstract class AbstractTestCase {

protected static ReportDispatcher report = ReportManager.getInstance();
private static String url = TestSUT.getInstance().getStringProperty("url");
protected AssertUtils myAssert;
protected Verify verify;
public static Properties props =null;
//protected WebDriver driver = WebdriverFactory.getTLDriver();

@BeforeMethod(alwaysRun = true)
public void setup() throws Throwable, IOException 
{
    Log.startLog("AbstractTestCase: Test is starting");
    WebdriverFactory.setTLDriver();
    WebDriver driver = WebdriverFactory.getTLDriver();
    driver = new EventFiringWebDriver(driver);
    ((EventFiringWebDriver) driver).register(new ScreenshotEventListener());
    driver.manage().timeouts().implicitlyWait(Integer.valueOf(TestConfig.getInstance().getProperty(TestConfigKeys.DRIVER_IMPLICITY_WAIT)), TimeUnit.SECONDS);
    verify = new Verify(driver);
    myAssert = new AssertUtils(driver);
    driver.get(url);
 }

@AfterMethod(alwaysRun = true)
public void tearDown() 
{
    if (WebdriverFactory.getTLDriver() != null) {
        Log.endLog("AbstractTestCase: Test is ending");
        WebdriverFactory.getTLDriver().quit();
    }
 }

}

Тесты запускаются, как и ожидалось, когдане работает параллельно.Проблема заключается в потерянных браузерах, которые приводят к сбою нескольких тестов при параллельной работе.

Пожалуйста, дайте мне знать, если я делаю что-то не так с приведенным выше кодом.Спасибо за помощь!

...