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

webdriver
java
Теги: #<Tag:0x00007f3d44a4d818> #<Tag:0x00007f3d44a4d638>

(Олександр Зань) #1

Всем привет, коллеги!
Столкнулся со следующей проблемой во время проверки содержимого элемента страницы с помощью 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 ₴...


(Pavel Ponomaryov) #2

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


(Олександр Зань) #3

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


(Олександр Зань) #4

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


(Алексей Бобруцков) #5

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


(Oleksii Ihnatiuk) #6

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


(Олександр Зань) #7

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

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


(Олександр Зань) #8

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


(Viktor Vladimirovich) #9

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


(Олександр Зань) #10

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