Selenide c Maven. Многократное создание веб-драйверов при запуске тестов.

Использую в написание тестов selenide, testng, allure. Столкнулся с проблемой, когда selenide при запуске тестов создает webDriver, потом создает его еще раз, затем убивает его, и вообще занимается вакханалией. Причем, проблема эта возникает только при запуске тестов используя maven, запуская их в православной idea - вакханалии не возникает и тесты отрабатывают, как положено.

Вывод консоли при запуске тестов с помощью maven:

[INFO]

[INFO] -------------------------------------------------------

[INFO] T E S T S

[INFO] -------------------------------------------------------

[INFO] Running TestSuite

[TestNGContentHandler] [WARN] It is strongly recommended to add "<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd&quot; >" at the top of your file, otherwise TestNG may fail or not work as expected.

… TestNG 6.14.3 by C?dric Beust (cedric@beust.com)

ш■ы 11, 2019 5:52:45 PM com.codeborne.selenide.drivercommands.LazyDriver getAndCheckWebDriver

INFO: No webdriver is bound to current thread: 14 - let’s create a new webdriver

Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 2402

Only local connections are allowed.

Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

ш■ы 11, 2019 5:52:50 PM org.openqa.selenium.remote.ProtocolHandshake createSession

INFO: Detected dialect: OSS

ш■ы 11, 2019 5:52:52 PM com.codeborne.selenide.webdriver.WebDriverFactory logBrowserVersion

INFO: BrowserName=chrome Version=74.0.3729.169 Platform=XP

ш■ы 11, 2019 5:52:52 PM com.codeborne.selenide.webdriver.WebDriverFactory createWebDriver

INFO: Selenide v. 5.2.4

ш■ы 11, 2019 5:52:52 PM com.codeborne.selenide.webdriver.WebDriverFactory logSeleniumInfo

INFO: Selenium WebDriver v. 3.141.59 build time: 2018-11-14T08:17:03

ш■ы 11, 2019 5:52:52 PM com.codeborne.selenide.drivercommands.CreateDriverCommand createDriver

INFO: Create webdriver in current thread 14: ChromeDriver -> ChromeDriver: chrome on XP (709dd76c66a8676b5aedb421202b44cb)

ш■ы 11, 2019 5:52:54 PM com.codeborne.selenide.impl.UnusedWebdriversCleanupThread closeUnusedWebdrivers

INFO: Thread 14 is dead. Let’s close webdriver com.codeborne.selenide.SelenideDriver@4f5638e7

ш■ы 11, 2019 5:52:54 PM com.codeborne.selenide.drivercommands.CloseDriverCommand run

INFO: Close webdriver: 13 -> ChromeDriver: chrome on XP (709dd76c66a8676b5aedb421202b44cb)

ш■ы 11, 2019 5:52:54 PM com.codeborne.selenide.drivercommands.CloseBrowser run

INFO: Trying to close the browser ChromeDriver …

[ERROR] Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 12.633 s <<< FAILURE! - in TestSuite

[ERROR] checkGeneralComment(testcases.newTests.IssueListTest) Time elapsed: 9.321 s <<< FAILURE!

org.openqa.selenium.InvalidSelectorException:

Invalid selector

For documentation on this error, please visit: /documentation/webdriver/troubleshooting/errors/

Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’

System info: host: ‘CA-PC0HHK3C’, ip: ‘10.82.66.65’, os.name: ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_112’

Driver info: driver.version: unknown

at testcases.newTests.IssueListTest.checkGeneralComment(IssueListTest.java:232)

Caused by: java.lang.IllegalStateException: No webdriver is bound to current thread: 14. You need to call open(url) first.

at testcases.newTests.IssueListTest.checkGeneralComment(IssueListTest.java:232)

Вывод консоли при запуске тестов в Idea:

июл 11, 2019 5:44:59 PM com.codeborne.selenide.drivercommands.LazyDriver getAndCheckWebDriver

INFO: No webdriver is bound to current thread: 1 - let’s create a new webdriver

Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 44935

Only local connections are allowed.

Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

июл 11, 2019 5:45:36 PM org.openqa.selenium.remote.ProtocolHandshake createSession

INFO: Detected dialect: OSS

июл 11, 2019 5:45:37 PM com.codeborne.selenide.webdriver.WebDriverFactory logBrowserVersion

INFO: BrowserName=chrome Version=74.0.3729.169 Platform=XP

июл 11, 2019 5:45:37 PM com.codeborne.selenide.webdriver.WebDriverFactory createWebDriver

INFO: Selenide v. 5.2.4

июл 11, 2019 5:45:37 PM com.codeborne.selenide.webdriver.WebDriverFactory logSeleniumInfo

INFO: Selenium WebDriver v. 3.141.59 build time: 2018-11-14T08:17:03

июл 11, 2019 5:45:37 PM com.codeborne.selenide.drivercommands.CreateDriverCommand createDriver

INFO: Create webdriver in current thread 1: ChromeDriver -> ChromeDriver: chrome on XP (11909ce0ace922817977cf75c32016ee)

===============================================

Default Suite

Total tests run: 1, Failures: 0, Skips: 0

===============================================

Process finished with exit code 0

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 4.0.0
<groupId>isu.test</groupId>
<artifactId>ISUTest</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
        <aspectj.version>1.8.10</aspectj.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>

            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.1.0</version>
       </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20</version>
            <inherited>true</inherited>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>externalConfig\testng.xml</suiteXmlFile>
                </suiteXmlFiles>
                <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine>
                <systemPropertyVariables>
                    <allure.results.directory>${project.build.directory}/allure-results</allure.results.directory>
                </systemPropertyVariables>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<dependencies>

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.14.3</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-api</artifactId>
        <version>3.141.59</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>3.141.59</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>3.141.59</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>io.qameta.allure</groupId>
        <artifactId>allure-testng</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>selenide</artifactId>
        <version>5.2.4</version>
    </dependency>

    <dependency>
        <groupId>io.qameta.allure</groupId>
        <artifactId>allure-selenide</artifactId>
        <version>2.12.1</version>
    </dependency>

</dependencies>

Помогите, спасите)

Это надо ваш код смотреть.
Как минимум нужно видеть настройки TestNG (xml?) И что у вас во всяких @Before методах.

Скорее всего проблема в том, что TestNG из-под мавена как-то иначе запускает тесты в разных потоках.

1 лайк

Наcтройки TestNG

<!DOCTYPE suite SYSTEM "externalConfig\testng-1.0.dtd" >

<suite name="sample suite" configfailurepolicy="continue" verbose="10" time-out="300000">
    <test name="Nopackage" >
        <classes>
            <class name="testcases.newTests.IssueListTest" />
        </classes>
    </test>
</suite></div>

Все аннотации для TesNG

public abstract class AbstractTest {

    @BeforeTest
    protected void config() {
        System.setProperty("webdriver.chrome.driver", "chromedriver_74.exe");
        Configuration.startMaximized = true;
        Configuration.timeout = Settings.getIProperty("timeout.generalFindElement");
        Configuration.headless = Settings.getBooleanProperty("general.headless");
        SelenideLogger.addListener("AllureSelenide", new AllureSelenide().screenshots(true).savePageSource(false));
    }

    @AfterMethod
    public void clearCash() {
        WebDriverRunner.clearBrowserCache();
    }

}

}

Пример метода для страницы:

@Step("AuthPage: Авторизация: username = {login} / login = {password}")
    public IssuesToMePage login(String login, String password) {
        open(Settings.getProperty("login.url"));
        if (!loginInput.has(exactValue(""))) {
            WebElementHelper.clear(loginInput);
        }
        loginInput.sendKeys(login);
        passwordInput.sendKeys(password);
        signinSubmit.click();
        return new IssuesToMePage();
    }

Пример теста:

@Test(description = "Не могу выполнить. Валидация. Задача без подтверждения: Test ID 1431")
    public void checkCantExecuteIssue_WithoutConfirmation() {
        User user = Users.autotest1;
        UniversalIssue issue = UniversalIssue.init(user);
        issue.setConfirmation(false);

        authPage.login(user);
        issuesToMePage.leftMenu.clickCreateIssue();
        createIssuePage.createNewIssue(issue);
        issue.setId(createIssueSuccessPage.getIssueNumber());
        createIssueSuccessPage.clickOpenCreatedIssueButton();
        issuePage.leftMenu.clickExposedToMe();
        issuesToMePage.filter.clickGroupRandomType();
        issuesToMePage.clickOnCard(issue.getId());
        issuePage.actionForm.clickCantDoItButton();
        issuePage.cantDoItForm.checkStatic();
        issuePage.cantDoItForm.selectReason("Неправильные данные:");
        issuePage.cantDoItForm.clickConfirmButton();
        issuePage.cantDoItForm.checkDynamic("Необходимо выбрать причину.");
        issuePage.cantDoItForm.selectDetailedReason("впишите подробности в поле \"Общий комментарий\"");
        issuePage.cantDoItForm.clickConfirmButton();
        issuePage.cantDoItForm.checkDynamic("При отклонении задачи необходимо указать комментарий.");
        issuePage.cantDoItForm.fillCommentInput("Сэр, все пропало " + Helper.getCurrentDateTime());
        issuePage.cantDoItForm.clickConfirmButton();

        issuePage.assertStatusIssue(REJECTED);
    }

Пробовал перенести метод open в конец @BeforeTest, и в начало самого теста, но результат это не меняет.

В коде есть места, которые явно можно упростить. Например, вместо

        if (!loginInput.has(exactValue(""))) {
            WebElementHelper.clear(loginInput);
        }
        loginInput.sendKeys(login);

можно написать просто

        loginInput.setValue(login);

А для ответа на ваш вопрос нужно выяснить, откуда у вас берутся переменные issuesToMePage, createIssuePage, createIssueSuccessPage. Это поля теста? Статические поля? Как они инициализируются, в какой момент?

Благодарю за setValue, как-то не обращал на него внимания.

И да, вы правы - это поля теста.

public class IssueListTest extends AbstractTest {

    private AuthPage authPage = new AuthPage();
    private IssuesToMePage issuesToMePage = new IssuesToMePage();
    private IssuePage issuePage = new IssuePage();
    private CreateIssuePage createIssuePage = new CreateIssuePage();
    private CreateIssueSuccessPage createIssueSuccessPage = new CreateIssueSuccessPage();

В методе login (тот что описан выше), создается IssuesToMePage, но нигде не используется. Раньше я использовал цепочки из методов, но склонился на сторону, что без них мне понятнее, что происходит в тесте. Еще не везде убрал создание новых страниц в методах для них.
Соответственно эти поля инициализируются при начале тестового класса.

Думаю, в этом и проблема. TestNG инициализирует тестовый класс (включая его поля, т.е. ваши пэджобжекты) только один раз, а не перед каждым тестом. И неизвестно в каком потоке.

Мой совет - создавайте пэджобжекты (да и вообще любые объекты) там, где они реально используются.

А ещё лучше выкиньте нафиг TestNG - от него одни проблемы.

Спасибо, проблема была именно в этом.

Если перетащить создание объектов в методы, то все отрабатывает. Ну и при замене фреймворка с TestNG на Junit все тоже работает.

1 лайк