Как запустить Selenium параллельно с помощью TestNG?

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

Метод A - Браузер A - Скажите, что это занимает 20 секунд

Метод B - Браузер B - Скажите, что это занимает 40 секунд

Когда метод A выполнен, он убивает браузер B вместо браузера A.

Вот мой код:

public class AccountTest {

    private WebDriver driver;

    @BeforeMethod(alwaysRun=true)
    public void initializeDriver() throws MalformedURLException {
        driver = new FirefoxDriver();
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
    }

    @Test(groups="Login")
    public void loginTest() {
        HomePage homePage = new HomePage(driver);
        SignInPage signInPage = homePage.signIn();
        signInPage.signIn("[email protected]", "abcd1234");
    }


    @Test(groups="Register")
    public void registerTest() {
        HomePage homePage = new HomePage(driver);
        SignInPage signInPage = homePage.signIn();
        RegisterPage registerPage = signInPage.register();
        registerPage.register();
    }

    @AfterMethod(alwaysRun=true)
    public void tearDown() {
        driver.quit();
    }
}

Вот мой testng.xml:

<suite name="Automation Suite" parallel="methods" verbose="10">

    <test name="AccountTest">
        <classes>
            <class name="com.selenium.test.AccountTest"/>
        </classes>
    </test>

</suite>

Я не использую Grid в данный момент. Попытка заставить это работать на моем локальном компьютере, но я начну использовать Saucelabs для запуска параллельных тестов в будущем.

Вы хоть представляете, что случилось?

заранее спасибо


person Jail    schedule 07.04.2014    source источник


Ответы (1)


TestNG создаст экземпляр вашего класса только один раз. Таким образом, каждый раз, когда запускается ваш метод @BeforeMethod, поле драйвера перезаписывается.

Чтобы изменить это, вы можете либо запускать свои классы параллельно, либо настроить @DataProvider для передачи в драйвере.

person Nathan Merrill    schedule 07.04.2014
comment
Здравствуйте, Натан, спасибо за ответ. Я пытался создать отдельные классы для каждого метода, и это сработало, но в будущем мне может понадобиться запустить несколько методов, которые находятся в одном классе. Я проверил AfterMethod, и он не принимает dataProvider в качестве параметра. Можно подробнее об этой аннотации? Спасибо - person Jail; 07.04.2014
comment
У вас может быть несколько методов в классе, но я бы не рекомендовал запускать их параллельно. Если бы вы хотели использовать @DataProvider, вам пришлось бы закрыть все драйверы в @AfterClass, я полагаю. Я не совсем уверен, какие методы принимают поставщиков данных, а какие нет. - person Nathan Merrill; 07.04.2014
comment
Я обнаружил, что с TestNG и Selenium все намного проще, если вы разбиваете по классам. Создайте экземпляр в своем @BeforeClass, закройте в своем @AfterClass и распараллеливайте с классами. Если вы хотите использовать несколько драйверов, я бы рекомендовал использовать factory. - person Nathan Merrill; 07.04.2014
comment
Спасибо за ответ. Я подумаю об этом. Я чувствую, что в какой-то момент мне нужно будет использовать несколько драйверов. Вот почему я тоже искал ответ на этот вопрос. У вас есть какие-то конкретные рекомендации на этот счет? - person Jail; 07.04.2014
comment
Вы можете создавать подклассы, которые используют общие методы. Затем вы можете передать драйвер в качестве параметров. - person Bob Dalgleish; 07.04.2014