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

Не закрывается браузер в "серии" тестов (testng)

Привет, составил первый тест с использованием selenide

Тест заключается в следующем

  1. Открываю браузер
  2. Логинюсь
  3. Ввожу данные, для отправки письма, проверяю, что подставился корректный шаблон письма
  4. Отправляю письмо
  5. Проверяю, что в письмо подставились корректный данные Пользователя

Код теста:

import org.testng.Assert;
import org.testng.annotations.Test;
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.Selenide.switchTo;

public class SendLettersFromOTRSPt {
String url = “http://test.url?Token=abCD&ID=”;

@Test
public void runTemplate1() {
    open(url + "1");
    $x("//*[@id='User']").setValue("test");
    $x("//*[@id='Password']").setValue("123456");
    $x("//*[@id='LoginButton']/span").click();

    $x("//*[@id='Subject']").setValue("Test Template 1: \"Answer - empty answer\"");
    $x("//*[@id='ToCustomer']").setValue("user@user.user");

    switchTo().frame(0);
    //Assert.assertEquals(dataPage.checkScriptText(),"text");
    String macrosText = $x("/html/body").getText();
    Assert.assertTrue(macrosText.contains("[% text]"));

    switchTo().defaultContent();

    $x("//*[@id='submitRichText']/span").click();

    switchTo().frame(1);
    String richText = $x("/html/body").getText();

    Assert.assertTrue(richText.contains("Text"));
}

@Test
public void runTemplate10() {
    open(url + "10");
    $x("//*[@id='User']").setValue("test");
    $x("//*[@id='Password']").setValue("123456");
    $x("//*[@id='LoginButton']/span").click();

    $x("//*[@id='Subject']").setValue("Test Template 10: \"Answer - GENERAL\"");
    //.removeEmail()//$(By.xpath("//*[@id='RemoveCustomerTicket_1']/i")).click();
    $x("//*[@id='ToCustomer']").setValue("user@user.user");

    switchTo().frame(0);
    String macrosText = $x("/html/body").getText();
    Assert.assertTrue(macrosText.contains("[% message]"));

    switchTo().defaultContent();

    $x("//*[@id='submitRichText']/span").click();

    switchTo().frame(1);
    String richText = $x("/html/body").getText();

    Assert.assertTrue(richText.contains("Message"));
}

}

Столкнулся с проблей - при запуске “серии” тестов. А именно, первый тест(runTemplate1) проходит успешно, второй тест(runTemplate10) - открывается на странице для ввода данных письма, минуя страниц “логина”.

При дебаге, если верно понял, браузер не закрывается после первого теста.

Тесты запускаются через браузер Chrome (Version 83.0.4103.116 (Official Build) (64-bit) для Linux).Также пробовал добавить аннотацию @BeforeTest:

@BeforeTest
public void openBrowser(){
Configuration.browser = “firefox”;
}
но результат был тот же - второй тест запускался минуя страницу “логина”

Также добавлял аннотацию:

@AfterTest
public void closeBrowser(){
WebDriverRunner.getWebDriver().close();
}

где браузер после первого теста, также не закрылся
Тесты пишу на ОС: debian 9.12 (x84-64) + java + TestNG

Буду благодарен, если кто-то подскажет, в чем может быть проблема

Так куки сохранились, поэтому и не происходит перехода на логин пейдж.
После отправки письма и проверки, в первом тесте, добавьте логаут из системы.

2 Симпатий

Да, селенид по умолчанию не закрывает браузер между тестами. Это сделано для скорости: если переоикрывать браузер перед каждым тестом, будет очень долго.

Но если вам это неважно, можете закрывать. У вас почти правильно, только вместо WebDriverRunner.getWebDriver().close() напишите Selenide.close().

2 Симпатий

Кстати, ваш код можно упростить.

  1. $x("//*[@id='User']").setValue("test"); --> $("#User").setValue("test");
  2. $x("//*[@id='LoginButton']/span").click(); --> $("#LoginButton span").click();
  3. Assert.assertTrue(macrosText.contains("[% text]")); --> $x("/html/body").shouldHave(text("[% text]"));

и т.д.

3 Симпатий

Прям от души, спасибо, за ответы, буду пробовать!

  1. В аннотацию вынес - заработал

@AfterMethod
public void closeBrowser(){
Selenide.closeWebDriver();
}

использую selenide 5.13.0 - пишет, что метод Selenide.close() устарел для данной версии.

  1. Похоже, что есть смысл “логин” вынести в аннотацию
    @BeforeTest и продолжать тесты без закрытия/переоткрытия окна браузера. Сбивало с толку, то что не получится запускать выборочно тесты через .xml. По идеи все ок.

По поводу упрощений кода - я так понимаю это css-селекторы, пока ещё руки не дошли. x-path для текущей задачи достаточно - получаю через chrom devTools