Разделы портала

Онлайн-тренинги

.
Кликанье по Web-элементам при помощи Selenium WebDriver
10.06.2019 00:00

Автор: Энди Найт (Andy Knight)
Оригинал статьи: https://automationpanda.com/2018/06/15/web-element-clicks-with-selenium-webdriver/
Перевод: Ольга Алифанова

Selenium WebDriver – наиболее популярный пакет с открытым исходным кодом для автоматизации тестирования Web UI. Он позволяет тестам напрямую взаимодействовать со страницей в живом браузере. Однако его использование может сильно раздражать, потому что базовым взаимодействиям зачастую не хватает устойчивости, и это вызывает плавающие проблемы.

Основы

Одно из таких уязвимых взаимодействий – это кликанье по элементам на странице. Клик – наверное, наиболее частое взаимодействие в тестах. В C# базовый клик будет выглядеть так:

webDriver.FindElement(By.Id("my-id")).Click();

Это простой стандартный способ кликать по элементам с использованием Selenium WebDriver. Однако сработает этот способ только тогда, когда целевой элемент существует и отображается на странице. В противном случае WebDriver выдаст исключение, и тогда-то разработчики и начинают рвать на себе волосы.

Ожидание появления

Дабы избежать гонки данных, взаимодействия не должны осуществляться, пока целевой элемент не появится на странице. Даже время загрузки в доли секунд может сломать автотест. Лучший подход – это использовать явные ожидания перед взаимодействиями, ограничив их разумным таймаутом, например, так:

const int timeoutSeconds = 15;

var ts = new TimeSpan(0, 0, timeoutSeconds);

var wait = new WebDriverWait(webDriver, ts);

wait.Until((driver) => driver.FindElements(By.Id("my-id")).Count > 0);

webDriver.FindElement(By.Id("my-id")).Click();

Другие предварительные условия

Иногда Web-элементы не появятся, пока не задействовано что-нибудь еще. Даже если элемент существует на странице, WebDriver не может кликнуть по нему, пока он не станет видимым. Всегда ищите правильный способ сделать этот элемент доступным для клика. Вначале кликните на родительских панелях или расширителях. Проскролльте, если это необходимо. Убедитесь, что состояние системы делает элемент кликабельным.

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

new Actions(webDriver)

.MoveToElement(webDriver.FindElement(By.Id("my-id")))

.Click()

.Perform();

Последние отчаянные попытки

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

((IJavaScriptExecutor)webDriver).ExecuteScript(

"arguments[0].click();",

webDriver.FindElement(By.Id("my-id")));

Делайте это, только если это абсолютно необходимо. Лучше всего использовать методы Selenium WebDriver, потому что они делают автоматизированное взаимодействие более похожим на реальное поведение пользователя, нежели сырые вызовы JavaScript. Убедитесь, что вы аргументированно доказали, почему это делается именно так, в комментариях к коду.

Последний совет

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

Примечание: примеры кода на этой странице написаны на C#, однако на прочих языках, поддерживаемых Selenium WebDriver, это реализуется аналогично.

Обсудить в форуме