# Какие виды локаторов страницы существуют? Каковы их преимущества и недостатки?

В веб-тестировании (Selenium, Playwright, Cypress и др.) локаторы — это способы нахождения элементов на веб-странице.&#x20;

***

#### 🔑 Виды локаторов:

1. **ID**
   * **Пример:** `driver.find_element(By.ID, "username")`
   * ✅ *Преимущества:* уникальный, быстрый, самый надёжный способ.
   * ❌ *Недостатки:* не всегда есть на элементе, может меняться при обновлении фронта.
2. **Name**
   * **Пример:** `driver.find_element(By.NAME, "email")`
   * ✅ *Плюсы:* читаемый, часто используется для input-ов (форм).
   * ❌ *Минусы:* может быть неуникальным → вернёт первый попавшийся элемент.
3. **Class Name**
   * **Пример:** `driver.find_element(By.CLASS_NAME, "btn-primary")`
   * ✅ *Плюсы:* удобно, если класс уникален.
   * ❌ *Минусы:* классов может быть несколько, часто генерируются автоматически (BEM, Tailwind, Bootstrap).
4. **Tag Name**
   * **Пример:** `driver.find_element(By.TAG_NAME, "input")`
   * ✅ *Плюсы:* просто для поиска группы элементов.
   * ❌ *Минусы:* редко уникален, почти всегда требует уточнения.
5. **Link Text / Partial Link Text**
   * **Пример:**
     * Полный: `driver.find_element(By.LINK_TEXT, "Forgot password?")`
     * Частичный: `driver.find_element(By.PARTIAL_LINK_TEXT, "Forgot")`
   * ✅ *Плюсы:* удобно для ссылок и кнопок-ссылок.
   * ❌ *Минусы:* зависит от текста → при локализации/редизайне ломается.
6. **CSS Selector**
   * **Пример:** `driver.find_element(By.CSS_SELECTOR, "div.login input[type='text']")`
   * ✅ *Плюсы:* мощный, быстрый, поддерживает сложные комбинации.
   * ❌ *Минусы:* может быть хрупким, если вёрстка часто меняется.
7. **XPath**
   * **Пример:** `driver.find_element(By.XPATH, "//div[@id='login']//input[@name='username']")`
   * ✅ *Плюсы:* гибкий, можно строить сложные выражения, двигаться по DOM (родитель → потомок).
   * ❌ *Минусы:* длинный, менее читаемый, более медленный, чем CSS.

***

#### ⚖️ Итог:

* **Лучше всего использовать:** `ID` (если есть).
* **Хорошая альтернатива:** `CSS Selector`.
* **XPath** нужен для сложных случаев (например, если нужно выбрать элемент по тексту).
* **Name / Class / Tag / Link Text** применяются как вспомогательные.
