How to automate shadow DOM elements using selenium?
Как автоматизировать теневые элементы DOM с помощью selenium?
Я использую Java Selenium project для автоматизации веб-страницы. Веб-страница содержит множество многоуровневых элементов DOM с теневым корнем, с которыми я не могу взаимодействовать с помощью метода selenium findElement.
Я пробовал следующие решения:
глубокий css (не работает в последней версии браузера Chrome)
JS Executor. (Это действительно утомительно и становится сложным в обслуживании)
Примечание:
Если вы знаете какое-либо другое решение, отличное от перечисленных выше, которое я могу реализовать в Selenium Java Framework, пожалуйста, передайте решение. Заранее спасибо !.
Переведено автоматически
Ответ 1
Есть очень хороший плагин, который можно использовать с проектом selenium shadow-automation-selenium. Это помогает в написании гораздо лучшего, читаемого и поддерживаемого кода. С помощью этого вы можете получить доступ к многоуровневому shadow DOM (до 4 уровней). Для идентификации элементов используется простой css-селектор.
WebElement findElement(String cssSelector) : используйте этот метод, если хотите использовать один элемент из DOM
List<WebElement> findElements(String cssSelector) : используйте это, если вы хотите найти все элементы из DOM
WebElement findElements(WebElement parent, String cssSelector) : используйте это, если вы хотите найти отдельные элементы из родительского объекта DOM
List<WebElement> findElements(WebElement parent, String cssSelector) : используйте это, если вы хотите найти все элементы из родительского объекта DOM
WebElement getShadowElement(WebElement parent,String selector) : используйте это, если вы хотите найти один элемент из родительского DOM
List<WebElement> getAllShadowElement(WebElement parent,String selector) : используйте это, если вы хотите найти все элементы из родительского DOM
boolean isVisible(WebElement element) : используйте это, если вы хотите получить видимость элемента
boolean isChecked(WebElement element) : используйте это, если хотите проверить, установлен ли флажок
boolean isDisabled(WebElement element) : используйте это, если хотите проверить, отключен ли элемент
String getAttribute(WebElement element,String attribute) : используйте это, если вы хотите получить атрибут типа aria-selected и другие пользовательские атрибуты элементов.
void selectCheckbox(String label) : используйте это, чтобы выбрать элемент checkbox с помощью label.
void selectCheckbox(WebElement parentElement, String label) : используйте это, чтобы выбрать элемент checkbox с помощью label.
void selectRadio(String label) : используйте это для выбора радиоэлемента с помощью label.
void selectRadio(WebElement parentElement, String label) : используйте это, чтобы выбрать радиоэлемент из родительского DOM с помощью label.
void selectDropdown(String label) : используйте это для выбора элемента выпадающего списка с помощью метки (используйте это, если только один выпадающий список присутствует или загружен в пользовательский интерфейс).
void selectDropdown(WebElement parentElement, String label) : используйте это, чтобы выбрать элемент выпадающего списка из родительского DOM с помощью label.
Как использовать этот плагин: вам придется установить зависимость в вашем проекте.
Как обычно для a #shadow-root, варианты навигации для следующего перехода ограничены. Например. для Chrome By.cssSelector() и By.className() допустимы, но By.id() и By.tagName() не работают с org.openqa.selenium.InvalidArgumentException: invalid argument: invalid locator
Ответ 3
Шаги для определения теневых элементов DOM с помощью JSExecutor и CSS:
Узнайте базовый элемент, то есть родительский элемент теневого корневого элемента.
Получить теневой корень этого элемента.
И найдите свой элемент в этом теневом корневом webelement
//Get shadow root element WebElement shadowRoot1 = getShadowRootElement(root1);
# Шаг3 - Нам нужно найти элементы с помощью CSS Selector, которые находятся внутри shadow root, xpath здесь не будет работать
//Here we will get Element inside Shadow Dom Element WebElement shadowElement = shadowRoot3.findElement(By.cssSelector("div[id=label]"));
Ответ 4
Чтобы продемонстрировать автоматизациюshadow DOM с использованием Selenium версии v3.x, ChromeDriver версии v2.46 и Chrome версии 73.x, вот несколько подходов, которые открывают URL-адрес chrome://downloads/ и с помощью executeScript() метода отправляют последовательность символовpdf в качестве текста поиска в окне поиска.
Использование document.querySelector()
В качестве канонического подхода вы можете использовать document.querySelector() метод следующим образом:
Согласно обсуждению в Определение судьбы экспериментального комбинатора ">>>">>> combinator, который был заменой /deep/ combinator для преобразования всех границ shadow DOM в style, который был реализован за флагом в Blink, устарел.