> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/obshie-voprosy/chto-takoe-pageobject-i-pagefactory.md).

# Что такое PageObject и PageFactory?

### **1️⃣ Page Object (POM — Page Object Model)**

* **Page Object** — это **паттерн проектирования**, который описывает **веб-страницу как объект** в коде.
* В классе Page Object хранятся:
  * элементы страницы (кнопки, поля ввода, ссылки)
  * методы для работы с ними (клики, ввод текста, проверки)

#### ✅ Преимущества:

* Код становится **читабельным и поддерживаемым**
* **Повторное использование**: один раз описал метод, используешь в любом тесте
* Легко менять локаторы — не нужно править тесты

#### Пример на Python + Selenium:

```python
from selenium.webdriver.common.by import By

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.ID, "login-btn")

    def enter_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def enter_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login(self):
        self.driver.find_element(*self.login_button).click()
```

***

### **2️⃣ PageFactory**

* **PageFactory** — это **утилита/шаблон**, который помогает **автоматически инициализировать элементы страницы**.
* Обычно используется с **аннотациями или специальными декораторами**, чтобы не писать каждый `find_element` вручную.

#### ✅ Преимущества:

* **Меньше шаблонного кода**
* Элементы инициализируются **только при обращении к ним** (lazy load)
* Поддерживается в **Java (Selenium) и Python (selenium.webdriver.support.page\_factory)**

#### Пример на Python:

```python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.page_factory import PageFactory

class LoginPage(PageFactory):
    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.ID, "login-btn")
```

* После этого можно обращаться к элементам без явного `find_element` каждый раз.

***

#### 🔹 Разница между POM и PageFactory:

| Паттерн         | Что делает                                 | Пример использования                                 |
| --------------- | ------------------------------------------ | ---------------------------------------------------- |
| **Page Object** | Страница как класс с методами и локаторами | Явно пишем `find_element` в методах                  |
| **PageFactory** | Автоматическая инициализация элементов     | Локаторы инициализируются автоматически, меньше кода |

***

💡 **Простая аналогия:**

* **Page Object** — это твоя карта страницы с руками, чтобы ты сам нажимал кнопки.
* **PageFactory** — это робот, который сам нажимает кнопки по твоей карте, когда нужно.
