# Что такое 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** — это робот, который сам нажимает кнопки по твоей карте, когда нужно.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/obshie-voprosy/chto-takoe-pageobject-i-pagefactory.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
