Узнайте, как принимать меры против новых окон браузера с помощью библиотеки автоматизации Microsoft.

Новые окна и всплывающие окна исторически были проблемой для инженеров по автоматизации тестирования. Хотя Selenium может обрабатывать окна, результаты могут быть привередливыми из-за фокуса браузера. Некоторые инструменты, такие как Cypress, намеренно не позволяют выполнять действия в новом окне.

Microsoft Playwright был создан специально для изящной обработки веб-взаимодействий. Поэтому неудивительно, что окнами и всплывающими окнами легко управлять с помощью Playwright.

В этом руководстве подробно рассказывается, как захватить новые окна с помощью Playwright и как делать утверждения против них. Мы будем использовать страницу Windows браузера DemoQA в качестве основы.

Начиная

Вам нужно будет установить следующие пакеты с помощью Pip или менеджера пакетов по вашему выбору:

  • Драматург
  • Pytest
  • Питест-Драматург

Библиотека pytest-playwright поддерживается создателями Playwright. Он поставляется с множеством полезных приспособлений и методов для удобства проектирования.

Создание теста

На странице Windows браузера DemoQA есть три кнопки:

  • Новая вкладка
  • Новое окно
  • Новое окно с сообщением

В этом уроке мы сосредоточимся на кнопке нового окна. При нажатии на кнопку открывается новое окно с текстом на странице. Других взаимодействий нет.

Наш путь пользователя будет заключаться в том, чтобы перейти на страницу окна браузера, выбрать кнопку нового окна, а затем убедиться, что окно с текстом загружается.

def test_new_browser_window(page):
    """Test that a new window may be opened.
    :param page: A Playwright browser page
    """
    page.goto("https://www.demoqa.com/browser-windows")
    page.wait_for_selector("#windowButton")

В приведенном выше коде мы переходим на страницу окна браузера, затем ждем, пока кнопка окна не станет видимой. Прежде чем зайти слишком далеко, мы должны уделить немного времени тому, чтобы лучше понять, как происходит взаимодействие окон в Playwright.

Необходим контекст

Драматург открывает новые окна в так называемом контексте браузера. Каждый сеанс Playwright начинается с иерархии браузера - ›контекст -› страница ИЛИ браузер - ›страница, в зависимости от того, используется контекст или нет.

В любой момент времени может существовать один уникальный браузер (Chromium, Firefox или Webkit). Однако браузер может содержать несколько контекстов и несколько страниц в каждом контексте.

Открытие нового окна в Playwright добавляет страницу в существующий контекст браузера. Это означает, что все новые окна в определенном контексте наследуют такие элементы, как состояние хранилища и файлы cookie.

Открытие Windows

Используя следующий код, мы можем зафиксировать открытие окна при определенном событии, таком как щелчок по элементу страницы или переход по определенному URL-адресу.

В нашем тестовом примере щелчок по элементу #windowButton открывает новое окно в контексте браузера.

with page.context.expect_page() as window:
    page.click("#windowButton")
new_window = window.value

Если вы решили не использовать библиотеку pytest-playwright, код будет выглядеть несколько иначе:

with context.expect_page() as window:
    page.click("#windowButton")
new_window = window.value

Метод expect_page возвращает EventContextManager, который вызывается с помощью оператора with. Переменная window - это класс EventInfo, возвращаемый диспетчером контекста. Мы можем получить доступ к классу, используя свойство value, которое возвращает объект Playwright Page.

Привязка new_window к результату window.value позволяет нам предпринять действия против новой страницы, например создать дескриптор элемента.

heading = new_window.wait_for_selector("#sampleHeading")

Мы можем использовать утверждение драматурга, чтобы запустить простую проверку видимости нового элемента.

visible = heading.is_visible()

Происхождение неизвестно

Если окно открывается без четкого происхождения, мы можем справиться с этим следующим образом:

def handle_page(page):
    page.wait_for_load_state()
    print(page.url)
page.on("page", handle_page)

Функция handle_page будет запускаться для каждой новой страницы, открытой в контексте браузера, и печатать URL-адрес для нового окна.

Тестовое упрочнение

В новом окне есть текстовый узел с надписью «Это образец страницы». Мы можем утверждать, что внутренний текст узла соответствует ожидаемой текстовой строке. После этого наш тест должен выглядеть следующим образом:

def test_new_browser_window(page):
    """Test that a new window may be opened.
    :param page: A Playwright browser page
    """
    window_text = "This is a sample page"
    page.goto("https://www.demoqa.com/browser-windows")
    page.wait_for_selector("#windowButton")
    with page.context.expect_page() as window:
        page.click("#windowButton")
    new_window = window.value
    heading = new_window.wait_for_selector(
        "#sampleHeading"
    )
    visible = heading.is_visible()
    text = heading.inner_text()
    assert visible and window_text in text

Теперь мы можем запустить наш тест, используя безголовые или головные команды.

  • pytest
  • pytest --headful

Каталог проектов

По завершении этого руководства ваш каталог должен выглядеть следующим образом:

tests
    |__ test_windows.py
.gitignore
README.md
requirements.txt

Резюме

Обработка окон в Playwright не требует усилий. Используя метод expect_page, мы можем принять меры против нового окна или просто дождаться его загрузки. После представления мы можем использовать библиотеку утверждений Playwright, чтобы убедиться, что наше путешествие пользователя было успешным.

Джонатан Томпсон - старший инженер по качеству, специализирующийся на автоматизации тестирования. В настоящее время он проживает в Роли, Северная Каролина, со своей женой и голдендудлом по имени Уинстон. Вы можете связаться с ним в LinkedIn или подписаться на него в Twitter (@jacks_elsewhere) или Github (ThompsonJonM) .