# Документация библиотеки для тестирования веб-страниц

## Общее описание

Библиотека предоставляет базовые классы для описания структуры веб-страницы и взаимодействия с её элементами при написании тестов с использованием Playwright.

## Установка

```bash
pip install your-library-name
```

## Основные компоненты

### Класс Auth

Базовый класс для описания страницы авторизации или любой другой веб-страницы.

**Атрибуты:**
| Атрибут | Тип | Описание |
|---------|-----|----------|
| `url` | `str` | URL страницы (должен быть указан в дочернем классе) |

**Методы:**
| Метод | Параметры | Описание |
|-------|-----------|----------|
| `__init__` | `page: Page` | Принимает объект страницы Playwright |
| `run_test` | - | Выполняет переход на указанный URL |

### Класс Object

Базовый класс для всех элементов страницы.

**Атрибуты:**
| Атрибут | Тип | Описание |
|---------|-----|----------|
| `locator` | `str` | CSS-селектор или другой локатор элемента |

### Класс InputObject

Базовый класс для полей ввода.

**Атрибуты:**
| Атрибут | Тип | Описание |
|---------|-----|----------|
| `locator` | `str` | Локатор элемента |
| `type` | `Literal["login", "password", "email"]` | Тип поля ввода |

### Класс Input

Класс для описания поля ввода (наследуется от InputObject).

### Класс Button

Класс для описания кнопки.

### Класс Link

Класс для описания ссылки.

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

### Определение страниц

```python
from playwright.sync_api import Page
from your_library import Auth, Input, Button, Link

class LoginPage(Auth):
    url = "https://example.com/login"
    
    # Поля ввода
    username_input = Input("#username", type="login")
    password_input = Input("#password", type="password")
    email_input = Input("#email", type="email")
    
    # Кнопки
    submit_button = Button("#submit")
    register_button = Button("#register")
    
    # Ссылки
    forgot_password_link = Link("#forgot-password")
    registration_link = Link("#go-to-registration")

class ProfilePage(Auth):
    url = "https://example.com/profile"
    
    # Поля профиля
    first_name_input = Input("#first-name", type="login")
    last_name_input = Input("#last-name", type="login")
    email_input = Input("#profile-email", type="email")
    
    # Кнопки действий
    save_button = Button("#save")
    cancel_button = Button("#cancel")
    logout_button = Button("#logout")
    
    # Ссылки
    settings_link = Link("#settings")
    help_link = Link("#help")
```

### Написание тестов

```python
from playwright.sync_api import Page

def test_login(page: Page):
    # Создание экземпляра страницы и переход по URL
    login_page = LoginPage(page)
    login_page.run_test()
    
    # Взаимодействие с элементами страницы
    page.fill(login_page.username_input.locator, "test_user")
    page.fill(login_page.password_input.locator, "password123")
    page.click(login_page.submit_button.locator)
    
    # Проверка результатов
    assert page.url == "https://example.com/profile"

def test_registration_flow(page: Page):
    # Переход на страницу регистрации
    login_page = LoginPage(page)
    login_page.run_test()
    
    # Клик по ссылке регистрации
    page.click(login_page.registration_link.locator)
    
    # Заполнение формы регистрации (предполагаем наличие страницы RegistrationPage)
    assert page.url == "https://example.com/register"
    
def test_profile_update(page: Page):
    # Авторизация и переход в профиль
    profile_page = ProfilePage(page)
    profile_page.run_test()
    
    # Обновление данных профиля
    page.fill(profile_page.first_name_input.locator, "New Name")
    page.fill(profile_page.last_name_input.locator, "New Last Name")
    page.click(profile_page.save_button.locator)
    
    # Проверка сохранения
    assert page.is_visible(".success-message")
```

## Принцип работы

1. **Определение структуры страницы**: Создаётся класс, наследующийся от `Auth`, в котором указывается `url` и определяются элементы страницы с соответствующими локаторами.

2. **Инициализация в тесте**: В тестовой функции создаётся экземпляр класса страницы с передачей объекта `page` из Playwright.

3. **Переход на страницу**: Вызов метода `run_test()` осуществляет переход по указанному URL.

4. **Взаимодействие с элементами**: Для взаимодействия с элементами используются стандартные методы Playwright, а локаторы берутся из определённых в классе атрибутов.

## Расширение библиотеки

Вы можете создавать собственные классы элементов, наследуясь от базовых классов:

```python
from your_library import Object

class Checkbox(Object):
    def __init__(self, locator: str, checked_by_default: bool = False):
        super().__init__(locator)
        self.checked_by_default = checked_by_default

class Dropdown(Object):
    def __init__(self, locator: str, options: list):
        super().__init__(locator)
        self.options = options
```