Проверьте контракт загрузки, а не путь к файлу.
Используйте небольшой придуманный файл для проверки выбора и принятия, а затем храните доказательства обработки сервером отдельно.

Переведенное издание. Технические идентификаторы остаются в своей первоначальной форме.

Откроется окно выбора файла, тест выберет файл, и пакет объявит о завершении загрузки. Приложение получило только входной выбор. Он по-прежнему может отклонить формат, не пройти проверку или никогда не завершить обработку. Зеленый шаг выбора – это более узкий результат, чем пригодный для использования загруженный документ.
В этом руководстве используется входная документация Playwright для создания крошечного локального текстового файла. Файл содержит придуманный контент. Это не приложение к клиенту, документ, удостоверяющий личность, или образец продукта. Мы отделяем контракт ввода браузера от любой обработки, которую приложение выполняет впоследствии.
Придаем прибору читаемый идентификатор
В тестовом приспособлении должно быть указано его имя, тип MIME и содержимое. В небольшом текстовом примере полезные данные в памяти легче просмотреть, чем необъяснимые двоичные файлы в репозитории. Используйте реалистичные достоверные данные для вашего продукта, но избегайте частных исходных документов, когда на вопрос ответит контролируемый образец.
await page.getByLabel('Demo attachment').setInputFiles({
name: 'demo-note.txt',
mimeType: 'text/plain',
buffer: Buffer.from('Invented demo note\n', 'utf8')
});
await expect(page.getByRole('status')).toHaveText('Selected: demo-note.txt');Фрагмент предполагает доступный входной файл и поведение локального пользовательского интерфейса, сообщающее выбранное имя файла. Утверждение устанавливает такое поведение, а не успешное хранение на сервере. Сохраните это ограничение в названии теста и поясняющем рисунке.
Playwright документирует пути, несколько файлов, объекты полезной нагрузки и очищает выбор через setInputFiles. Выберите наименьшую форму ввода, соответствующую регистру. Для многофайлового теста необходимы требования к порядку, ограничениям и отдельным ошибкам; это не просто та же самая проверка счастливого пути, повторяемая с большим количеством имен.
Используйте событие выбора только тогда, когда это необходимая граница
Некоторые интерфейсы создают ввод динамически после нажатия кнопки. Руководство по вводу описывает ожидание события выбора файла перед действием, а затем вызов setFiles для возвращенного средства выбора. Сначала поставьте ожидание события, чтобы средство быстрого выбора все еще было подключено к инициирующему элементу управления.
const pendingChooser = page.waitForEvent('filechooser');
await page.getByRole('button', { name: 'Choose demo file' }).click();
const chooser = await pendingChooser;
await chooser.setFiles({
name: 'demo-note.txt',
mimeType: 'text/plain',
buffer: Buffer.from('Invented demo note\n', 'utf8')
});Это альтернативные подходы к выбору для разных интерфейсов, а не два обязательных шага за одну загрузку. Не автоматизируйте собственный диалог операционной системы с помощью угадываемых координат экрана, если документированный ввод или граница выбора могут напрямую выражать действие.
Выбор, принятие и обработка - отдельные состояния
После выбора приложение может проверить файл, отправить его на сервер и запустить фоновый процессор. Напишите ожидаемое состояние для каждого соответствующего слоя. Сообщение о принятии, обращенное к пользователю, должно означать то, что в нем говорится. Если обработка еще не завершена, тест не должен считать всю функцию завершенной.
Для фактической загрузки используйте утвержденное промежуточное хранилище и проверьте окончательную контролируемую запись с помощью подтвержденных доказательств продукта. Убедитесь, что доступен правильный документ, а не только то, что счетчик исчез. Не загружайте изобретенные тесты в папку реального клиента только потому, что пользовательский интерфейс упрощает это.
Имя файла и тип MIME являются входными данными, а не независимым подтверждением содержимого файла. Текстовые полезные данные с именем image.png не являются допустимым изображением. Выбирайте заведомо недействительные образцы при тестировании на отбраковку и действительные образцы при тестировании на приемку. Объясните, какой контракт должен выполнять каждый образец.
Сохраняйте недопустимые случаи небольшими и полезными
Продукт может отклонить неподдерживаемый формат, слишком большой входной файл, пустой файл или дубликат. Прежде чем писать эти утверждения, определите ожидаемую политику от команды приложения. Не придумывайте максимальный размер и не предполагайте, что атрибут принятия браузера является всем правилом безопасности.
Проверьте объяснение и безопасное следующее действие для отклоненного файла. Пользователь должен иметь возможность выбрать другой файл или удалить выделение, если это предусмотрено замыслом. Очистка теста также имеет значение: принятая промежуточная загрузка может остаться после закрытия браузера, поэтому организуйте удаление записи по утвержденному маршруту.
Держите светильники и связанные с ними артефакты сбоев под контролем конфиденциальности. Небольшие придуманные исходные данные легче проверять и безопаснее распространять, чем захваченные реальные документы. Снимки экрана и трассировки могут показывать выбранные имена файлов, даже если байты файла не прикреплены.
AnyTest описывает агентов, изучающих веб-приложение и создающих сквозные тесты для проверки человеком. Используйте эти границы для просмотра любого предлагаемого пути к файлу: выбранного, принятого, обработанного и доступного. В этом руководстве не утверждается конкретный интерфейс загрузки AnyTest или интеграция проверки. Преимущество заключается в четком контракте артефактов, который предотвращает превращение успешного действия ввода в ложное обещание о результатах сервера.
Общие вопросы
Подтверждает ли выбор файла завершение загрузки?
Нет. Выбор, приемка и окончательная обработка на сервере являются отдельными доказательствами.
Может ли прибор использовать настоящий документ клиента?
Используйте изобретенные или утвержденные промежуточные образцы. Избегайте личных файлов, если контролируемый контент отвечает на тестовый вопрос.