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

java
selenide
Теги: #<Tag:0x00007fedc412ea08> #<Tag:0x00007fedc412e788>

(Denis Krutikov) #1

Чтобы подтвердить ввод значения нажатием 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


(Fiodar Motin) #2

Попробуйте разделить и добавить еще проверок для локатора перед кликом 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));
    }

(Denis Krutikov) #4

Выяснил, что данный тест валится, только если выполняется первым.
Т.е. первый раз .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)); //тест прошёл
    }

(Fiodar Motin) #5

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


(Denis Krutikov) #6

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


(Fiodar Motin) #7

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


(Denis Krutikov) #8

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


(Fiodar Motin) #9

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


(Denis Krutikov) #10

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


(Denis Krutikov) #11

Не хочет. Такое ощущение, что без ошибки никак - обязательно должна быть ошибка в первом тесте в методе 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));
    }

(Denis Krutikov) #12

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