Selenium - нажатие кнопки зарегистрировано, но не перенаправляет страницу на целевую ссылку - PullRequest
0 голосов
/ 07 ноября 2018

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

Однако иногда при нажатии кнопки перенаправление страницы не вызывается. Я уверен, что кнопка будет нажата правильно, так как анимация кнопки запускается, и селен продолжает тестирование, где он терпит неудачу, потому что не находит элементов, которые должны быть на следующей странице.

Одним из возможных путей решения этой проблемы может быть Thread.sleep () до нажатия кнопки, но я бы хотел избежать этого решения.

Я пробовал этот обходной путь, где я проверял, произошло ли перенаправление, но это просто заставляет страницу зацикливаться и никогда не загружаться.

while(!driver.getCurrentUrl().toLowerCase().endsWith("login/checkout")) {
    driver.findElement(By.cssSelector("button[data-checkout-url='/cart/checkout']")).click();
}

Например, эта кнопка, о которой идет речь. Однако такое поведение наблюдается на нескольких кнопках.

<button class="btn btn-primary btn-block btn--continue-checkout js-continue-checkout-button"
   data-checkout-url="/cart/checkout">
   Checkout
</button>

Кнопка обрабатывается javascript, однако, поскольку я только тестирую пользовательский интерфейс, у меня нет глубоких знаний о системе. Кнопка обычно только перенаправляет вас на страницу входа.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Однако иногда при нажатии кнопки перенаправление страницы не выполняется. срабатывает. Я уверен, что кнопка нажимается правильно, так как Анимация кнопки срабатывает, и Selenium продолжает тест, где она не удается, потому что он не находит элементы, которые должны быть на следующая страница.

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

Хотя только отладка действительно скажет вам, что происходит, я могу предложить обоснованное предположение:

Кажется, что страница выполняет дополнительную инициализацию в фоновом режиме после загрузки видимой части. Например, он может запустить JavaScript после загрузки, который прикрепляет обработчики событий к кнопкам. Это означает, что после загрузки страницы есть короткое время, когда она не полностью функциональна. Если вы нажмете на это окно во время теста, произойдут странные вещи.

Чтобы правильно справиться с этим, вам необходимо:

  • узнайте, что именно еще не «готово» на странице
  • найдите на странице что-то, что говорит о том, что страница готова, например, появляется DIV
  • вставьте код в свой тест (в идеале в объект страницы , который вы, как мы надеемся, используете), который ожидает готовности страницы, обычно используя WebDriverWait

К сожалению, детали того, как это сделать, будут зависеть от страницы, поэтому вам придется немного покопаться (см. Выше :-)). Между прочим, этот тип проблемы не является редкостью при тестировании сложных веб-приложений: часто приложение будет выполнять какие-либо действия в фоновом режиме после завершения действия (например, загрузки страницы или нажатия кнопки), и вам придется подождать " реальное завершение "перед дальнейшим взаимодействием со страницей.

Одним из возможных решений проблемы будет Thread.sleep () перед нажатием кнопку, но я бы хотел избежать этого решения.

Да, это обходной путь, который я действительно использовал. Это может быть прагматичным решением, если «правильное» решение, изложенное выше, слишком утомительно, но, как вы, вероятно, знаете, это не надежное решение (вы никогда не знаете, как долго ждать), и, если оно используется часто, замедлит ваши тесты Поэтому я рассматриваю это как вариант последней инстанции.

0 голосов
/ 07 ноября 2018

Вы можете использовать команду wait.until (), чтобы проверить, загружен ли ожидаемый элемент и установить максимальное время для поиска элемента при создании экземпляра WebDriverWait ()

 WebDriverWait wait = new WebDriverWait(driver, 10);
 wait.until(ExpectedConditions.or(
 ExpectedConditions.visibilityOfElementLocated(By.id("id1")),
 ExpectedConditions.visibilityOfElementLocated(By.id("id2"))
 ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...