Context switching

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

Что такое контексты в WebdriverIO?

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

Контексты делятся на несколько типов:

  1. Основное окно браузера — контекст по умолчанию, где тесты выполняются, если не указано иное.
  2. Фреймы — внутренние документы или части страницы, которые содержат отдельную область DOM. Фрейм может быть как обычным HTML, так и использовать другие технологии, такие как SVG или даже iframe.
  3. Мобильные контексты — в случае тестирования мобильных приложений через WebdriverIO можно работать с приложениями через контексты, которые предоставляют интерфейс для взаимодействия с нативными элементами мобильных ОС.

Переключение между контекстами

Для того чтобы взаимодействовать с элементами в другом контексте (например, внутри фрейма), WebdriverIO предоставляет методы для переключения между ними.

Основной метод: switchToFrame()

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

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

// Переключение на фрейм по индексу
browser.switchToFrame(0);

// Переключение на фрейм по его имени или id
browser.switchToFrame('iframeName');

// Взаимодействие с элементами внутри фрейма
const inputField = $('#inputField');
inputField.setValue('Test Input');

Если необходимо вернуться в основной контекст, можно использовать команду switchToParentFrame():

browser.switchToParentFrame();

Этот метод позволяет вернуться в предыдущий контекст, обычно это основной документ, если было переключение в фрейм.

Переключение между окнами: switchWindow()

Если тестируемое приложение открывает несколько окон или вкладок, необходимо использовать методы для переключения между ними. Метод switchWindow() позволяет переключаться между разными окнами браузера по их идентификатору.

Пример:

// Получение всех окон
const handles = browser.getWindowHandles();

// Переключение на второе окно (вкладку)
browser.switchToWindow(handles[1]);

// Взаимодействие с элементами в другом окне
const newWindowElement = $('#newWindowElement');
newWindowElement.click();

При работе с несколькими окнами или вкладками важно отслеживать их идентификаторы и переключаться между ними при необходимости.

Переключение на мобильный контекст: switchContext()

Когда тестируется мобильное приложение с использованием WebdriverIO, необходимо переключаться между различными контекстами. Например, можно переключаться между веб-контекстом и нативными элементами мобильного приложения.

Пример переключения контекста на мобильное приложение:

// Переключение на веб-контекст
browser.switchContext('WEBVIEW_1');

// Переключение на нативный контекст
browser.switchContext('NATIVE_APP');

Это позволяет WebdriverIO работать как с веб-страницей, так и с нативными мобильными элементами, такими как кнопки, поля ввода и другие компоненты мобильного интерфейса.

Проверка доступных контекстов

Перед тем как переключаться между контекстами, полезно знать, какие контексты доступны в текущем браузере или мобильном приложении. Для этого можно использовать метод getContexts(), который возвращает список всех доступных контекстов.

Пример:

// Получение всех доступных контекстов
const contexts = browser.getContexts();
console.log(contexts); // Выведет список контекстов: ['NATIVE_APP', 'WEBVIEW_1', 'WEBVIEW_2']

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

Важные моменты при переключении контекста

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

  2. Влияние на локаторы: При переключении на фрейм или другое окно все локаторы, которые были привязаны к основному документу, перестанут работать. Поэтому важно удостовериться, что действия выполняются в правильном контексте.

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

  4. Обработка ошибок: Иногда контекст может быть недоступен, например, если элемент внутри фрейма не найден. В таких случаях важно обрабатывать ошибки с помощью try-catch или использовать асинхронные ожидания для обеспечения стабильной работы тестов.

Заключение

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