В веб-тестировании часто возникает необходимость взаимодействовать с элементами страницы, расположенными за пределами видимой области или доступными через фрагменты URL (anchors). Protractor, как инструмент для E2E-тестирования Angular-приложений, предоставляет мощные средства для работы с такими сценариями.
Якорь (anchor) — это часть URL после символа
#, которая указывает на определённый элемент страницы, чаще
всего через атрибут id. Пример:
https://example.com/page#section2
Здесь section2 — фрагмент URL, указывающий на элемент с
id="section2". При переходе по такому URL браузер
автоматически прокручивает страницу до соответствующего элемента.
Фрагменты URL полезны для тестирования:
Protractor предоставляет объект browser, через который
можно управлять текущим URL. Для извлечения фрагмента используют методы
getCurrentUrl() и стандартные средства JavaScript для
работы со строками:
it('должен проверить фрагмент URL', async () => {
await browser.get('https://example.com/page#section2');
const currentUrl = await browser.getCurrentUrl();
const fragment = currentUrl.split('#')[1];
expect(fragment).toEqual('section2');
});
Ключевой момент: getCurrentUrl()
возвращает полный URL, поэтому для получения фрагмента необходим разбор
строки.
Для прокрутки к элементу, на который указывает якорь, используют
стандартные селекторы Protractor (by.id,
by.css и т.д.) и методы scrollIntoView() через
WebDriver:
const section = element(by.id('section2'));
await browser.executeScript('arguments[0].scrollIntoView(true);', section.getWebElement());
Это позволяет:
Одностраничные приложения часто изменяют фрагменты URL без перезагрузки страницы. Для тестирования таких изменений важно:
Пример проверки динамического изменения фрагмента:
const menuItem = element(by.css('a[href="#section3"]'));
await menuItem.click();
const currentUrl = await browser.getCurrentUrl();
const fragment = currentUrl.split('#')[1];
expect(fragment).toEqual('section3');
const section = element(by.id('section3'));
expect(await section.isDisplayed()).toBe(true);
Внутренние ссылки, ссылающиеся на якоря, можно тестировать через:
click() на элемент ссылки.const anchorLink = element(by.css('a[href="#top"]'));
await anchorLink.click();
const url = await browser.getCurrentUrl();
expect(url).toContain('#top');
const topSection = element(by.id('top'));
expect(await topSection.isDisplayed()).toBe(true);
Некорректные или отсутствующие якоря могут вызвать сбои тестов. Практические меры:
const section = element(by.id('nonexistent'));
expect(await section.isPresent()).toBe(false);
await browser.wait(
ExpectedConditions.presenceOf(element(by.id('section2'))),
5000,
'Элемент section2 не появился на странице'
);
ExpectedConditions) при
прокрутке и проверке элементов.Пример автоматической проверки всех якорных ссылок на странице:
const anchors = element.all(by.css('a[href^="#"]'));
anchors.each(async (anchor) => {
const href = await anchor.getAttribute('href');
const fragment = href.split('#')[1];
await anchor.click();
expect(await browser.getCurrentUrl()).toContain(`#${fragment}`);
const target = element(by.id(fragment));
await browser.wait(ExpectedConditions.visibilityOf(target), 3000);
});
Этот подход гарантирует, что каждая внутренняя ссылка корректно изменяет URL и отображает соответствующий контент.
Работа с якорями и фрагментами URL в Protractor сочетает управление браузером, проверку URL и манипуляции с DOM, что делает тестирование интерактивных страниц точным и надёжным.