Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenide Gradle TestNG и лишние незакрытые инстансы драйвера

selenide
Теги: #<Tag:0x00007f7b651c1140>

(heartwilltell) #1

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="SomeTests" parallel="classes" thread-count="3">
    <test name="Tests">
        <classes>
            <class name="SomeOneTest"/>
            <class name="SomeTwoTest"/>
            <class name="ApiTest"/>
        </classes>
    </test>
</suite>

build.gradle

plugins {
    id "java"
    id "com.github.ben-manes.versions" version "0.11.3"
}

group 'com.tests'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    agent
}

ext {
     aspectjVersion="1.8.6"
     allureVersion="1.4.16"
}


dependencies {
    compile "org.testng:testng:6.9.6"
    compile "org.seleniumhq.selenium:selenium-server:2.47.1"
    compile "com.codeborne:selenide:2.21"
    compile "ru.yandex.qatools.allure:allure-report-data:${allureVersion}"
    compile "ru.yandex.qatools.allure:allure-testng-adaptor:${allureVersion}"
    compile "com.jayway.restassured:rest-assured:2.4.1"
    compile "com.google.code.gson:gson:2.3.1"
    compile "com.typesafe:config:1.3.0"
    agent   "org.aspectj:aspectjweaver:${aspectjVersion}"
}

test.doFirst {
    jvmArgs "-javaagent:${configurations.agent.singleFile}"
}

test {
    useTestNG() {
        suiteXmlFiles << new File(rootDir, "testng.xml")

        systemProperties = [
                browser: System.getProperty('browser', 'firefox'),
        ]
    }
}

Три тестовых класса

import com.jayway.restassured.RestAssured;
import org.testng.annotations.Test;

public class ApiTest {

    @Test
    public void apiTest1() {
        RestAssured
                .get("http://google.com")
                .then()
                .statusCode(200);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void apiTest2() {
        RestAssured
                .get("http://google.com")
                .then()
                .statusCode(200);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

второй

import com.codeborne.selenide.Selenide;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import ru.yandex.qatools.allure.annotations.Description;
import ru.yandex.qatools.allure.annotations.Title;

import static com.codeborne.selenide.Selenide.$;

public class SomeOneTest {

    @Test
    @Title("Test 1 Class 1")
    @Description("Description to test 1")
    public void test1() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("honda").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    @Title("Test 2 Class 1")
    @Description("Description to test 1")
    public void test2() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("toyota").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

третий

import com.codeborne.selenide.Selenide;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import ru.yandex.qatools.allure.annotations.Description;
import ru.yandex.qatools.allure.annotations.Title;

import static com.codeborne.selenide.Selenide.$;

public class SomeTwoTest {

    @Test
    @Title("Test 1 Class 2")
    @Description("Description to test 1")
    public void test1() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("nissan").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    @Title("Test 2 Class 2")
    @Description("Description to test 1")
    public void test2() {
        Selenide.open("http://google.com");
        $(By.name("q")).setValue("subaru").pressEnter();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Вот ссылкана архив с проектом который четко воспроизводит проблему - https://www.dropbox.com/s/mdjop59z0pihtr3/mps-tests.zip?dl=0

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

Все совету и соображения по поводу приветствуются


(heartwilltell) #2

Удалось методом тыка локализовать проблему - если отключить алур - то проблема пропадает


(heartwilltell) #3

@vania_pooh @asolntsev не хотите взглянуть?


(asolntsev) #4

Ух ты, это интересно. Это полезная информация, поможет. Взгляну обязательно!


(Stan) #5

У меня нормально запускается и все заканчивается корректно, инстансов браузера не остается, что я делаю не так? :slight_smile:


(heartwilltell) #6

Запускаешь из IDE?
Консоль и clean test - удивишься )))


(Stan) #7

Как раз из консоли


(heartwilltell) #8

предельно странно :frowning:
Давайте тыкать пальцем в воздух - какая версия грейдла у вас установлена?


(Stan) #9
------------------------------------------------------------
Gradle 2.6
------------------------------------------------------------

Build time:   2015-08-10 13:15:06 UTC
Build number: none
Revision:     233bbf8e47c82f72cb898b3e0a96b85d0aad166e

Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Linux 3.16.0-45-generic amd64

(asolntsev) #10

Уф, разобрался. В версии Selenide 2.20 было сделано такое изменение, что вебдрайверы теперь закрываются в отдельных потоках, чтобы побороть такую проблему, когда операция закрытия вебдрайвера зависает и подвешивает весь тест. Эти потоки - демоны, поэтому при остановке JVM они убиваются сразу и могут не успеть завершить свою работу.

Думаю, это можно исправить в selenide 2.22


(heartwilltell) #11

Откатился до 2.19, проблема в создание лишних драйверов отпала только для Firefox, Chrome же при запуске штамповал себя в таком количестве что у меня в док столько окон не влазило :frowning:


(asolntsev) #12

Хм, значит, проблема в чём-то ещё. А если оставить selenide 2.19 и отключить Allure?


(heartwilltell) #13

Отключение Allure убирает все проблемы и на 2.21
Но мне конечно сейчас выпиливать весь алюр из проекта, будет очень весело :slight_smile:


(asolntsev) #14

Нет, я просто пытаюсь понять, в чём проблема. Allure сам ведь вроде не должен открывать браузер? Значит, он лишь случайно влияет на ситуацию, но не является причиной.


(Sergey Korol) #15

Мне кажется, что проблему надо искать на уровне testng. Вы подключаете самую последнюю версию, selenide также ее использует. Но вот allure-testng-adaptor подключает версию 6.8. Я не знаю, как gradle резолвит конфликт версий, но исходя из того, что при отключении allure проблема пропадает, я бы рекомендовал начать именно отсюда. Можете попробовать пересобрать адаптер с последней версией.


(asolntsev) #16

Я зарелизил Selenide 2.22, там проблема с открытыми браузерами должна быть решена. Попробуй?