Загрузка файла используя phantomJS в связке с codeception.

В тестируемом интернет магазине есть загружаемые продукты. Мне нужно как нибудь проверить что при клике на ссылку начинается загрузка файла. Можно конечно пойти методом исключений и проверить негативный сценарий, т.е. проверить что после клика нет страницы 404 и т.д. Но хотелось бы проверить позитивный сценарий. Есть у кого нибудь предложения или может кто-то уже с этим сталкивался?

1 лайк

можете сниффером трафик мониторить, но это извращение) тут нужно определиться с “как-нибудь проверить” и “начинается загрузка файла”) загрузка с сервера или на сервер? если с сервера, то как вариант, проверять наличие файла в папке куда сохраняется и дополнительно размер файла, чтоб наверняка. Если файла не будет, то однозначно трабла. Если размер файла не совпадает с ожидаемым - тоже трабла. В другом случае всё скачалось… А чтоб совсем наверняка, можно еще и хэш посчитать и сравнить…

1 лайк

Тогда появляется новый вопрос: куда сохраняет скаченные файлы phantomjs, и скачивает ли он их вообще, т.к. по поиску я этот файл найти не могу.

Проверить текущую директорию можно методом workingDirectory
Поменять - changeWorkingDirectory

Тут подробнее: changeWorkingDirectory | PhantomJS

Я так понял, что workingDirectory показывает директорию откуда запущен phantomjs. Но там тоже скачанного файла нет.
Возможно, после клика на ссылку надо ещё подтвердить скачивание на попапе (как и на обычных браузерах) ?
Пробовал

$I->executeJS(“window.confirm = function(msg){return true;};”);
$I->executeJS(“window.alert = function(msg){return true;};”);

но безрезультатно, файла всё равно нигде нет((

Может не скачивается?
Вообще у фантома раньше были траблы с этим - https://github.com/ariya/phantomjs/issues/10052
Как сейчас не знаю, давно им не пользовался.

да, таки просто кликом не скачивает… вот тут какой-то костыль придумали GitHub - ankitgr8/phantomjs2.0 , но полагаю - это не то, что нужно автору… так что в фантоме не получится скачать файл как в хроме или мозиле…

Пробую покопать в другую сторону: отправлять HEAD запрос и смотреть что приходит в ответ.
Если отправить запрос вручную через панель разработчиков в FF, то в ответе приходит имя загружаемого файла.
Теперь пытаюсь сделать это в авто-тесте:

$I->executeJS(“window.RESPONSE = $.ajax({type : ‘HEAD’, url : ‘http://***********’})”);

Но на этой строке тест падает.

Изменил код запроса:

$I->executeJS(“new Ajax.Request(‘https://************’, {
method:‘head’,
onSuccess: function(transport) {
window.IS_FILE_AVAILABLE = transport.status == 200 && transport.getResponseHeader(‘Content-Disposition’);
window.FILE = transport.getResponseHeader(‘Content-Disposition’);
}
});”);

Теперь если файл существует, то в переменной window.FILE содержится название файла.