t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как настроить параллельный запуск тестов с Selenide и TestNG (привязать Selenide к потоку)

Теги: #<Tag:0x00007f748a3961a0> #<Tag:0x00007f748a395fc0> #<Tag:0x00007f748a395cc8> #<Tag:0x00007f748a3959d0> #<Tag:0x00007f748a395818> #<Tag:0x00007f748a395570> #<Tag:0x00007f748a3952c8>

Здравствуйте.

У меня есть такой класс:
Я привязываю драйвер к потоку, и в потоке используется именно указаный драйвер.
Это работает с обычным selenium, но не работает с Selenide.

Когда я запускаю тесты в 2 потока (тестирую авторизацию) в одном браузере поля в форме авторизации заполняются по 2 раза, а во втором ничего не проиходит.

Подскажите как правильно привязать инстанс selenide к текущему потоку?

public class DriverContainer {

    private static HashMap<Integer, WebDriver> drivers = new HashMap<Integer, WebDriver>();

    public static WebDriver getCurrentDriver() {
        Integer threadId = (int)Thread.currentThread().getId();
        if(drivers.get(threadId) != null) {
            return drivers.get(threadId);
        } else {
            initDriver();
            return drivers.get(threadId);
        }
    }

    private static void initDriver() {

        Configuration.pageLoadStrategy = "eager";
        Configuration.browserSize = "1920x1080";
        Configuration.holdBrowserOpen = true;
        Configuration.screenshots = false;

        if(TestConfig.isHeadless()) {
            Configuration.headless = true;
        } else {
            Configuration.headless = false;
        }

        switch (TestConfig.browser)
        {
            case "chrome":
                Configuration.browser = Browsers.CHROME;
                Selenide.open("http://google.com");
                addDriver( WebDriverRunner.getSelenideDriver().getWebDriver());
                break;

            case "firefox":
                Configuration.browser = Browsers.FIREFOX;
                Selenide.open("http://google.com");
                addDriver( WebDriverRunner.getSelenideDriver().getWebDriver());
                break;

            default:
                Configuration.browser = Browsers.CHROME;
                Selenide.open("http://google.com");
                addDriver( WebDriverRunner.getSelenideDriver().getWebDriver());
        }
    }

    public static void addDriver(WebDriver driver) {
        Integer threadId = (int)Thread.currentThread().getId();
        drivers.put(threadId, driver);
    }

    public static void removeDriver() {
        Integer threadId = (int)Thread.currentThread().getId();
        drivers.remove(threadId);
    }
}

В page objects у меня вот такое

public class LoginPage extends BasePage {

    public SelenideElement loginField = $("#login__username");
    public SelenideElement passwordField = $("#login__password");
    public SelenideElement signInButton = $("#login_enter");
    public SelenideElement termsOfUseLabel = $("label[for=\"login_agree\"]");

    public LoginPage(String pageUrl) {
        super(pageUrl);
    }

    @Step("Login with email - {email} and password - {password}")
    public void login(String email, String password) {
        loginField.setValue(email);
        passwordField.setValue(password);
        termsOfUseLabel.click();
        signInButton.click();
        DriverHelper.waitForUrlContains("account/accounts");
    }
}

Вам всего лишь нужно выкинуть класс DriverContainer :slight_smile:

Всё это селенид уже делает за вас. Не нужно хранить вебдрайвер в своей мапе.

действительно, переделал, вроде все нормально работает

1 Симпатия