Как проверить, что в поле ввода нельзя вводить текст?
Что проверяют
Умеете ли вы превратить короткое требование в набор проверок и знаете ли, что ограничение в интерфейсе ничего не гарантирует. Следом обычно спрашивают: «А если вставить текст из буфера?» или «Как проверить это на сервере?».
Как отвечать
Сначала уточните, что поле должно принимать: целые числа, дробные с запятой или точкой, минус, пробелы в номере телефона. Без этого непонятно, что считать текстом.
Затем пройдите все способы ввода:
- клавиатура: кириллица и латиница, спецсимволы, пробел, эмодзи;
- вставка:
Ctrl+V, контекстное меню, перетаскивание текста мышью, автозаполнение браузера; - мобильная клавиатура:
inputmode="numeric"только показывает цифровую раскладку и ввод не запрещает; - нестандартные цифры: полноширинные и арабско-индийские. Фронтенд и бэкенд тут легко расходятся:
\dв JavaScript их не принимает, а в Python по умолчанию принимает; - обход интерфейса: значение, выставленное через DevTools, и прямой запрос к API со строкой в поле. Гарантию даёт только серверная валидация, ждём ошибку, а не 500 и не сохранение.
Отдельно разберите type="number". Браузеры по-разному ограничивают набор: символы e, +, - и . пропускаются, потому что допустимы в записи числа, а некоторые браузеры позволяют набрать и буквы. При некорректном вводе свойство value возвращает пустую строку, хотя на экране символы видны, а состояние отражает validity.badInput.
В Selenium send_keys имитирует клавиатуру, вставку из буфера придётся проверять отдельно. Сверяйте три вещи: значение поля, то, что видно на экране, и то, что уходит в запросе при отправке формы.
Где спотыкаются
Проверяют value == '' на поле type="number". Тест зелёный, а пользователь видит в поле буквы, потому что браузер скрывает невалидное значение от скрипта.
Ограничиваются набором с клавиатуры и пропускают вставку, через которую защита на keydown обходится чаще всего.
Считают, что раз фронтенд не пускает текст, проверка закончена. Без проверки API баг останется на бэкенде и проявится при интеграции или запросе мимо интерфейса.