Тестирование элементов из Shadow DOM с помощью Selenium

  • 8 ноября 2024
  • 78 просмотров
  • 0 комментариев

Тестирование веб-компонентов и элементов, находящихся внутри Shadow DOM, представляет определённые сложности, так как такие элементы не всегда доступны для стандартных методов поиска в Selenium. В этой статье рассмотрим особенности работы с Shadow DOM, а также дадим практические примеры для автоматизации тестирования подобных элементов с использованием Selenium.

Что такое Shadow DOM и зачем его тестировать

Shadow DOM — это технология, которая позволяет изолировать части веб-компонента от остальной структуры DOM-дерева. Благодаря этому разработчики могут создавать компоненты с собственным стилем и поведением, не затрагивая стили и элементы родительской страницы. Однако, из-за изоляции, элементы внутри Shadow DOM требуют специальных методов для взаимодействия с ними, так как стандартные команды Selenium их не видят.

Подготовка к тестированию Shadow DOM

Далее, при работе с Shadow DOM важно знать, какие элементы вы хотите тестировать, и убедиться, что они действительно находятся в теневом DOM. Для этого откройте инспектор браузера и проверьте наличие атрибута shadow-root.

Обход ограничений с помощью JavaScript

Selenium не поддерживает прямую работу с элементами внутри Shadow DOM, поэтому для взаимодействия с ними мы будем использовать JavaScript-исполнение команд через Selenium. С помощью метода executeScript можно обращаться к теневым элементам, обходя изоляцию Shadow DOM.

Пример кода для взаимодействия с элементом в Shadow DOM

Рассмотрим пример, где мы получаем доступ к полю ввода, находящемуся внутри теневого DOM:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.JavascriptExecutor;

public class ShadowDOMTest {
    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://example.com");

        // Используем JavaScript для доступа к Shadow Root и внутреннему элементу
        JavascriptExecutor js = (JavascriptExecutor) driver;
        WebElement shadowHost = driver.findElement(By.cssSelector("css-селектор-хоста"));

        // Выполняем JavaScript для получения элемента внутри Shadow DOM
        WebElement inputField = (WebElement) js.executeScript(
            "return arguments[0].shadowRoot.querySelector('css-селектор-внутреннего-элемента')",
            shadowHost
        );

        inputField.sendKeys("Тестовый текст");
    }
}

Здесь "css-селектор-хоста" - это CSS селектор для ближайшего не элемента, не принадлежащего к Shadow DOM, но содержащего искомый элемент из Shadow DOM. В свою очередь "css-селектор-внутреннего-элемента" - это CSS селектор искомого элемента из Shadow DOM.

Мы используем метод querySelector прямо в JavaScript, чтобы найти элемент input внутри Shadow DOM. Обход с использованием JavaScript позволяет нам работать с Shadow DOM, не полагаясь на ShadowRoot или другие сложные конструкции. Этот подход работает независимо от версии Selenium и избегает всех проблем с видимостью ShadowRoot.

Проверка значений и атрибутов внутри Shadow DOM

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

WebElement shadowHost = driver.findElement(By.cssSelector("css-селектор-хоста"));

WebElement inputField = (WebElement) js.executeScript(
    "return arguments[0].shadowRoot.querySelector('css-селектор-внутреннего-элемента')",
    shadowHost
);

String value = (String) js.executeScript("return arguments[0].value", inputField);

if ("Ожидаемое значение".equals(value)) {
    System.out.println("Тест пройден: значение поля соответствует ожиданиям.");
} else {
    System.out.println("Тест не пройден: значение поля не соответствует ожиданиям.");
}

driver.quit();

Здесь мы используем JavaScript для получения значения элемента внутри Shadow DOM, а затем сравниваем его с ожидаемым значением.

Проверка и работа с несколькими уровнями Shadow DOM

Иногда элементы могут находиться в многослойном Shadow DOM, где один теневой DOM включает в себя другой:

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

// Находим внешний хост Shadow DOM
WebElement outerShadowHost = driver.findElement(By.cssSelector("css-селектор-внешнего-хоста"));

// Получаем внутренний хост через JavaScript
WebElement innerShadowHost = (WebElement) js.executeScript(
    "return arguments[0].shadowRoot.querySelector('css-селектор-внутреннего-хоста')",
    outerShadowHost
);

// Получаем вложенный элемент через JavaScript
WebElement nestedElement = (WebElement) js.executeScript(
    "return arguments[0].shadowRoot.querySelector('css-селектор-вложенного-элемента')",
    innerShadowHost
);

// Выполняем действие с найденным элементом
nestedElement.click();

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

Тестирование веб-компонентов и Shadow DOM с помощью Selenium требует использования JavaScript-команд для доступа к теневым элементам. Этот подход позволяет автоматизировать тестирование современных веб-компонентов, даже если они изолированы от стандартного DOM. Если вам нужны дополнительные ресурсы по автоматизации тестирования, вы можете ознакомиться со списком литературы для тестировщиков. Вам так же может оказаться полезной статья о сравнении современных инструментов для тестирования веб-приложений.

    Оставьте отзыв
    (минимум 60 знаков)
    Оценка5/5
    Нужно авторизоваться