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

WebDriver. Почему удаляется сессия?


(Александр Беликов) #1

Добрый вечер. Объясните, почему, имея вот такой файл testng.xml:

<suite name = "selenium-tests" parallel = "tests" thread-count = "1">
<listeners>
    <listener class-name="utils.Listener"/>
    <listener class-name="utils.Screenshoter"/>
</listeners>
<test name = "test1">
    <parameter name="nodeIP" value="192.168.123.111"/>
    <classes>
        <class name="Class1"/>
    </classes>
</test>

<test name = "test2">
    <parameter name="nodeIP" value="192.168.123.111"/>
    <classes>
        <class name="Class2"/>
    </classes>
</test>

после выполнения всех тестов из Class1 происходит 5-ти минутная задержка, WebDriver не делает абсолютно ничего, потом в консоль падает, что сессия была успешно удалена, и начинает создаваться новая сессия для Class2. Как этого избежать? Почему они не могут в одной сессии выполняться? Спасибо


(vmaximv) #2

По таймауту.

ЗЫ: Код покажите


(Александр Беликов) #3

Код чего необходимо показать? Имеется класс Base, котором представлены 2 аннотации.

@BeforeClass

public void initApp() {
app = new ApplicationManagerImpl();
}

@AfterSuite

public void stop() {
app.stop();
}

В ApplicationManagerImpl инициализируются хэлперы , драйвер.


(vmaximv) #4

А теперь глядя на testng.xml напишите в какой последовательности будут выполнятся initApp() и stop()?


(Александр Беликов) #5

После выполнения команды mvt test последует выполнение метода init(), т.к он аннотирован @BeforeClass, после init() выполнится Class1, затем снова init(), после - Class2. По завершению Class2 стопаем драйвер методом stop().


(vmaximv) #6

Райт. Теперь я скастую MindVision и…

  1. Ваша нода ограничена одним инстансом браузера.
  2. В init() всегда создается новый инстанс драйвера.
    Итого:

[quote=“belikov_as88, post:5, topic:5240”]
после init() выполнится Class1
[/quote]Создаем сессию

Пытаемся создать новую, но так как п1 - то висим пока хаб не прибьет открытый браузер.

Закрываем сессию от Class2


(Александр Беликов) #7

Т.е получается, нужно дописать метод, и аннотировать его @AfterClass? Чтобы после каждого класса прибивался браузер? Правильно понимаю?


(vmaximv) #8

Ну смотря что вам нужно:

  1. Одна сессия/драйвер на сьют -> переименовать BeforeClass в BeforeSuite
  2. Новые сессии/драйвера для каждого класса -> переименовать AfterSuite в AfterClass

(Александр Беликов) #9

Пока что нужно чтобы 1 сессия на suite. Сейчас исправлю на @BeforeSuite, отпишу что получилось


(Александр Беликов) #10

Увы, не помогло. Заменил @BeforeClass на @BeforeSuite - результат тот же. Прилагаю скрин консоли.

В14:24, логаутом закончился Class1, затем чуть более 5-ти минут простоя, и после начинается создание новой сессии.


(vmaximv) #11

Так а таки у ноды есть ограничения на кол-во сессий?


(Александр Беликов) #12

Нет, не задаю никаких ограничений


(vmaximv) #13

Извините, но не верю.
Что бы в логах получить Create new session, нужно в коде выполнить new RemoteWebDriver(), что при данном раскладе не возможно, так как ваш init() должен выполниться единожды перед сьютом.

У пятиминутного “простоя” есть всего две возможных причины:

  1. У вас в коде слип на 5 минут.
  2. На ноде нет свободных сессий. Как я понимаю грид вы не используете - поэтому 1_нод=1_браузер. Скорее всего вы не закрываете браузер в ApplicationManagerImpl.stop().

По таймаутам смотрите тут RemoteWebDriverServer