by.linkText()

by.linkText() — это один из локаторов Protractor, предназначенный для поиска элементов <a> на веб-странице по полному тексту ссылки. Этот метод особенно полезен, когда текст ссылки уникален и легко идентифицируем. Он упрощает взаимодействие с гиперссылками, позволяя точно определить элемент без использования сложных CSS-селекторов или XPath.

Синтаксис и базовое применение

element(by.linkText('Текст ссылки'))
  • element — функция Protractor для поиска одного элемента на странице.
  • by.linkText() — локатор, который ищет ссылку по её полному видимому тексту.
  • Аргумент — строка, содержащая текст ссылки, точное совпадение требуется.

Пример клика по ссылке:

element(by.linkText('Перейти к оформлению')).click();

В этом примере Protractor ищет ссылку с текстом Перейти к оформлению и выполняет по ней действие клика.

Отличие от by.partialLinkText()

Метод by.linkText() ищет полное совпадение текста, тогда как by.partialLinkText() позволяет искать по части текста. Это важно, если текст ссылки может меняться динамически или содержит переменные элементы.

Пример использования by.partialLinkText():

element(by.partialLinkText('оформ')).click();

Такой подход более гибкий, но менее строгий: он может совпадать с несколькими ссылками, если текст частично повторяется.

Практические сценарии использования

  1. Навигация по меню Если в навигационном меню есть ссылки с уникальными названиями, by.linkText() позволяет перейти к нужной странице без обращения к сложным селекторам:
element(by.linkText('Контакты')).click();
expect(browser.getCurrentUrl()).toContain('/contacts');
  1. Проверка доступности ссылок Можно проверить, отображается ли ссылка на странице, используя isPresent() или isDisplayed():
let link = element(by.linkText('Вход'));
expect(link.isPresent()).toBe(true);
expect(link.isDisplayed()).toBe(true);
  1. Тестирование переходов Часто требуется убедиться, что клик по ссылке ведёт на правильный URL:
element(by.linkText('Подробнее')).click();
browser.getCurrentUrl().then(url => {
    expect(url).toBe('https://example.com/details');
});

Ограничения и рекомендации

  • Чувствительность к регистру: текст ссылки должен полностью совпадать, включая регистр символов.
  • Локализация: если интерфейс мультиязычный, текст ссылки может меняться, что потребует использования переменных или альтернативных локаторов.
  • Динамически загружаемые элементы: для ссылок, которые появляются после AJAX-загрузки, требуется явное ожидание (ExpectedConditions) перед взаимодействием:
let EC = protractor.ExpectedConditions;
let link = element(by.linkText('Скачать'));
browser.wait(EC.visibilityOf(link), 5000);
link.click();

Комбинирование с другими локаторами

by.linkText() можно использовать в комбинации с element.all() для работы с несколькими ссылками на странице:

let links = element.all(by.linkText('Подробнее'));
expect(links.count()).toBe(3);
links.get(0).click();

Это удобно, если на странице присутствует несколько идентичных ссылок, и требуется выбор конкретной по индексу.

Взаимодействие с динамическими страницами

На динамических страницах, где ссылки могут генерироваться JavaScript, важно учитывать задержку появления элементов. Часто используют цепочку с ExpectedConditions:

let EC = protractor.ExpectedConditions;
let dynamicLink = element(by.linkText('Загрузить отчет'));
browser.wait(EC.elementToBeClickable(dynamicLink), 7000);
dynamicLink.click();

Это гарантирует, что клик произойдет только после того, как ссылка станет интерактивной.

Итоговые рекомендации по применению

  • by.linkText() — оптимальный выбор для уникальных статических ссылок.
  • Для частичного совпадения текста или динамически меняющихся ссылок лучше использовать by.partialLinkText().
  • Всегда учитывать задержки рендеринга и применять ExpectedConditions при работе с динамическим контентом.
  • Проверка видимости и существования ссылки помогает сделать тесты более стабильными и предотвращает ложные срабатывания.

Использование by.linkText() делает тесты более читаемыми и понятными, особенно когда ссылки на странице имеют уникальные и понятные тексты.