t.me/atinfo_chat Telegram группа по автоматизации тестирования

assertThat неправильно сравнивает ожидаемый и фактический результат

Теги: #<Tag:0x00007f74851ced40> #<Tag:0x00007f74851cec78>

Всем привет, коллеги!
Столкнулся со следующей проблемой во время проверки содержимого элемента страницы с помощью hamcrest (assertThat).

Коротко о методе и его сути:

На странице имеются элементы, в которых содержится цена на товар, с указанием символа валюты ($, ₴…). Написал метод, в котором в ArrayList заганяю все эти элементы (их на стр. 8). Потом в цикле перебираю их и достаю текст (getText). Вывожу в консоль - всё работает отлично, то есть строку подтянуло. НО при сравнивании этой же строки с ожидаемым результатом, а именно - наличия символа валюты assertThat(string, containsString(“₴”)); получаю ошибку, которая говорит, что фактический результат = “”, то есть пусто. Прошу помочь разобраться.

public void verifyCurrencyUah ()
{
ArrayList el = new ArrayList<>();
el.addAll(driver.findElements(priceOfProduct)); //добавляю в ArrayList элементы, в которых содержится строка с ценой и символом валюты

    for (int i=0; i<el.size(); i++) 
    {            
        String string = el.get(i).getText(); //для каждого из 8 элементов достаю текст 
        assertThat(string, containsString("₴")); // текст должен содержать символ валюты гривна
       
    }
}

Ответ:
java.lang.AssertionError:
Expected: a string containing “₴”
but: was “”
Expected :a string containing “₴”
Actual :""

Если сделать тоже самое, но вывести в консоль:

19,81 ₴

32,40 ₴

31,20 ₴…

Пиши ожидания и кондишены, или используй Selenide. Скорее всего ассёрт происходит до того как текст появился.

Не помогло - тоже самое. Пробовал даже через Thread.sleep.

Обнаружил один нюанс:
В ArrayList текст элементов почему-то попадает весь в индекс [0]. То есть размерность этого массива - [1], а не 8 (по количеству элементов).

не знаю, на первый взгляд всё норм, попробуй пройтись по массиву через foreach,но результат должен быть тот же…а дебаггер что говорит?
ЗЫ так же ещё попробуй ссылку на массив сделать как List <WebElement> list = driver.findElements(priceOfProduct);
ну и смотри чтобы priceOfProduct имели корректный икспас/css

Почему в ответе только ошибка для двух элементов, а не восьми.

Всё нашел проблему. Я по своей невнимательности не заметил, что по данному xpath есть скрытые елементы. Оно первый элемент брало скрытый, который “пустой” и на нем же падало. Добавил в xpath уникальности - теперь скрытые элементы не трогает и всё ОК.

Спасибо всем, кто проникся :grinning:

А оно проверяет первый и если возвращает false - на нем же и валится.

То есть, assert все таки справнивает правильно :slight_smile:

Да. Зря на assert нагнал :grinning:

1 Симпатия