Быстрая проверка - есть элемент на странице или его нет

По хорошему - да, но для этого нужно с сервера получать информацию - был залогинен или нет. Пока этим заниматься точно не охота.

Если вы имеете ввиду тест - зайти в кабинет, некорректно выйти, снова зайти, то вопрос не в этом, а в том что нужна проверка для корректной работы других тестов, которые могут попасть в ситуацию - предыдущий пользователь некорректно вышел. Сам тест на “появляется сообщение или нет” не особо требуется.

Сессия должна быть частично привязана к кукам. Так что если вы стартанете браузер, который ничего не знает о вашей прошлой сессии, сервер должен сгенерировать новый токен. К тому же, сессии в пределах одной тачки не должны конфликтовать. Вы ведь не с другого компа логинетесь.

Куки тут не при чем. Идея вот в чем - если вы с одного компа залогинились под одним пользователем, а с другого компа кто-то другой пытается залогиниться под этим же пользователем - у него будет сообщение о том что этот пользователь уже “занят”, но его все еще можно выкинуть. Так что свежий профиль тут никак не поможет.

У вас каждый тест запускается на разных компах, или что? Если нет, то система не должна трактовать запуск в пределах одного и того же ПК, как сторонний. Так что если вы будете подменять профиль там же, где был запущен предыдущий тест, никаких сообщений быть не должно.

Тест на одном компе.
В рамках новой сессии - именно так и трактует, т.е. при попытке войти появляется страница что уже кто-то вошел.
В рамках одной сессии - появляется совершенно другая страница (“Вы уже зарегистрированы в системе”).

Вот такая реальность :smile:

Т.е. вы хотите сказать, что если вы залогинелись, к примеру, в хроме, закрыли его (без логаута), запустили FF (на том же ПК), то вы окажетесь все еще залогиненным? :worried: С сопутствующим сообщением, что кто-то уже зашел…

Нет. Если вы залогинились в хроме, закрыли его без логаута, запустили FF, то вы будете на странице ввода логин/пароль. Не залогинены, но если попытаетесь зайти под тем же пользователем будет страница с сообщением что уже кто-то зашел.

Ну тогда вопросов нет. По крайней мере к вам. :slight_smile: А вот к вашим разработчикам - много…

тесты должны быть не зависимы друг от друга
т.е. если один тест вышел “некорректно” то остальные тесты это волновить не должно.
надо либо генерировать каждый раз нового юзера
либо чистить сессию из бд перед каждым запуском теста
либо еще что то спецефичное для конкретного продукта.

3 лайка

Зато мой вопрос так и остался :smile: Мы как-то отклонились от темы от “Как?” в сторону “Для чего?”

Вот тогда Вам еще в копилку костылей по данному вопросу:
Взять допустим HttpClient и перед каждым тестом на уровне запросов делать “правильный” log in и logout. Тогда перед каждым тестом учетная запись будет свободна.

1 лайк

Во время выполнения этого правильного логина/логаута так же и останутся те же самые вопросы разве нет? Точно так же ему не будет известно будет “чистый” вход или с подтверждением, что повлечет за собой такую же проверку страницы.

Почему же, теоретически отправляете последовательно три запроса: Login, Confirm, Logout.
Не важно чистый этот вход или нет, сервер от вас получит последовательность на которую допустим отреагирует ОК-NOT-OK или OK-OK-OK. В любом случае на выходе получим правильный logout.
От того что пользователь с “чистым” входом вдруг сформирует и отправит запрос на подтверждение, никто же не умрёт надеюсь, сервер ему что-то ответит и всё.

1 лайк

Мысль очень интересная, большое спасибо! Сейчас банально не хватает знаний это реализовать, но поизучаю этот вопрос

Да, вы правы, я буду стремиться к независимости тестов. Судя по всему нужно будет узнать где хранится информация о сессии и постараться реализовать метод для ее изменения

  public int iAmOnPage(WebDriver driver) {
    String id1 = "#loginform";
    String id2 = "#userinfo";
    WebElement element = new WebDriverWait(driver, 60).until(
        ExpectedConditions.presenceOfElementLocated(
            By.cssSelector(String.format("#%s, #%s", id1, id2))));
    return element.getAttribute("id").equals(id1) ? 1 : 2;
  }

  if (iAmOnPage(driver) == 1) {
    // do something on page 1
  } else {
    // do something on page 2
  }
3 лайка

Не могли бы пояснить эту строчку:

ExpectedConditions.presenceOfElementLocated(
            By.cssSelector(String.format("#%s, #%s", id1, id2))));

Здесь выполняется ожидание либо одного либо другого элемента?

Да, ищется элемент, подходящий под один из селекторов, перечисленных через запятую.

1 лайк

Быстрая проверка если нужно проверить что элемента нет

public boolean isElementNotPresent(By locator) {
    boolean isEmpty;
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    isEmpty = findElements(locator).isEmpty();
    driver.manage().timeouts().implicitlyWait(Constants.SHORT_DELAY, TimeUnit.MILLISECONDS);
    return isEmpty;
  }
и если не словить false пока страница не до грузилась проверь перед этим хотя бы так 


public WrappedDriver waitForPageLoad(int delay) {
    String pageLoadState;
    do {
      pageLoadState = (String) executeScript("return document.readyState;");
      System.out.println("Page load status: " + pageLoadState);
      delay(ONE_SECOND_DELAY);
      delay -= ONE_SECOND_DELAY;
    } while (!pageLoadState.equals("complete") && delay > 0);

    return this;
  }

Хотел бы в заключении отметить, что лучшим способом, по моему мнению и как пока показала практика, является тот, что предложил Алексей Баранцев. Я некоторое время пользовался другим - сравнивал названия страниц, но потом обнаружил, что периодически происходит сбой - видимо название не успевало смениться до проверки getTitle(). Сейчас же переделал это в ожидание одного из двух элементов и, исходя из того что обнаружится, определяю на какой странице нахожусь.

Всем спасибо за участие, особенно Алексею, узнал много нового :blush: