Поиск одного элемента

Protractor предоставляет несколько способов поиска и взаимодействия с элементами на веб-странице. При автоматизации тестирования в JavaScript основной задачей является точное определение одного элемента, чтобы избежать ошибок и повысить стабильность тестов.

Локаторы (Locator)

Protractor использует локаторы, которые позволяют идентифицировать элементы по различным атрибутам. Основные методы поиска одного элемента:

  • element(by.css('selector')) Позволяет выбрать элемент по CSS-селектору. Это наиболее гибкий и часто используемый метод.

    let button = element(by.css('.submit-button'));

    Важно: метод возвращает объект ElementFinder, а не массив элементов, даже если селектор совпадает с несколькими объектами.

  • element(by.id('id')) Поиск по уникальному идентификатору элемента. Самый быстрый способ при наличии уникального id.

    let usernameInput = element(by.id('username'));
  • element(by.className('className')) Поиск по классу. Может быть использован, если класс однозначно идентифицирует элемент.

    let alertBox = element(by.className('alert-danger'));
  • element(by.tagName('tag')) Используется для поиска элементов по имени тега. Обычно комбинируется с другими локаторами через CSS.

    let header = element(by.tagName('h1'));
  • element(by.name('name')) Локатор для поиска элементов по атрибуту name. Часто используется для полей форм.

    let emailInput = element(by.name('email'));
  • element(by.xpath('XPath')) Позволяет находить элементы с помощью XPath. Подходит для сложных или динамических структур DOM.

    let submitButton = element(by.xpath("//button[text()='Submit']"));
  • element(by.buttonText('text')) Поиск кнопок по видимому тексту. Очень удобен для кнопок с уникальными подписями.

    let loginButton = element(by.buttonText('Login'));
  • element(by.partialButtonText('text')) Поиск кнопок по частичному совпадению текста.

  • element(by.linkText('text')) и element(by.partialLinkText('text')) Используются для ссылок. Первый вариант — полное совпадение текста, второй — частичное.

Работа с ElementFinder

ElementFinder — это объект, представляющий один элемент на странице. Он поддерживает цепочки методов и асинхронное взаимодействие:

  • click() — клик по элементу
  • sendKeys(value) — ввод текста
  • getText() — получение видимого текста
  • getAttribute(attr) — получение значения атрибута

Пример использования:

let searchInput = element(by.css('input.search-field'));
searchInput.sendKeys('Protractor');
let searchButton = element(by.css('button.search-button'));
searchButton.click();

Особенности поиска одного элемента

  1. Уникальность element() возвращает первый найденный элемент, соответствующий локатору. Если селектор совпадает с несколькими элементами, остальные игнорируются.

  2. Асинхронность Все методы взаимодействия с ElementFinder возвращают Promise, что требует использования await в современном JavaScript.

    let text = await element(by.css('.message')).getText();
  3. Цепочка локаторов Можно создавать цепочку локаторов для точного выбора элемента внутри контейнера:

    let container = element(by.css('.container'));
    let button = container.element(by.css('button.submit'));
  4. Ожидания (ExpectedConditions) Для стабильности тестов рекомендуется использовать ожидания перед взаимодействием с элементом:

    let EC = protractor.ExpectedConditions;
    let submitButton = element(by.id('submit'));
    browser.wait(EC.elementToBeClickable(submitButton), 5000);
    await submitButton.click();

Практические советы

  • Предпочтительно использовать CSS-селекторы или ID, так как они быстрее XPath.
  • Избегать динамических классов и атрибутов, которые могут меняться при каждом обновлении страницы.
  • Проверять, что локатор действительно уникален, чтобы избежать случайного выбора неправильного элемента.
  • Использовать await или цепочки .then() для корректной работы с асинхронностью.

Поиск одного элемента — базовая, но критически важная часть тестирования с Protractor. Правильный выбор локатора и грамотное использование ElementFinder обеспечивают стабильность и читаемость тестов.