# Test info - Name: Позитивные сценарии регистрации >> Успешная регистрация нового пользователя - Location: /Users/vladsmykov/Desktop/Work/AUTOTESTS/CCPC_playwright/tests/ui/registration/register.spec.ts:6:7 # Error details ``` Error: locator.fill: Target page, context or browser has been closed Call log: - waiting for getByPlaceholder('Учёное звание*') - locator resolved to - fill("Доцент") - attempting fill action 2 × waiting for element to be visible, enabled and editable - element is not editable - retrying fill action - waiting 20ms 2 × waiting for element to be visible, enabled and editable - element is not editable - retrying fill action - waiting 100ms 128 × waiting for element to be visible, enabled and editable - element is not editable - retrying fill action - waiting 500ms at RegisterPage.register (/Users/vladsmykov/Desktop/Work/AUTOTESTS/CCPC_playwright/page-objects/RegisterPage.ts:100:35) at /Users/vladsmykov/Desktop/Work/AUTOTESTS/CCPC_playwright/tests/ui/registration/register.spec.ts:15:5 ``` # Test source ```ts 1 | import { Page, Locator } from '@playwright/test'; 2 | 3 | export class RegisterPage { 4 | readonly page: Page; 5 | 6 | // Поля ввода 7 | readonly nameInput: Locator; 8 | readonly surnameInput: Locator; 9 | readonly patronymicInput: Locator; 10 | readonly academicTitleInput: Locator; 11 | readonly degreeInput: Locator; 12 | readonly positionInput: Locator; 13 | readonly organizationInput: Locator; 14 | readonly emailInput: Locator; 15 | readonly phoneInput: Locator; 16 | readonly passwordInput: Locator; 17 | readonly confirmPasswordInput: Locator; 18 | 19 | // Глазики 20 | readonly passwordToggle: Locator; 21 | readonly confirmPasswordToggle: Locator; 22 | 23 | // Кнопка регистрации 24 | readonly submitButton: Locator; 25 | 26 | // Ссылка "Авторизируйтесь" 27 | readonly loginLink: Locator; 28 | 29 | // Ошибки валидации 30 | readonly requiredFieldErrors: Locator; 31 | readonly nameError: Locator; 32 | readonly surnameError: Locator; 33 | readonly positionError: Locator; 34 | readonly emailFormatError: Locator; 35 | readonly passwordLengthError: Locator; 36 | readonly confirmPasswordRequiredError: Locator; 37 | 38 | // Модалки 39 | readonly duplicateUserModal: Locator; 40 | readonly invalidOrgModal: Locator; 41 | 42 | constructor(page: Page) { 43 | this.page = page; 44 | 45 | // Инпуты 46 | this.nameInput = page.getByPlaceholder('Имя*'); 47 | this.surnameInput = page.getByPlaceholder('Фамилия*'); 48 | this.patronymicInput = page.getByPlaceholder('Отчество'); 49 | this.academicTitleInput = page.getByPlaceholder('Учёное звание*'); 50 | this.degreeInput = page.getByPlaceholder('Учёная степень*'); 51 | this.positionInput = page.getByPlaceholder('Должность'); 52 | this.organizationInput = page.getByPlaceholder('Организация*'); 53 | this.emailInput = page.getByPlaceholder('Email (логин)*'); 54 | this.phoneInput = page.getByPlaceholder('Номер телефона*'); 55 | this.passwordInput = page.getByPlaceholder('Придумайте пароль*'); 56 | this.confirmPasswordInput = page.getByPlaceholder('Повторите пароль*'); 57 | 58 | // Глазики 59 | this.passwordToggle = page.locator('input[name="password"] + img'); 60 | this.confirmPasswordToggle = page.locator('input[name="confirmPassword"] + img'); 61 | 62 | // Кнопки 63 | this.submitButton = page.getByRole('button', { name: 'Зарегистрироваться' }); 64 | this.loginLink = page.getByText('Авторизируйтесь'); 65 | 66 | // Ошибки 67 | this.requiredFieldErrors = page.locator('div[name="error"]', { hasText: 'Поле обязательно для заполнения' }); 68 | this.nameError = page.getByText('Некорректное имя'); 69 | this.surnameError = page.getByText('Некорректная фамилия'); 70 | this.positionError = page.getByText('Не более 200 символов!'); 71 | this.emailFormatError = page.getByText('Некорректный Email'); 72 | this.passwordLengthError = page.getByText('Не менее 8 символов'); 73 | this.confirmPasswordRequiredError = page.getByText('Поле обязательно для заполнения'); 74 | 75 | // Модальные окна 76 | this.duplicateUserModal = page.getByText('Пользователь с таким email или телефоном уже зарегистрирован!'); 77 | this.invalidOrgModal = page.getByText('Некорректное название организации!'); 78 | } 79 | 80 | async goto() { 81 | await this.page.goto('/login/registration'); 82 | } 83 | 84 | async register(data: { 85 | name: string, 86 | surname: string, 87 | patronymic?: string, 88 | academicTitle: string, 89 | degree: string, 90 | position?: string, 91 | organization: string, 92 | email: string, 93 | phone: string, 94 | password: string, 95 | confirmPassword: string 96 | }) { 97 | await this.nameInput.fill(data.name); 98 | await this.surnameInput.fill(data.surname); 99 | if (data.patronymic) await this.patronymicInput.fill(data.patronymic); > 100 | await this.academicTitleInput.fill(data.academicTitle); | ^ Error: locator.fill: Target page, context or browser has been closed 101 | await this.degreeInput.fill(data.degree); 102 | if (data.position) await this.positionInput.fill(data.position); 103 | await this.organizationInput.fill(data.organization); 104 | await this.emailInput.fill(data.email); 105 | await this.phoneInput.fill(data.phone); 106 | await this.passwordInput.fill(data.password); 107 | await this.confirmPasswordInput.fill(data.confirmPassword); 108 | await this.submitButton.click(); 109 | } 110 | } 111 | ```