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

AJAX отправка файла с кастомизированным input

codeception
downloadfile
ajax
php
javascript
Теги: #<Tag:0x00007fedbb9397d8> #<Tag:0x00007fedbb9395d0> #<Tag:0x00007fedbb939418> #<Tag:0x00007fedbb9390f8> #<Tag:0x00007fedbb938e00>

(Virdignus) #1

Добре время. Имею следующую разметку

<label class="btn-file btn-first" for="my-file-selector">
                        <input id="my-file-selector" name="file" type="file">
                        Load photo
                    </label>

выглядит это так

Тег input скрыт. Окно выбора файла вызывается при нажатии на label.
При выборе файла, происходит загрузка на сервер при помощи AJAX.
Необходимо написать функциональные и приёмочные тесты для этого функционала.
При написании функциональных тестов, столкнулся с тем, что AJAX отправляется, но возвращается пустой ответ. И не важно, что я отправляю, запрос выполняется нормально. Код функционального теста:

 $I->wantTo('check load avatar from file');
        $I->loginUser(User::$user['loginUser']);
        $I->goToCurrentRoute(General::$URL);
        $I->attachFile('file','avatar.jpg');
        $I->sendAjaxPostRequest(route(Routes::$post['photoLoad']), ['_token' => csrf_token()]);
        $I->seeResponseCodeIs(200);
        $I->seeResponseContainsJson(['success' => true]);

Собственно вопрос, возможно ли покрытие тестами такого функционала и как?
Далее, я решил провести приёмочные тесты. И тут я натнулся на зависание теста на шаге добавления файла

$I->wantTo('set my avatar');
        $I->amOnPage('/');
        $I->amOnPage(Login::$URL);
        $I->see('Anmelden');
        $I->fillField('email', 'robot@evil.corp');
        $I->fillField('password', '01478520');
        $I->click('button[type=submit]');
        $I->waitForElementVisible('.progress-load');
        $I->wait(5);
        $I->waitForElementNotVisible('.progress-load');
        $I->see('Profile');
        $I->see('Load photo');
        $I->makeScreenshot('profile');
        $I->executeJS("$('.btn-first').click()");
        $I->attachFile('#my-file-selector','avatar.jpg');
        $I->makeScreenshot('attached');
        $I->waitForElementVisible('.progress-load');
        $I->wait(5);
        $I->waitForElementNotVisible('.progress-load');

Так и не понял почему оно зависает на этом шаге.
Как вообще тестируются такие вещи? Укажите в какую сторону рыть?
спсибо
использую следующее ПО

Codeception PHP Testing Framework v2.2.4
Acceptance Tests
Modules: REST, Laravel5, WebDriver, \Helper\Acceptance, Db
Functional Tests 
Modules: \Helper\Functional, Asserts, REST, Laravel5


(Vitalii Grygoruk) #2

Не специалист в Codeseption, но выглядит что проблема в следующем:

  • Вам не нужно делать $I->executeJS("$('.btn-first').click()"); (так как окно выбора файла вызывать не надо - селениум не умеет с ним работать - от этого и зависания)

(Virdignus) #3

я нашёл как решить этот вопрос, Планирую завтра или послезавтра описать решение. ибо оно не совсем тривиально.


(Mary) #4

Опишите пожалуйста.
В ождании ответа
Спасибо


(Elarichev) #6

Сам уперся в такую же проблему. Решения не будет?))