Query-параметры в URL представляют собой ключ-значение, добавляемые
после знака ? и разделяемые амперсандом &.
В контексте тестирования веб-приложений с помощью Cypress они часто
используются для передачи данных между страницами, фильтрации контента
или управления состоянием приложения. Умение работать с
query-параметрами позволяет создавать более точные и гибкие тесты.
Cypress не предоставляет встроенного метода для прямого извлечения
query-параметров из URL, но это легко реализуется с помощью JavaScript.
Основной подход — использовать объект URL и его свойство
searchParams:
cy.url().then((urlString) => {
const url = new URL(urlString);
const paramValue = url.searchParams.get('key'); // получение значения параметра 'key'
expect(paramValue).to.equal('expectedValue');
});
Метод searchParams.get() возвращает значение указанного
параметра или null, если параметр отсутствует. Для проверки
нескольких параметров можно использовать комбинацию has() и
get():
cy.url().then((urlString) => {
const url = new URL(urlString);
expect(url.searchParams.has('filter')).to.be.true;
expect(url.searchParams.get('filter')).to.equal('active');
});
Для перехода на страницу с query-параметрами используется команда
cy.visit(). Параметры можно передавать напрямую в URL:
cy.visit('/products?category=books&sort=price');
Альтернативно, Cypress позволяет использовать объект qs
для автоматического формирования строки запроса через параметры в
объекте:
cy.visit({
url: '/products',
qs: {
category: 'books',
sort: 'price'
}
});
Этот подход особенно полезен для динамического создания URL с большим количеством параметров.
Проверка query-параметров важна для тестов, которые зависят от состояния страницы, фильтров или сортировки. Стандартный метод — извлечение текущего URL и проверка его параметров:
cy.url().should((urlString) => {
const url = new URL(urlString);
expect(url.searchParams.get('sort')).to.equal('price');
expect(url.searchParams.get('category')).to.equal('books');
});
Для более комплексных проверок удобно создавать вспомогательные функции:
function checkQueryParam(key, value) {
cy.url().then((urlString) => {
const url = new URL(urlString);
expect(url.searchParams.get(key)).to.equal(value);
});
}
checkQueryParam('category', 'books');
checkQueryParam('sort', 'price');
Некоторые приложения используют динамическое обновление состояния
через history.pushState или
history.replaceState. В Cypress можно симулировать
изменение query-параметров с помощью команды
cy.window():
cy.window().then((win) => {
const url = new URL(win.location);
url.searchParams.set('filter', 'active');
win.history.pushState({}, '', url);
});
cy.url().should('include', 'filter=active');
Это позволяет проверять реакцию интерфейса на изменения URL без необходимости полной перезагрузки страницы.
Query-параметры могут содержать массивы, объекты или закодированные
строки. Для работы с ними полезно использовать
decodeURIComponent:
cy.url().then((urlString) => {
const url = new URL(urlString);
const data = JSON.parse(decodeURIComponent(url.searchParams.get('data')));
expect(data).to.have.property('id', 123);
});
Также можно использовать сторонние библиотеки, такие как
qs, для удобной сериализации и десериализации сложных
структур:
import qs from 'qs';
cy.visit(`/products?${qs.stringify({ filter: ['active', 'new'] })}`);
cy.url().then((urlString) => {
const query = qs.parse(urlString.split('?')[1]);
expect(query.filter).to.deep.equal(['active', 'new']);
});
URL и searchParams для
простых случаев и проверки отдельных параметров.qs).has(), чтобы
избежать ошибок при отсутствии ключа.window.history методы (pushState,
replaceState).Эффективная работа с query-параметрами обеспечивает точность тестов и позволяет проверять корректность работы фильтров, сортировок и других элементов интерфейса, зависящих от состояния URL.