Спасибо за ваш комментарий @Shoaib, проблема с запуском теста в параллельных методах и объявлением драйвера вне методов теста заключается в том, что состояние экземпляра драйвера может быть перезаписано во время выполнения теста.

аюсь запустить свои автоматизированные тесты (Selenium Webdriver) параллельно, используя testng. это узел, на котором я работаю:

java -Dwebdriver.gecko.driver=chromedriver.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=2 -maxSession 2

это мой тестовый класс:

public class TestParallel {

Login login;

//@BeforeMethod(alwaysRun = true)
public SeleniumDriverCore testSetup() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
    Properties config = new Properties();
    config.load(new FileInputStream("config/testConfig"));
    this.login = new Login(driver);
    driver.browser.open("https://test.test.xyz");

    driver.browser.maximize();
    driver.waits.waitForPageToLoad();
    return driver;
}

@Test(groups={"parallel"})
public void test_one() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_two() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_three() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_four() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}


public void testCleanup(SeleniumDriverCore driver){
    driver.close();
    driver.quit();
}

}

а вот мой xml:

<suite name="Ontega - All Tests Mobile" parallel="methods" thread-count="2">
    <test name="Ontega - All Tests Mobile">
        <groups>
            <run>
                <include name="parallel"/>
                <exclude name="open-defects"/>
            </run>
        </groups>
        <packages>
            <package name="tests.*"/>
        </packages>
    </test>
</suite>

когда я запускаю XML, я ожидаю, что мои тесты будут выполняться в двух браузерах в двух потоках одновременно, однако, когда я запускаю XML, у меня запускаются два экземпляра браузера в первый раз, а затем они увеличиваются и увеличивают на 50% тесты терпят неудачу, как вы можете видеть, я пытаюсь создать экземпляр драйвера в каждом из моих методов, хотя это не то, как работает мой фреймворк, но я пытаюсь найти узкое место в этой проблеме. Любая помощь будет принята с благодарностью Заранее спасибо

 guido12 окт. 2017 г., 00:15
вы создаете два драйвера для каждого вызова тестового метода, также вам просто нужно вызвать quit, когда вы завершаете работу
 Ali Hamadi12 окт. 2017 г., 09:33
Я исправил свой код, теперь проблема в том, что страницы Chrome открывают пустую страницу и все.

Ответы на вопрос(2)

Решение Вопроса

созданием и очисткой своего веб-драйвера через@BeforeMethod и@AfterMethod методы настройки. Итак, вам нужно будет решить, как вы хотите поделиться созданным экземпляром Webdriver с вашим@Test метод. Для этого у вас есть три варианта:

Вы используетеThreadLocal вариант, потому что TestNG гарантирует вам, что он выполнит@BeforeMethod, @Test а также@AfterMethod все в одной теме.

Вот пример, который показывает вам это в действии

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClassSampleUsingThreadLocal {
    private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>();

    @BeforeMethod
    public void instantiateBrowser(ITestResult testResult) {
        RemoteWebDriver driver = new ChromeDriver();
        drivers.set(driver);
    }

    @Test(dataProvider = "dp")
    public void testMethod(String url) {
        Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
        driver().get(url);
        Reporter.log("Page Title :" + driver().getTitle(), true);
    }

    @DataProvider(name = "dp", parallel = true)
    public Object[][] getData() {
        return new Object[][]{
                {"http://www.google.com"}, {"http://www.stackoverflow.com"}, {"http://facebook.com"}
        };
    }

    @AfterMethod
    public void cleanupBrowser() {
        RemoteWebDriver driver = driver();
        driver.quit();
    }

    private RemoteWebDriver driver() {
        RemoteWebDriver driver = drivers.get();
        if (driver == null) {
            throw new IllegalStateException("Driver should have not been null.");
        }
        return driver;
    }

}
Вы можете поделиться экземпляром webdriver черезITestResult объект. Вот пример, который показывает это в действии.
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClassSample {
    private static final String WEBDRIVER = "driver";

    @BeforeMethod
    public void instantiateBrowser(ITestResult testResult) {
        RemoteWebDriver driver = new ChromeDriver();
        testResult.setAttribute(WEBDRIVER, driver);
    }

    @Test(dataProvider = "dp")
    public void testMethod(String url) {
        Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
        driver().get(url);
        Reporter.log("Page Title :" + driver().getTitle(), true);
    }

    @DataProvider(name = "dp", parallel = true)
    public Object[][] getData() {
        return new Object[][]{
                {"http://www.google.com"},
                {"http://www.stackoverflow.com"},
                {"http://facebook.com"}
        };
    }

    @AfterMethod
    public void cleanupBrowser(ITestResult testResult) {
        RemoteWebDriver driver = driver(testResult);
        driver.quit();
    }

    private RemoteWebDriver driver() {
        return driver(Reporter.getCurrentTestResult());
    }

    private RemoteWebDriver driver(ITestResult testResult) {
        if (testResult == null) {
            throw new IllegalStateException("testResult should have not been null.");
        }
        Object driverObject = testResult.getAttribute(WEBDRIVER);
        if (driverObject == null) {
            throw new IllegalStateException("Driver should have not been null.");
        }
        if (!(driverObject instanceof RemoteWebDriver)) {
            throw new IllegalStateException("Driver is not a valid webdriver object");
        }
        return (RemoteWebDriver) driverObject;
    }
}
Вы извлекаете инстанцирование и очистку веб-драйвера в прослушиватель TestNG (тот, который реализуетorg.testng.IInvokedMethodListener который устанавливает созданный веб-драйвер вITestResult (как показано в варианте 2) или вThreadLocal (как показано в варианте 1). Вы можете найти более подробную информацию об этой опции вместе с фрагментами кода в моемСообщение блога.
 Ali Hamadi17 окт. 2017 г., 17:58
Большое спасибо за ваш ответ!

вы создаете несколько драйверов для каждого теста. Я предполагаю, что вам нужно оставить некоторую часть кода вне метода testSetup ()

SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"))

Я делюсь частью своего кода, который я использую для параллельного тестирования, может быть, это поможет в вашем случае

Мой xml

 Ali Hamadi12 окт. 2017 г., 09:54
Спасибо за ваш комментарий @Shoaib, проблема с запуском теста в параллельных методах и объявлением драйвера вне методов теста заключается в том, что состояние экземпляра драйвера может быть перезаписано во время выполнения теста.

Ваш ответ на вопрос