WebdriverIO — это современный инструмент для автоматизации тестирования веб-приложений на JavaScript. Одним из ключевых аспектов успешной работы с ним является понимание контекста выполнения и областей видимости в тестах, что напрямую влияет на стабильность и предсказуемость тестового сценария.
Контекст выполнения в WebdriverIO определяется тем, в каком окружении и с каким объектом взаимодействует код. Основные типы контекста:
Глобальный контекст В WebdriverIO глобальный
контекст — это выполнение кода вне конкретного браузерного элемента.
Команды типа browser.url() или
browser.getTitle() выполняются в глобальном контексте, и
результат зависит только от состояния браузера, а не от конкретного
DOM-элемента.
Контекст элемента Контекст элемента создается
при работе с объектами Element или коллекциями
ElementArray. Например:
const button = await $('#submit');
await button.click();
Здесь команда click() выполняется в контексте найденного
элемента. Внутри этого контекста доступны методы работы с элементом,
такие как getText(), isDisplayed(),
waitForExist().
Контекст iframe или shadow DOM Для работы с
вложенными контекстами, например, iframe, необходимо явно переключать
контекст с помощью browser.switchToFrame() или методов для
shadow DOM:
const frame = await $('#frameId');
await browser.switchToFrame(frame);
const input = await $('#inputField');
await input.setValue('Тест');
await browser.switchToParentFrame();
Понимание этих контекстов критично, так как команды WebdriverIO действуют только в текущем активном контексте.
Область видимости определяет, какие элементы доступны для взаимодействия в рамках конкретного контекста.
Локальный поиск Можно выполнять поиск элементов относительно другого элемента, ограничивая область видимости:
const form = await $('#loginForm');
const usernameInput = await form.$('#username');
Здесь поиск #username ограничен элементом
form, что повышает стабильность тестов и снижает
вероятность нахождения неподходящих элементов на странице.
Глобальный поиск Поиск напрямую через
browser.$() или browser.$$() происходит в
пределах всего DOM:
const buttons = await $$('button');
Такой поиск менее избирателен и может возвращать несколько элементов с одинаковыми селекторами на странице.
Асинхронность и ожидания WebdriverIO использует промисы и асинхронные методы, что накладывает требования к правильному управлению областью видимости:
const alert = await $('#alert');
await alert.waitForDisplayed({ timeout: 5000 });
await alert.click();
Если элемент не найден в пределах текущей области видимости,
произойдет ошибка NoSuchElement.
Разделение Page Object и тестов В Page Object модели каждый компонент страницы описывается отдельным классом с методами доступа к элементам и действиями. Контекст выполнения внутри таких объектов локализуется к конкретной области видимости, минимизируя зависимости:
class LoginForm {
get username() { return $('#username'); }
get password() { return $('#password'); }
get submit() { return $('#submit'); }
async login(user, pass) {
await this.username.setValue(user);
await this.password.setValue(pass);
await this.submit.click();
}
}Управление динамическими элементами Если элемент появляется на странице с задержкой, необходимо учитывать его область видимости при ожиданиях:
const dynamicSection = await $('#dynamicSection');
const dynamicButton = await dynamicSection.$('button');
await dynamicButton.waitForClickable({ timeout: 7000 });
await dynamicButton.click();Изоляция контекста между тестами Каждый тест
должен работать с чистым контекстом браузера, чтобы исключить влияние
предыдущих сценариев. Это достигается с помощью beforeEach
и afterEach хуков:
beforeEach(async () => {
await browser.reloadSession();
});browser.$ и element.$ возвращают
объект Element, который содержит собственный контекст и
методы взаимодействия.waitFor* методы перед действиями с
элементами.Понимание контекста выполнения и областей видимости является фундаментом для построения надежных и предсказуемых тестов в WebdriverIO, минимизируя флейки и ошибки взаимодействия с элементами.