CORS (Cross-Origin Resource Sharing) — механизм веб-браузеров, который ограничивает доступ веб-приложений к ресурсам, расположенным на другом домене. В контексте автоматизированного тестирования на JavaScript с использованием Protractor важно понимать, как работать с CORS, чтобы корректно проверять функциональность фронтенда при взаимодействии с внешними API или серверами.
Protractor работает поверх Selenium WebDriver и использует браузер для выполнения сценариев тестирования. Для тестирования CORS необходимо учитывать:
Настройки браузера: современные браузеры по умолчанию блокируют кросс-доменные запросы. Для обхода этого ограничения в тестовой среде можно:
--disable-web-security --user-data-dir=/tmp/chrome-profile).Конфигурация Protractor: в
protractor.conf.js указываются опции браузера, которые
позволяют управлять политикой безопасности:
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--disable-web-security', '--user-data-dir=/tmp/chrome-profile']
}
}
В Protractor для проверки взаимодействия с сервером можно
использовать прямые HTTP-запросы через библиотеки, такие как
axios или request. Это особенно полезно для
проверки заголовков CORS, статусов ответа и корректного поведения API
без участия браузера:
const axios = require('axios');
describe('CORS requests', () => {
it('should allow cross-origin GET request', async () => {
const response = await axios.get('https://api.example.com/data', {
headers: { 'Origin': 'http://localhost:4200' }
});
expect(response.status).toBe(200);
expect(response.headers['access-control-allow-origin']).toBe('http://localhost:4200');
});
});
Ключевые моменты:
Origin определяет источник
запроса.Access-Control-Allow-Origin
в ответе сервера должен совпадать с источником, чтобы браузер разрешил
доступ к данным.Иногда требуется проверить поведение фронтенда без реального изменения серверных настроек. В Protractor это можно сделать через:
browser.executeScript для переопределения
XMLHttpRequest или fetch.protractor-http-mock,
который позволяет создавать фиктивные ответы на запросы и задавать
нужные заголовки CORS.Пример мокирования запроса:
browser.executeScript(() => {
const originalFetch = window.fetch;
window.fetch = function(url, options) {
if (url.includes('api.example.com')) {
return Promise.resolve(new Response(JSON.stringify({ data: 'mocked' }), {
status: 200,
headers: { 'Access-Control-Allow-Origin': '*' }
}));
}
return originalFetch(url, options);
};
});
Браузер блокирует доступ к ответу, если политика CORS нарушена. В тестах это проявляется как исключение или пустой ответ при попытке обратиться к данным. Важно уметь проверять такие ситуации:
Пример проверки ошибки:
it('should fail cross-origin request if server blocks it', async () => {
try {
await browser.executeAsyncScript((callback) => {
fetch('https://forbidden.example.com/data')
.then(res => callback(res.status))
.catch(err => callback(err.message));
});
} catch (error) {
expect(error).toContain('Failed to fetch');
}
});
Для систематического тестирования можно применять следующие подходы:
Access-Control-Allow-Origin,
Access-Control-Allow-Methods,
Access-Control-Allow-Headers.Тестирование CORS в Protractor требует сочетания браузерных настроек, мокирования и прямых HTTP-запросов, что позволяет полноценно проверять корректность работы приложения в условиях ограничений безопасности браузера.