Не успевают подгружаться элементы из выплывающего списка из-за чего проверка на пустоту дает истину

Как мне пождать, когда элементы всплывающего окна полностью погрузятся ? У меня есть поле, куда можно ввести название населенного пункта. Причем при вводе, появляется вспомогающий список, в котором обязательно нужно выбрать нужный пункт. Если данные не корректны(поле пустое, написаны невалидные данные), то список не появляется.

    public PersonalDataWindow setTownOfResident(String town) {
        $(CITY_OF_RESIDENCE_FIELD)
                .shouldBe(Condition.visible.because("The city of residence field is not displayed"))
                .setValue(town);
        ElementsCollection listPossibleTowns = $$(LIST_OF_TOWN);
        //wait
        if (!listPossibleTowns.isEmpty()) {
            for (SelenideElement el: listPossibleTowns) {
                if (el.getText().contains(town)) {
                    el.shouldBe(Conditions.clickable).click();
                    break;
                }
            }
        }
        return this;
    }

Соответственно, понятно, что нужно как-то подождать, когда мой список появится. Если я добавлю на месте wait что-то вроде Thread.sleep(500), то все отлично отработает, но выглядит это как то странно. Как мне используя Selenide решить проблему ?

Избегайте условий и циклов в тестах.
В данном случае вам нужно найти элемент по тексту - ну так и используйте сразу поиск по тексту. Примерно так:

$(parent).findBy(text(city)).click();

Кстати, ваш метод плох ещё и тем, что он не падает, если нужный город вообще не найден.

1 лайк

Хорошо, понял Вас, но в selenide, вроде, нет такого метода

В смысле нет? Конечно, есть. :slight_smile:

  1. Если это стандартный элемент <select>, внутри которого список <option>, то это вообще легко: $("select#id123").selectOption("option text 456");
  2. Если это какой-то другой элемент, можно использовать метод Selectors.byText.
1 лайк

да, действительно, простите за мою невнимательность

1 лайк

Подскажите со своей профессиональной точки зрения, если Вас не затруднит, должен ли метод кидать ошибку. По сути я могу в поле записать все, что угодно, но система найдет варианты только при валидном значении. Мой тест выстроен таким образом, что я пытаюсь записать, например, пустое поле или не валидные значения, и данные сохранить. На это система должна ответить предупреждением/ошибкой. В таком случае, если я позволяю записать не валидные значение и пытаюсь сохранить, то мой метод кинет ошибку, так как нужный элемент из списка не найдет. Это верный подход или стоит предпринять шаги, чтобы метод не кидал исключение (например обернуть в try catch)?

т.е. стоит кидать ошибку и ловить ее например в тесте или спрятать ошибку в этом методе, а в тесте ссылаться на предупреждение/ошибку системы ?

Тут нет единого правильного ответа. Как для вашей задачи требуется, так и делайте.

Кажется, в вашем случае метод не должен кидать ошибку - try/catch в тестах плохое решение.

Можно вообще сделать два метода: один кидает ошибку, второй не кидает.

1 лайк