[Resolved] тесты мешают друг другу, Selenium/Selenide

Привет!

Постигла небольшая, но пакостная проблема. Есть два класса с тестами:

public class SocialLoginTest {

    @After
    public void endThisSession() {
        clearBrowserCache();
    }

    @Test
    public void twitterLoginFromMain() {

    Basic.openEngPage(); // Открываем 4ш

    $(byAttribute("data-element", "3")).waitUntil(Condition.appear, 10000);
    $(byAttribute("data-element", "3")).click(); // кликаем на кнопку твиттера

    Social.twitterLogin("TwitterLogin2", "TwitterPass2");

    $("#folderMenuContainer").waitUntil(Condition.appear, 15000); //в аккаунте ли мы?
 }

public class SocialRegistrationTest {

    @After
    public void endThisSession() {
        clearBrowserCache();
    }

    @Test
    public void twitterRegFromMain() {
    $$(".tw").find(Condition.visible).click(); //кликаем твиттер на главной

    Social.twitterLogin("TwitterLogin", "TwitterPass");
    $(".avImg").should(Condition.appear); //аватар
    $("#step1firstname").should(Condition.appear);
     }

Первый тест делает логин через твиттер аккаунт и, вроде как, чистит после себя. Второй тест призван протестировать регистрацию через тот же твиттер, но он этого не делает, так как я остаюсь залогиненым в первый твиттер акк. Тут происходит конфликт и вся пачка тестов регистрации через соц сети валится(та же проблема с фб и гуглом). Прочел, что Селениумовский метод .deleteAllCookies() (у меня это clearBrowserCache) чистит только куки с текущего домена. Мне кажется, тут и кроется проблема. Не подскажете изящного решения?

  1. Переоткрывать браузер перед запуском нового теста и не морочить себе голову с кешами / куками. К тому же, локально браузер открывается очень быстро.
  2. Делать логаут в качестве пост кондишена.

П.С. И Selenide тут не причем.

П.С. И Selenide тут не причем.

Я и не сказал, что он тут при чем. Указал то, что использую.

Переоткрывать браузер перед запуском нового теста и не морочить себе голову с кешами / куками.

Так и делаю. Каждый тест начинается с Basic.openEngPage(); что и есть переоткрытие браузера. Вижу, что в основном сообщении я недокопировал все. Делаю так:

@Test
    public void socialRegistrationFB() {

        Basic.openEngPage();

@Test
    public void twitterLoginFromMain() {

        Basic.openEngPage();

Строка Basic.openEngPage(); мало о чем кому-то скажет. Что внутри? Даже если вы там открываете браузер, где собственно закрытие происходит?

по-умолчанию браузер стартует с чистой сессией…
покажите чуть больше кода,

и почему в @After не

driver.close();

??

Вот поэтому я и упомянул Селенид. Он сам открывает и закрывает браузер. Внутри Basic.openEngPage():

        open("http://www.4shared.com");
        Cookie ck = new Cookie("4langcookie", "en");
        WebDriverRunner.getWebDriver().manage().addCookie(ck); 

Пока ходил в исходники селенида нашел там строку: If browser window was already opened before, it will be reused. Похоже, единожды открыв окно браузера, селенид переиспользует его для других тестов в пакете.

Странно. А визуально вы разве не замечали, что браузер не закрывается?

closeWebDriver() вам в помощь:

https://github.com/codeborne/selenide/blob/master/src%2Fmain%2Fjava%2Fcom%2Fcodeborne%2Fselenide%2FWebDriverRunner.java

6 лайков

Долго же меня мучала эта проблема, а все оказалось так просто.

Спасибо большое.

Для “спасибо” кликаем :wink:

3 лайка