Мультидоменное автоматизированное тестирование с помощью Cypress
1 марта 2023 г.Введение
Часто бывает, что автоматизированное тестирование необходимо выполнять в нескольких источниках, например, когда базовый настроенный URL заменяется другим во время выполнения теста.
Хорошими примерами являются формы входа/регистрации через социальные сети, которые вызывают открытие всплывающего окна с доменом, отличным от базового URL-адреса, или сторонние платежные сервисы, которые предоставить владельцу веб-сайта механизм покупки подписки.
Давайте проведем простой тест, открыв сначала базовый URL, а затем новый:
describe('template spec', () => {
it('navigates', () => {
const url = Cypress.config('baseUrl');
cy.visit(url);
cy.visit('www.instagram.com');
//This will get a cross-origin error
cy.contains('Allow essential and optional cookies').click();
});
});
cypress.config.js с предопределенным baseUrl:
const { defineConfig } = require('cypress');
module.exports = defineConfig({
e2e: {
baseUrl: 'https://www.blender.org/',
specPattern: 'cypress/e2e/**',
},
});
В следующем случае, если тест попытается получить доступ к новому домену, Cypress выдаст ошибку перекрестного происхождения:
Обзор функции cy.origin()
Начиная с Cypress v12.0.0, Cypress официально предоставляет своим пользователям возможность запуска нескольких доменов. в одном тесте с cy.origin() и управлять всплывающими окнами.
Синтаксис
cy.origin(url, callbackFn)
cy.origin(url, options, callbackFn)
Аргументы
URL:
Это может быть любая строка действительной ссылки или предварительно определенная глобальная переменная (например, из cypress.config.js)
Он переопределяет baseUrl
, настроенный в глобальной конфигурации внутри обратного вызова. Таким образом, cy.visit()
и cy.request()
будут использовать этот URL в качестве префикса, а не настроенный baseUrl
.
варианты:
Это необязательный аргумент, который можно передать функции cy.origin()
как простой объект Javascript и десериализовать в новом источнике. Это могут быть: имя пользователя, пароль для входа в систему, платежные реквизиты и так далее.
обратный вызовFn:
Это обычная функция, которая будет выполняться в новом источнике. Все элементы, расположенные на исходной странице, не будут доступны для Cypress в рамках этого обратного вызова.
Использование cy.origin() в спецификациях тестов
Для параметраbaseUrl
задано значение ‘https://www.blender.org/’
, что означает, что изначально все тесты будут проходить по этой конкретной ссылке.
Чтобы избежать повторения вызова cy.visit(baseUrl)
, давайте переместим этот код в хук beforeEach
:
beforeEach(() => {
const url = Cypress.config('baseUrl');
cy.visit(url) // Or url can be hardcoded if needed
})
Этот код будет выполняться перед каждым тестовым сценарием.
В нижней части главной страницы https://www.blender.org/ есть ссылка на официальную страницу Blender в Instagram. р>
Основываясь на описанном выше введении, давайте воспользуемся cy.origin(), чтобы переключиться с домашней страницы Blender на их учетную запись Instagram и подтвердить сообщение о принятии файлов cookie.
describe('template spec', () => {
it('passes', () => {
cy.window().then((win) => {
cy.stub(win, 'open').as('Open');
});
//Essential only if beforeEach hook is not set
const url = Cypress.config('baseUrl');
cy.visit(url);
//
cy.window().scrollTo('bottom');
var instaUrlString;
cy.get('.social-icons__instagram')
.invoke('attr', 'href')
.then(($instaUrl) => {
instaUrlString = $instaUrl.toString();
const updatedInstaUrl = instaUrlString.replace(
'instagram.com',
'www.instagram.com'
);
cy.origin(
updatedInstaUrl,
{ args: updatedInstaUrl },
(updatedInstaUrl) => {
cy.visit(updatedInstaUrl);
cy.contains('Allow essential and optional cookies').click();
}
);
});
cy.visit(url);
});
});
Молодец! Мы получили ожидаемое поведение: Cypress посещает домашнюю страницу Blender, затем прокручивает страницу вниз, получает свойство href
из ссылки Instagram, а затем преобразует его в соответствующую ссылку, начинающуюся с 'www ', передает его в cy.origin().
Функция обратного вызова показывает, что дальнейшие утверждения применяются к новому источнику.
Более того, открытие нового исходного окна блокируется функцией cy.stub()
, которая позволяет избавиться от ненужных открытых окон.
Использование cy.origin() в файлах тестовых функций
Тот же код применим для тестирования BDD (Behavior-driven development) с той лишь разницей, что код внутри скрипта it()
должен быть определен в рамках определенного шага:
When('I change the origin of my test configuration', () => {
cy.window().then((win) => {
cy.stub(win, 'open').as('Open');
});
//Essential only if beforeEach hook is not set
const url = Cypress.config('baseUrl');
cy.visit(url);
//
cy.window().scrollTo('bottom');
var instaUrlString;
cy.get('.social-icons__instagram')
.invoke('attr', 'href')
.then(($instaUrl) => {
instaUrlString = $instaUrl.toString();
const updatedInstaUrl = instaUrlString.replace(
'instagram.com',
'www.instagram.com'
);
cy.origin(
updatedInstaUrl,
{ args: updatedInstaUrl },
(updatedInstaUrl) => {
cy.visit(updatedInstaUrl);
cy.contains('Allow essential and optional cookies').click();
}
);
});
cy.visit(url);
});
Файл функции:
Feature: Cross-origin test
Scenario: As a user, I can use different origins in one test
When I change the origin of my test configuration
And I visit Base url
В результате в этой статье подход к мультидоменному тестированию с помощью Cypress продемонстрирован в двух разных подходах, что делает скрипты более гибкими и дает возможность комбинировать различные источники в одном тесте и решать такие задачи, как:
- Посещение более одного домена и взаимодействие с его элементами в рамках одного теста;
- Пройти рабочий процесс платежей, который обычно ведет к внешним веб-сервисам
- Проверить разные ссылки с исходного домена (социальные сети, документация, ссылки на ресурсы)
Вот ссылка на проект, иллюстрирующий многодоменное тестирование с помощью Cypress: https://github.com/vamelchenia/multi-domain- кипарис
Ресурсы, использованные для создания этой статьи:
- Cypress 9.6.0: легкое тестирование многодоменных рабочих процессов с помощью cy.origin
- Документация по Cypress: cy.stub() Заглушить окно
- инфраструктура автоматизации BDD
Оригинал