Помогите разобраться в чем ошибка метода

Суть проблемы - на последнем шаге некоего калькулятора есть выдача результата в виде списка


У каждого такого результата есть ИМЯ и оно хранится здесь

Также у каждого результата есть кнопка для заказа

Я сделал метод позволяющий нажать на конкретную кнопку заказа основываясь на имени результата
image
Но метод не работает, он никак не может выполнить условие

Нужно пройти дебагером, посмтореть выполняется ли условие x.getText().equals(name). И от этого уже отталвкиваться.

1 лайк

Так а x.getText() возвращает то что нибудь?

Я дебагнул код и обнаружил вот что

public void orderFrom(String name) {

        System.out.println(offers.get(0).getText()); //Без этого куска луп не работает 

        for (SelenideElement x : offers) {

            if (x.getText().equals(name)) {

                x.find(withText("Заказать")).click();

                break;

            }
        }
    }

Если я перед объявлением лупа вызываю sout с такими данными -> offers.get(0).getText(), то я прохожу условие но программа крашится на кнопке “Заказать” (Element Not Found), как только убираю sout, ерроров не происходит, программа отрабатывает без ошибок (не проходит условие)

Проблема определенно в лупе, потому как при объявлении того же (что и выше) sout’а непосредственно в лупе - луп игнорируется и консоль пуста.

А зачем вам вообще коллекция элементов? Почему бы сразу не найти нужный, внутри него уже клацнуть на кнопарь?

Именно этим я и занимаюсь, а коллекция ищет нужный элемент по имени


Что бы в итоге всё выглядело так image

Я к тому, почему не написать $(byText(Инари")).find(withText(“Заказать”)).click()

2 лайка

Коллекции мне нужны для того, что бы искать кнопку Заказать

Иерархия name
[result-item__body]
[div] №1 <— мы идем по разным дивам
[a]

Иерархия button “заказать”
[result-item__body]
[div] №3 <— мы идем по разным дивам
[button]

Я не могу искать объект вне его иерархии

Это проблему я пофиксил, исправил локатор коллекции на более ранний в иерархии (result-item__body)

Теперь нужно понять почему луп не работает без этого куска кода

        offers.get(0).getText());

Подозревая, что Заказать которое было получено из DOM имеет пробельные символы и поэтому не сопоставляется с чистым Заказать

Если я правильно понял док по селениду - withText работает как contains, т.е. ему не важно что ещё есть в строке если она содержит искомое слово

Циклы вообще зло.
Нужно написать в одну строчку, примерно так:

$(byText(Инари")).find(withText(“Заказать”)).click();

3 лайка

В Java ведь завезли лямбды давно уже.
Если человек так уж хочет коллекцию, то можно использовать хотя бы их)

Нет, в данном случае это не помогло бы.
Я имел в виду, что именно в тестах циклы зло. Независимо от формы.

1 лайк

некоторым нравиться из цикла отлаживать медленно и печально ^W со вкусом

Выше уже писал, что нужная кнопка находится ВНЕ элемента с текстом компании (ИНАРИ), именно поэтому данный вами способ НЕ сработает

Собственно проблема то уже решена, я просто не могу понять почему без этого куска -> offers.get(0).getText());
Код не работает, но есть подозрение что дело в инициализации списка элементов

Сработает, надо просто чуток дополнить:

$(byText(Инари")).find(withText(“Заказать”)).closest("button").click();

Метод closest(String cssSelector) находит ближайшего родителя.

1 лайк

Всё просто. Оба селенидовских метода - и $, и $$ - реализованы через т.н. “ленивую загрузку”. Т.е. они не ломятся сразу загружать элементы, а только при обращении к методам. Изначально идея была в том, что вы должны вызывать только методы $$.should*() или $$.find(), потому что это единственные правильные методы в тестах. Вот эти методы и вызовут загрузку элементов. А всякие там $$.size() и тем более итераторы - это больше для отладки.

1 лайк

Этого не знал, огромное спасибо!

Просто оставлю это здесь - Good test = short test (Andrei Solntsev, Estonia) - YouTube

1 лайк