- Регулярные выражения для валидации распространенных видов данных
- 2015 Update
- Using Moment
- Other libraries
- 2018 Update
- Подробнее
- Итог
- Тестовые примеры календаря — пример поля даты
- Отрицательные тестовые примеры для календаря поля даты
- Требования к тестовым примерам приложения Write Calendar
- Тестовые примеры высокого уровня для приложения календаря
- Часто задаваемые вопросы по тестовым примерам для календаря
- Постановка задачи
- Разработка решения
- Выводы
Регулярные выражения для валидации распространенных видов данных
Время на прочтение
Для проверки текстовых полей на валидность обычно используют регулярные выражения. Существует несколько наиболе распространенных видов таких даных, как например номер кредитки, дата в определенном формате и т. д. На сайте html5pattern.com собирается коллекция регулярных выражений для таких данных (там это позиционируется, как возможное содержимое html5-атрибута pattern у inpit-элементов, но эти регулярные выражения можно использовать и для привычной валидации с помощью javascript). Актуальные для российской аудитории примеры, вместе с соответствующими регулярными выражениями вы можете посмотреть под катом.
Неуказанные, но важные на ваш взгляд типы данных, можете выкладывать в комментариях (вместе с регулярными выражениями). Можете так же поделиться ими с html5pattern.com, заполнив форму на главной странице.
asked Feb 12, 2011 at 15:32
The checkdate function is the first result in google from the search «php validate date»
In your case, the usage would be:
checkdate($month, $day, $year);
answered Feb 12, 2011 at 15:36
7 gold badges58 silver badges90 bronze badges
function was copied from this answer or php.net
answered Nov 9, 2014 at 21:42
5 silver badges12 bronze badges
bool checkdate ( int $month , int $day , int $year )
answered Feb 12, 2011 at 15:35
Here’s what I’ve come up with to combine the strictness of checkdate() with the convenience of DateTime (It converts entries like ‘next thursday’ or ‘2 weeks ago’)
If the input string is invalid, it returns false. Empty dates are returned as null, and non-empty dates are formatted MySQL style ‘Y-m-d’.
answered Nov 14, 2012 at 4:37
10 silver badges15 bronze badges
2015 Update
It is an old question but other new questions like:
get closed as duplicates of this one, so I think it’s important to add some fresh info here. I’m writing it because I got scared thinking that people actually copy and paste some of the code posted here and use it in production.
Most of the answers here either use some complex regular expressions that match only some very specific formats and actually do it incorrectly (like matching January 32nd while not matching actual ISO date as advertised — see demo) or they try to pass anything to the Date constructor and wish for the best.
Using Moment
As I explained in this answer there is currently a library available for that:
Moment.js
It is a library to parse, validate, manipulate, and display dates in JavaScript, that has a much richer API than the standard JavaScript date handling functions.
It is 12kB minified/gzipped and works in Node.js and other places:
bower install moment —save # bower
npm install moment —save # npm
Install-Package Moment.js # NuGet
spm install moment —save # spm
meteor add momentjs:moment # meteor
Using Moment you can be very specific about checking valid dates. Sometimes it is very important to add some clues about the format that you expect. For example, a date such as 06/22/2015 looks like a valid date, unless you use a format DD/MM/YYYY in which case this date should be rejected as invalid. There are few ways how you can tell Moment what format you expect, for example:
moment(«06/22/2015», «MM/DD/YYYY», true).isValid(); // true
moment(«06/22/2015», «DD/MM/YYYY», true).isValid(); // false
The true argument is there so the Moment won’t try to parse the input if it doesn’t exactly conform to one of the formats provided (it should be a default behavior in my opinion).
You can use an internally provided format:
moment(«2015-06-22T13:17:21+0000», moment. ISO_8601, true).isValid(); // true
And you can use multiple formats as an array:
Other libraries
If you don’t want to use Moment.js, there are also other libraries:
2018 Update
Today I recommend using Luxon for date/time manipulation instead of Moment, which (unlike Moment) makes all object immutable so there are no nasty surprises related to implicit mutation of dates.
Подробнее
Серия статей Роба Гравелла о библиотеках синтаксического анализа дат в JavaScript:
Итог
Конечно, каждый может попытаться изобрести велосипед, написать регулярное выражение (но, пожалуйста, прочтите ISO 8601 и RFC 3339, прежде чем делать это) или вызвать встроенные конструкторы со случайными данными для анализа сообщений об ошибках, таких как «Неверная дата». (Вы уверены, что это сообщение одинаково на всех платформах? Во всех регионах? В будущем?) или вы можете использовать проверенное решение и потратить свое время на его улучшение, а не изобретать его заново. Все перечисленные здесь библиотеки являются бесплатным программным обеспечением с открытым исходным кодом.
Найдите в приведенном ниже коде, который позволяет выполнить проверку даты для любого из предоставленных форматов для проверки дат начала/от и окончания/до. Могут быть и лучшие подходы, но мы придумали этот. Обратите внимание, что предоставленный формат даты и строка даты идут рука об руку.
Что мы узнаем из этого поста
Календарь тестовых примеров: Добро пожаловать в еще одну новую публикацию из серии тестовых примеров. Этот пост научит нас писать тестовые примеры для календарей. Когда вы нажмете на поле даты, здесь откроется всплывающее окно календаря, и вы сможете выбрать дату.
Прежде чем я начну писать, как написать тестовый пример для поля даты, позвольте мне задать несколько простых вопросов. Есть ли у вас какие-либо предварительные знания о том, как писать тестовые примеры? Если да, то вы можете продолжить публикацию, но если у вас нет опыта написания тестовых примеров, мы можем порекомендовать вам пройти нашу предыдущую публикацию.
Теперь давайте начнем с того, как мы можем написать осмысленные и простые тестовые примеры для поля даты. Если вы хотите знать, как ведет себя поле даты, мы добавили пример календаря с датами. Вы можете просмотреть это поле календаря и попытаться понять его функциональность.

Тестовые примеры календаря — пример поля даты
Вы можете использовать приведенный ниже код, чтобы увидеть пример. Вам необходимо скопировать весь код и сохранить файл Calendar.html.
Тестовые примеры для поля редактируемой даты
Отрицательные тестовые примеры для календаря поля даты

Тестовые случаи, если поле «Дата» не является текстовым полем

Тестовые случаи, если поле «Дата» представляет собой редактируемое текстовое поле
Требования к тестовым примерам приложения Write Calendar

Приложение «Календарь» MIUI 10 (примеры тестирования для календаря)
Вот некоторые тестовые примеры для приложений календаря или тестовые примеры календаря:
Тестовые примеры высокого уровня для приложения календаря
Я могу придумать несколько тестовых примеров для приложений-календарей. Опять же, вы можете углубиться в тесты для конкретных функций. Например, синхронизация и добавление событий и т. д. Вы можете углубиться в зависимости от того, как вы хотите их протестировать. Большинство автоматизированных тестов облегчают выполнение нескольких тестов.
Прочитав этот пост, я подумал, что вы научились писать тестовые примеры в поле данных. Если вы все еще находите больше тестовых примеров в поле даты, вы можете сообщить мне, что я был в разделе комментариев, написав или добавив комментарий ниже.
Часто задаваемые вопросы по тестовым примерам для календаря
Тестовые примеры должны быть написаны четко и лаконично, чтобы их было легко читать и понимать. Кроме того, важно включить подробную информацию о том, как тестировался каждый сценарий, чтобы будущие разработчики могли точно воспроизвести результаты. Наконец, документируйте любые изменения или обновления, внесенные в ваш календарь в результате выполнения тестового примера, чтобы все, кто участвует в его разработке, могли беспрепятственно отслеживать прогресс.
Привет Хабр! Меня зовут Вячеслав Разводов, я ведущий разработчик группы «Иннотех».
В ИТ-сообществе давно утихли споры о важности внедрения программного обеспечения. Каждый участник процесса разработки понимает, что ваша программа или сайт может нанести серьезный ущерб бизнесу, репутации компании или даже обществу. Возрастают требования к качеству выпускаемой продукции для IT-компаний, но прогресс не замедляется. Требования бизнеса к скорости разработки ИТ-продуктов растут экспоненциально.
Ответ IT-сообщества, появилось распространение инструментов для тестирования PHPUnit, Selenium, Pytest, Unittest, AssertJ. Инструменты позволяют сконцентрироваться на тестировании на том, что можно и со значительными затратами на разработку теста. Развивалась область тестирования, тестовые клавиши можно описывать в виде небольших скриптов, с помощью тестовых фреймворков. Такие тесты разработчики могут запускать в любой момент своей работы, чтобы гарантировать качество продукта. Для автоматизации тестирования веб-приложений применяются Selenium и его производные.
Selenium — это проект с открытым исходным кодом. Проект является “зонтичным” — то есть собирательным, потому что в его состав входят множество независимых компонентов Selenium WebDriver, Selenium Grid, Selenium Server, Selenium IDE и т.д. Но в сообществе когда говорят “Selenium”, часто подразумевают Selenium WebDriver.
Автотесты применяются на различных уровнях ПО. Автотестами можно проверить работу функции, модуля программы или набора модулей. Для систематизации понятий тестов, Майк Кон придумал абстракцию, которая группирует тесты по уровню детализации и назначению. Назвал ее пирамидой тестирования и описал в книге «Scrum: гибкая разработка ПО». С Selenium WebDriver специалист может разрабатывать end-to-end тесты — которые находятся на вершине пирамиды тестирования. End-to-end тесты — проверяют полную работу системы и имитируют действия пользователя. Но как сделать такой автотест для веб-приложения?
Нам понадобится скрипт на языке программирования, в котором будет описана логика и выполняются проверки результатов работы системы. Например, авторизоваться в системе, добавить товар в корзину, проверить размер картинки и заранее известным расширением экрана. Выполнять все манипуляции с нашим веб-приложением мы будем в браузере, а желательно иметь возможность выполнять скрипт в разных браузерах: для проверки на кросс-браузерность. Так вот, чтобы выполнить наш скрипт в браузере, нам понадобится универсальный интерфейс — Selenium WebDriver. WebDriver позволяет написать 1 раз тест, а использовать его практически на любом браузере. WebDriver поддерживает несколько языков программирования, но самыми популярными являются Java и Python. Разберем реализацию такого скрипта, на примере работы с календарем на web-странице. Писать будем на языке программирования Python.
Постановка задачи
Задача: у нас есть несколько страниц c фильтром данных по дате с помощью поля с календарем (далее datepicker). Необходимо создать инструмент, который позволит задавать дату и локаторы элементов (идентификаторы, например см. css-селекторы) управления календарем. Инструмент был уже реализовал алгоритмом выбора даты в календаре. Алгоритм выбора даты включает шаги описанные на схеме 1.

Схема 1. Алгоритм решения задачи автоматизации работы с календарем
При разработке решения задачи, нужно учитывать что строка Месяц+Год, может быть единой строкой с разделителем (рис. 2) или находиться в разных тэгах (см. рис 3).

Рис. 2 Месяц и год разделены запятой.

Рис. 3. Месяц и год находится в разных тегах.
Разработка решения
Назовем разрабатываемое программное решение — движок календаря (calendar_engine). Для иллюстрации движка календаря работы, напишем тесты с использованием Selenium WebDriver и фреймворка pytest. Фреймворк pytest — это библиотека на python, упрощает структурирование и разработку тестов.
Приложение для которого будем тестировать, реализовано на микрофреймворке Flask. Фреймворк Flask — это легковесный микрофреймворк для разработки веб-приложений на языке Python. Предоставляет минимальный набор инструментов и функций, не навязывая жестких правил и структур, что позволяет разработчикам иметь большую свободу в выборе архитектуры и компонентов своего приложения. В этой статье не будет рассматриваться разработка приложения на Flask.
Приложение состоит из одной страницы с двумя вариантами datepicker. Первый вариант — это datepicker в котором месяц и год одном теге и разделены пробелом. Второй — datepicker в котором месяц и год в отдельных тегах.
Разрабатывать решения, начнем с определения входных параметров. Бизнес-логику, инкапсулирем в рамках класса, следовательно входные параметры заполняются при иницилизации класса. В качестве входных параметров понадобится:
Что такое локатор элемента для Selenium? Локатор элемента для Selenium — это специальное выражение, которое используется в автоматизации тестирования веб-приложений с помощью инструмента Selenium. Локатор элемента позволяет идентифицировать и взаимодействовать с конкретными элементами веб-страницы, такими как кнопки, текстовые поля, выпадающие списки и другие. Selenium поддерживает различные типы локаторов элементов, которые можно использовать для их поиска. В данном проекте используется CSS-selectors.
Вот пример локатора для поля ввода даты который будет использоваться тестах для проекта.
# Пример кода определения локаторов (locators.py)
# импортируем констранты которые описывают поодерживаемы типа локаторов (селеторов)
from selenium.webdriver.common.by import By
# определяем локатор поля ввода даты
input_value = (By. CSS_SELECTOR, «div#datepicker1 input»)
Если вы знакомы с таким js-фреймворком JQuery, запись локатора вам будет понятна. В противном случае, рекомендую почитать отдельные материалы на эту тему. Тема локатор достаточно объемна, чтобы рассматривать ее в рамках это статьи.
Методы необходимы из-за разницы скорости работы браузера и скрипта. Скрипт выполняется быстрей, чем браузер отрабатывает отображение страницы или взаимодействие c элементами управления. Как следствие, в скрипте нужны паузы в процессе выполнения. Например ожидание, что элемент кликабелен — это значит что он не перекрыт другими элементами, не отключен и пользователь может на него нажать. Размер — это паузы, он зависит разных факторов начиная со скорости интернет-соединения до характеристик компьютера клиента.
Исходя из описанных условий Selenium, предоставляет инструмент “неявное ожидание”. Неявное ожидание — это когда в скрипте задается условие проверки (например, что элемент кликабелен) и максимальное время ожидание (например, 10 секунд). В течении указанного таймаута, Selenium переодически будет выполнять заданную проверку. Если условие выполнится раньше заданного таймату — то успех, в противном случае ошибка.
Разберем пример реализации получения элемента в течении таймаута. WebDriverWait — это класс в библиотеке Selenium, который предоставляет возможность ожидания определенных условий перед выполнением действий веб-драйвером. С помощью WebDriverWait реализуем неявное ожидание появления элемента на странице. Для этого используем условие реализации условия проверки EC.presence_of_element_located. Если условие выполнится до истечения заданого таймауна (см. timeout), то функция вернет нам найденый элемент.
Локатор элемента — метод get_element_timeout на вход получает отдельными переменными. Переменная how (Как? ) — то есть подразумевается типа локатора, в этом случае CSS_SELECTOR. Переменная what — непосредственно значение локатора (селектора) по которому ищем элемент.
Реализация функций, это проверка, что элемент кликабелен, получение элементов в течении таймаута — отличается от приведенной выше реализации — только сменой условия проверки готовности элемента. Код реализации можно посмотреть к репозиторий проекта на github.com.
Используя разработанные функции получения элементов, мы можем реализовать манипуляцию с кнопками навигации (вперед, назад) в календаре.
Следующим этапом будет получение написание метода, которая получают значения месяца и года, конвертация наименования месяца в число с помощь month_name. В month_name описано отношение между названием месяц на определенном языке, и его порядковым номером в году. По умолчанию задан только русский язык. При необходимости можно добавлять поддержку других языков.
Используя полученные значения месяца и года при вызове функции get_current_position, можно определять, что нашли нужный месяц и год, или же нужно листать календарь в какую-нибудь сторону. Описанная логика реализована в методе find_cursor.
Метод find_cursor возвращает положительный ответ, если порядковый номер месяца и год в текущем открытой странице календаря совпадает, значения переданные во входным параметрам метода. В методе реализовано условие разного поведения при условии, что задана _month_and_year_locators. Такое условие необходимо, когда у месяц и год находятся в одном тэге, разделенные к примеру пробелом.
После “подготовительных” работ по реализации вспомогательных методов, перейдем к реализации основного метода select_date. В методе реализуем бизнес-логику описанную в схеме 1. Кликом по datepicker вызываем календарь, и ожидаем его появления по таймайту, если не появился — сразу метод вызывает ошибку “Не удалось обнаружить календарь. Проверьте локаторы или увеличьте таймаут.”
После того, как обнаружили календарь — проверяем текущее положение месяца и года. Если текущее выбранное значение месяца и года, не совпадает — то входим в цикл while, где на каждой итерации получаем текущее значение месяца и года, и принимаем решение на какую кнопку нажимать, вперед или назад.
Когда нашли заданный месяц, и год, начинаем в цикле перебирать элементы содержащие номер дня. При совпадении значения полученного на итерации цикла for c заданным, кликаем по элементу, перерываем выполнение цикла и выходим из метода.
В качестве примера, приведу код вызова класса в рамках одного из тестов проекта. В первой строке, мы вычисляем дату, отнимая от текущей даты 42 дня. После получаем объект класс Calendar, передав на вход необходые локаторы элементов и объект Selenium Webdriver. После вызываем метод select_date и на вход передаем дату в виде строки. В конце теста проверяем, что после наших манипуляций поле ввода (input) указана дата, которую мы задавали.
def test_calendar_prev_month(self):
«»»Тест выбора дня в предыдущем месяце.»»»
prev_month = datetime.datetime.now() — datetime.timedelta(days=42)
obj = Calendar(
input_locators=locators.input_datepicker1,
back_button_locators=locators.back_button_locators,
next_button_locators=locators.next_button_locators,
calendar_locators=locators.calendar,
day_locators=locators.day_locators,
browser=self.driver,
month_and_year_locators=locators.month_and_year_locators,
delimiter=’ ‘,
)
obj.select_date(prev_month.strftime(‘%d.%m.%Y’))
input_value = self.driver.find_element(*locators.input_value)
assert input_value.get_attribute(‘value’) == prev_month.strftime(‘%d.%m.%Y’), «Не выбрана дата.»
Выводы
В данной статье мы рассмотрели, как с помощью Selenium WebDriver на языке Python можно автоматизировать работу с календарем (datepicker) на веб-странице.
После прочтения статьи, может появиться закономерный вопрос: Почему бы сразу не подставлять даты в поле в вода? Зачем нужны манипуляции с календарем datepicker?
Приведеные примеры в проекте — это упрощая вариация использования datapicker. В рабочих задачах вы можете столкнуться со следующими ситуациями:
При написании автоматических тестов с Selenium WebDriver, в указанных ситуациях приведенный пример будет незаменим. Теперь вы можете написать свой собственный тестовый сценарий для любого веб-приложения, используя Selenium WebDriver! Исходный код проекта можно посмотреть здесь.





