Тестирование SVG (Scalable Vector Graphics) в веб-приложениях имеет
свои особенности, так как элементы SVG отличаются от стандартных
HTML-элементов. В отличие от обычных тегов <div> или
<button>, SVG-элементы находятся в отдельном
пространстве имён, что влияет на способы их поиска и взаимодействия с
ними через Cypress.
Для выбора SVG-элементов можно использовать стандартные селекторы
CSS, но важно помнить, что некоторые методы, такие как
.contains(), могут работать иначе, так как текст внутри SVG
находится в элементах <text>.
Примеры поиска элементов:
// Поиск по тегу
cy.get('svg circle')
// Поиск по атрибуту
cy.get('svg [data-testid="icon"]')
// Поиск текста внутри SVG
cy.get('svg text').contains('Label')
При использовании сложных SVG-графиков (например, диаграмм D3.js)
часто применяются атрибуты id, class или
data-*, чтобы сделать селекторы устойчивыми к изменениям
структуры DOM.
SVG-элементы имеют свои атрибуты, такие как cx,
cy, r, fill, stroke.
Cypress позволяет проверять их с помощью
.should('have.attr', ...):
cy.get('svg circle#dot')
.should('have.attr', 'cx', '50')
.and('have.attr', 'cy', '50')
.and('have.attr', 'r', '10')
.and('have.attr', 'fill', 'red')
Для сложных проверок, например динамического цвета или позиции, можно
использовать функцию .then() для извлечения атрибута и
проверки через Jav * aScript:
cy.get('svg circle#dot').then($el => {
const fill = $el.attr('fill')
expect(fill).to.match(/red|blue/)
})
Клик, наведение и другие действия в SVG работают через
.click(), .trigger(), но важно учитывать
координаты. Если элемент маленький или прозрачный, клик может не
сработать.
Примеры клика по центру элемента:
cy.get('svg circle#dot')
.click({ force: true }) // игнорирует перекрытия и размеры
Клик по конкретным координатам внутри SVG:
cy.get('svg')
.click(100, 50) // x = 100, y = 50
Использование {force: true} часто необходимо для скрытых
или частично перекрытых элементов.
Для графиков, построенных с помощью библиотек D3.js или Chart.js, ключевые моменты тестирования:
cy.get('svg path').should('have.length', 5) // проверка числа линий
Многие библиотеки хранят данные в data-* атрибутах:
cy.get('svg rect[data-value="20"]').should('exist')
cy.get('svg path#line')
.should('have.attr', 'stroke', '#00f')
Для проверки анимаций можно использовать
.invoke('attr', 'd') или cy.wait() с
последующей проверкой координат:
cy.get('svg path#line')
.invoke('attr', 'd')
.then(d => {
expect(d).to.include('M0,0')
})
SVG часто использует <g> для объединения
нескольких объектов. Cypress позволяет работать с ними как с
контейнерами:
cy.get('svg g#group1 circle')
.should('have.length', 3)
.each($el => {
cy.wrap($el).should('have.attr', 'fill', 'blue')
})
Метод .each() удобен для итерации по элементам и
проверки их индивидуальных свойств.
data-* для
элементов, чтобы тесты не ломались при изменении структуры DOM.<text>.fill,
stroke), но и геометрические (cx,
cy, r, x, y).cy.wait() с
последующей проверкой атрибутов, чтобы дождаться рендеринга.{force: true} или точные координаты.cy.get('svg g#barChart rect')
.should('have.length', 5)
.each(($bar, index) => {
cy.wrap($bar)
.should('have.attr', 'height')
.then(height => {
expect(parseInt(height)).to.be.greaterThan(0)
})
})
cy.get('svg g#barChart rect')
.first()
.click({ force: true })
cy.get('svg text#tooltip')
.should('contain.text', 'Value: 50')
Этот пример демонстрирует проверку количества элементов, их атрибутов, взаимодействие с графиком и проверку динамического текста подсказки.
SVG-тестирование в Cypress требует внимания к деталям: атрибуты, координаты и особенности пространства имён SVG. Правильное использование селекторов, проверка атрибутов и взаимодействие через координаты обеспечивают стабильные и надёжные тесты.