Скачивание и загрузка файлов
Это не заполнение текстовых полей. Скачивание — диалог браузера и папка на диске. Загрузка на сайт — input type="file" или системный диалог Windows. Оба ломаются, если ждать «как форму» без отдельного ожидания файла.
Скачать без ручного «Сохранить как»
Блок на хабе browser → downloads.
- set_default_download($folder) — куда класть файлы
- Скрыть диалог: disable_download_file_dialog (проверка: is_disable_download_file_dialog)
- Либо явно разрешить диалог: enable_download_file_dialog — для ручной отладки, не для ночи
- Клик по ссылке/кнопке — обычный DOM с wait
$browser->set_default_download("C:\\bots\\in");
$browser->disable_download_file_dialog();
$anchor->wait_element_exist_by_inner_text("Скачать");
$anchor->click_by_inner_text("Скачать");
Сброс папки по умолчанию: reset_default_download — снова будет диалог выбора пути.
Две копии Studio — разные папки download, иначе файлы перезапишут друг друга: порты.
Дождаться окончания загрузки
wait_download_and_get_file_path($wait_time_in_seconds=3000) — путь к файлу или пусто (не было закачки / таймаут). Единица — секунды. Значение по умолчанию огромное; для xlsx-отчёта обычно хватает 30–120.
$path = $browser->wait_download_and_get_file_path(120);
if (!$path) {
echo "файл не пришёл";
}
По id:
Не путайте с print_to_pdf: печать страницы — другой метод, файл появляется сразу по пути, который вы сами передали.
Пока качается большой файл, можно смотреть is_download_complete по id из get_last_download_id. Сорвать зависшую закачку: cancel_download. Не вызывайте wait_download второй раз «на всякий случай» — дождитесь первого или отмените.
Загрузить файл на сайт (HTML file input)
Объект inputfile — это input type="file". Путь к локальному файлу задайте через value по name, в том числе во фрейме: set_value_by_name_by_frame_num($name, $value, $framenum).
$inputfile->set_value_by_name_by_frame_num("file1", "C:\\bots\\in\\act.pdf", -1);
Существование контрола: is_exist_with_attribute / in_frame. Клик по file input сам по себе часто открывает системный диалог — если цель «подставить путь без клика», используйте set value, не click.
Системный диалог Windows
Если после клика открывается окно «Открыть файл» проводника, это не HTML input в DOM. Дальше UI Automation: найти поле имени файла, вставить путь, подтвердить. Не ищите этот диалог методами inputfile.
Что делать с путём
- PDF — read_page / combine
- xlsx — Excel
- Пришло письмом, не с сайта — IMAP
Проверяйте расширение и is_pdf_file, если сайт врёт Content-Type. Пишите путь в лог сразу после wait_download — иначе ночью не понять, какой файл разобрали.
Одинаковое имя report.xlsx каждый день перезапишет вчерашний файл. Кладите в подпапку с датой или переименовывайте сразу после wait.
Сценарий: скачать отчёт и разобрать
$folder = "C:\\bots\\in";
$browser->set_default_download($folder);
$browser->disable_download_file_dialog();
$anchor->wait_element_exist_by_inner_text("Скачать");
$anchor->click_by_inner_text("Скачать");
$path = $browser->wait_download_and_get_file_path(120);
if (!$path) {
$logger->error("download timeout");
} else {
$logger->info("скачали", $path);
}
Дальше по расширению: xlsx — Excel, pdf — pdffile. Если сайт открывает системный «Сохранить как», диалог не отключён — вернитесь к disable_download_file_dialog и своей папке.
Загрузка на сайт в том же прогоне: не кликайте file input, если цель подставить путь — set_value_by_name_by_frame_num. Клик нужен, когда сайт жёстко открывает проводник: тогда UI.
FAQ
Wait вернул пусто. Диалог не отключён и ждёт клика; другая папка; клик не тот; файл качается дольше таймаута; антивирус держит файл. Смотрите get_download_info.
Загрузка «не прикрепляется». Неверный name, элемент в iframe, это не HTML file input, или сайт ждёт change-событие после клика по кнопке — тогда комбинация UI + путь.
Имя файла с кириллицей. Сохраняйте в папку без экзотики в пути диска; если сайт отвергает имя — переименуйте до set value.
wait вернул старый файл. В папке уже лежал вчерашний download с тем же именем, новая закачка не началась. Чистите папку или смотрите get_last_download_id / get_download_info.
print_to_pdf vs Скачать. Кнопка «Скачать PDF» на сайте — это download, не webpage→print_to_pdf. Печать текущей страницы — другой метод и путь, который вы сами передали.