pressEnter выполняется раньше, чем появляется текст в поле

Чтобы подтвердить ввод значения нажатием Enter приходится выставлять таймаут, иначе enter не отрабатывает. Сам тест, который падает с ошибкой:

    @Test
    public void testAddTodo() {
        open("http://todomvc.com/examples/troopjs_require/");
        $(".new-todo").setValue("first").pressEnter();
        $(".new-todo").setValue("second").pressEnter();
        $$(".todo-list li").shouldHave(size(2));
        sleep(3000);
    }

selenide v4.10.01

Попробуйте разделить и добавить еще проверок для локатора перед кликом enter

 @Test
    public void testAddTodo() {
        open("http://todomvc.com/examples/troopjs_require/");
        $(".new-todo").setValue("first").shouldBe(visible).shouldBe(exist);
        $(".new-todo").pressEnter();
        $(".new-todo").setValue("second").shouldBe(visible).shouldBe(exist);
        $(".new-todo").pressEnter();
        $$(".todo-list li").shouldHave(size(2));
    }

Выяснил, что данный тест валится, только если выполняется первым.
Т.е. первый раз .pressEnter не выполняется, а во всех последующих тестах будет отрабатывать, как и должен. Подстановка дополнительных условий в виде .shouldBe(visible).shouldBe(exist) даёт абсолютно аналогичный вариант. Результат такой:

    @Test
    public void testAddTodo() {
        open("http://todomvc.com/examples/troopjs_require/");
        $(".new-todo").setValue("first").pressEnter();
        $(".new-todo").setValue("second").pressEnter();
        $$(".todo-list li").shouldHave(size(2)); //тест завершился ошибкой
    }
    @Test
    public void testAddTodoCopy() {
        open("http://todomvc.com/examples/troopjs_require/");
        $(".new-todo").setValue("first").pressEnter();
        $(".new-todo").setValue("second").pressEnter();
        $$(".todo-list li").shouldHave(size(2)); //тест прошёл
    }

Ну тогда вынести тест в отдельный класс и стартовать его последним и все.

Да тут основная функциональность завязана на добавлении записей сперва, а после уже действия над этими записями, так что не подходит такой вариант. Тут всегда первое действие - добавление записи, а из-за этого первый в списке тест всегда будет завершен ошибкой.

Тогда создайте фэйковый класс с одним фейковым тестом который будет первый стартовать

Ну, вот тоже только такая мысль пока пришла. Но может всё-таки есть какое-то решение, чтобы обойтись без специальных фэйлов в начале тестов

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

Ага, понял, в принципе да, можно попробовать и так, если открытия страницы будет достаточно в данном случае. Вечером попробую такой вариант, потом отпишусь сюда.

Не хочет. Такое ощущение, что без ошибки никак - обязательно должна быть ошибка в первом тесте в методе shouldHave(size(2)), какая связь, ну, вообще не ясно. Бред какой-то, серьёзно.

Пока что единственный рабочий вариант остаётся тот, о котором я писал в топике, т.е. если выставлять ожидание, то выполняется, но добавляет дополнительное время к выполнению теста:

    @Test
    public void testAddTodo() {
        $(".new-todo").setValue("first");
        sleep(1500);
        $(".new-todo").pressEnter();
        $(".new-todo").setValue("second").pressEnter();
        $$(".todo-list li").shouldHave(size(2));
    }

Решение проблемы так и не ясно. Самое интересное, что на backbone всё без ошибок, а на troopjs_require ошибка :neutral_face:

1 лайк