Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

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

page-object
java
selenide
webdriver
Теги: #<Tag:0x00007fedc7aa0688> #<Tag:0x00007fedc7aa04f8> #<Tag:0x00007fedc7aa03b8> #<Tag:0x00007fedc7aa0250>

(Демид) #1

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


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

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

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


#2

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


(Dmitry Astanin) #3

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


(Демид) #5

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

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’а непосредственно в лупе - луп игнорируется и консоль пуста.


(Dmitry Astanin) #6

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


(Демид) #7

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


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


(Dmitry Astanin) #8

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


(Демид) #9

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

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

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

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

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

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

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

(Roy Obenon) #10

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


(Демид) #11

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


(asolntsev) #12

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

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


(Alexandr D ) #13

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


(asolntsev) #14

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


(Сергей Кузьмин) #15

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


(Демид) #16

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


(Демид) #17

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


(asolntsev) #18

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

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

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


(asolntsev) #19

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


(Демид) #20

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


(Демид) #21

Просто оставлю это здесь - https://www.youtube.com/watch?v=G1_MXomwnHQ