Спокойствие: Не удается найти цель, показываемую в течение 3 секунд

#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, я смог найти элемент.

Спасибо всем за вашу помощь!