Страницы (Page)
Управление вкладками, навигация и multi-page сценарии
Что такое Page?
Page — это отдельная вкладка браузера. Вся работа с элементами, навигацией и событиями происходит через объект Page. Страница всегда принадлежит конкретному BrowserContext.
Создание страницы
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
# Через контекст
page = context.new_page()
# Напрямую от браузера (создаётся новый контекст)
page2 = browser.new_page()
Основные методы навигации
page.goto("https://example.com")
html = page.content() # весь HTML страницы
title = page.title() # заголовок страницы
url = page.url() # текущий URL
Работа с контентом
Метод page.set_content() позволяет установить HTML напрямую:
page.set_content("<h1>Привет, мир!</h1><p>Это тест</p>")
print(page.textContent("h1")) # "Привет, мир!"
Поиск элементов и локаторы
locator = page.locator(".my-class")
button = page.get_by_role("button", name="Отправить")
frame = page.frame_locator("iframe#content")
Выполнение JavaScript
result = page.evaluate("() => document.title")
print(result)
handle = page.evaluate_handle("() => window")
Popup-окна
При клике, открывающем новое окно, используйте expect_popup():
with page.expect_popup() as popup_info:
page.get_by_text("Открыть в новом окне").click()
new_page = popup_info.value
new_page.wait_for_load_state()
print(new_page.title())
Событие popup через page.on
def on_popup(popup):
popup.wait_for_load_state()
print(f"Popup URL: {popup.url}")
page.on("popup", on_popup)
Ожидание новой страницы в контексте
with context.expect_page() as page_info:
# действие, которое открывает новую вкладку
page.click("a[target=_blank]")
new_page = page_info.value
Переключение между вкладками
# Перевести фокус на вкладку
page.bring_to_front()
# Список всех страниц в контексте
for p in context.pages:
print(p.title())
Закрытие страницы
page.close()
Автозакрытие модалок (locator handler)
page.add_locator_handler() автоматически закрывает всплывающие окна или модальные диалоги при их появлении:
# Автоматически закрывать cookie-баннер
page.add_locator_handler(
page.get_by_role("button", name="Принять"),
handler=lambda btn: btn.click()
)
Multi-page сценарии
def test_multi_page():
with sync_playwright() as pw:
browser = pw.chromium.launch()
page1 = browser.new_page()
page2 = browser.new_page()
page1.goto("https://example.com")
page2.goto("https://playwright.dev")
print(page1.title())
print(page2.title())
page1.close()
page2.close()
page.pause() — пауза для отладки
Открывает инспектор Playwright для пошаговой отладки:
page.pause()
page.opener()
Возвращает страницу, которая открыла текущую (если она была открыта как popup):
with page.expect_popup() as popup_info:
page.click("#open")
popup = popup_info.value
opener = popup.opener()
assert opener is page
Полный пример
from playwright.sync_api import sync_playwright
def main():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://example.com")
page.fill("#search", "Playwright")
page.get_by_role("button", name="Поиск").click()
page.wait_for_load_state("networkidle")
print(f"Результаты: {page.title()}")
page.close()
browser.close()
main()