#java #selenium #serenity-bdd
Вопрос:
Я пытаюсь найти цель, которая представляет собой закусочную с сообщением и кнопкой, которая видна только в течение 3 секунд после того, как я нажму на кнопку:
Если я приостановлю отладчик, я найду элемент с селектором css .mat-snack-bar-container
:
Но в коде, когда я пытаюсь получить цель с помощью того же селектора, она никогда не будет найдена ни как цель, ни если я использую драйвер для поиска элемента:
actor.attemptsTo(WaitUntil.the(SnackBar.SNACK_BAR_CONTAINER,isCurrentlyVisible()).forNoMoreThan(10).seconds());
Я пробовал isCurrentlyVisible
isVisible
, isPresent
и ничего.
С помощью findElement я также ничего не получаю:
WebElement snackBar = webDriver.findElement((By.cssSelector(".mat-snack-bar-container")));
Когда я вижу скриншоты шагов, я действительно вижу закусочную…
Есть какие-нибудь идеи? Спасибо!
Ответ №1:
Я думаю, тебе нужно сделать:
WebElement snackBar = webDriver.findElement((By.cssSelector(".mat-snack-bar-container")));
WebElement snackBar = webDriver.findElement((By.className(".mat-snack-bar-container")));
Комментарии:
1. Нет. В
cssSelector
вы можете использовать имя класса, обозначив его.
Ответ №2:
Если вы знаете, какой текст будет представлен, вы можете использовать textToBePresentInElementLocated
метод. Давайте рассмотрим пример ниже,
HTML: Я предполагаю, что ваш HTML будет таким.
lt;input class="mat-snack-bar-container"gt; Workflow testing "sth" saved. lt;/inputgt;
Подождите, пока появится текст, если вы знаете ожидаемый текст
WebElement snackBar = wait.until(ExpectedConditions.textToBePresentInElementLocated(By.xpath("//input[@class='mat-snack-bar-container']"), "Workflow testing")); snackBar.click();
Комментарии:
1. Вы изменили название тега?
//*[@class='mat-snack-bar-container']
или//snack-bar-container[@class='mat-snack-bar-container']
2. Это для меня не работает, он все равно не находит элемента. HTML-код похож: lt;snack-bar-container class=»mat-snack-bar-container»gt;lt;spangt;Тестирование рабочего процесса «СТГ» спасlt;/spangt;lt;/snack-bar-containergt; поэтому обновление подождать.пока с textToBePresentInElementLocated(«//простой-снэк-бар/промежуток»), «процесс тестирования»), он все равно не найдет элемент..
3. Я заметил, что когда я печатаю исходный код html с помощью driver.getPageSource() Я также не нахожу текст, поэтому его невозможно найти с помощью findElement… Я проведу еще несколько тестов, чтобы выяснить, почему… Большое вам спасибо @Nandan A
Ответ №3:
Я выяснил, почему актер не смог найти закусочную. В файле serenity.properties
у меня была такая строка: serenity.step.delay=2500
это как раз то время, когда этот элемент был виден. Если бы я использовал драйвер напрямую, это не повлияло бы, и я мог видеть закусочную как на скриншотах, так и в источнике страниц. Но с помощью актера я мог видеть это только на скриншотах и иногда. Как только я снизил задержку шага до 500, я смог найти элемент.
Спасибо всем за вашу помощь!