Последний этап битвы с Shadow DOM еще предстоит выиграть, поэтому будьте готовы справиться с ним изначально. После изучения предыдущих глав {chpater#1 Анатомия Shadow DOM и chpater#2 Поддержка W3C Webdriver для Shadow DOM} этой серии, теперь у нас есть прочные основы Shadow DOM. Итак, давайте выиграем последний этап и покорим Shadow DOM, используя несколько фреймворков с открытым исходным кодом.

Что нужно выбрать для Shadow DOM, если мы начинаем автоматизацию с нуля?
Если ваша команда по автоматизации тестирования хорошо знакома с JavScript, мы можем выбрать любой из следующих Node. Фреймворки на основе JS, потому что оба изначально поддерживают Shadow DOM.

  • WebdriverIO {оболочка поверх W3C Webdriver} framework v5.5.0+
  • Фреймворк Cypress v5.2.0+

Среда WebDriverIO поверх Shadow DOM
WebdriverIO версии 5.5.0 представила встроенную поддержку теневого DOM с помощью двух новых команд: shadow$ и shadow$$ :

  • shadow$ — Доступ к одному элементу внутри shadowRoot данного элемента.
  • shadow$$ — Доступ к более чем одному элементу внутри shadowRoot данного элемента.

В нашем тестовом приложении у нас есть многоуровневые теневые корни, поэтому нам нужно связать команды $ command и shadow $ настолько глубоко, насколько это необходимо. Прежде всего, с помощью команды $ мы будем обращаться к элементу Shadow Host, т.е. id=todo-app, затем с помощью команд shadow$ мы будем обращаться к элементам Shadow Root, т.е. id=adds-item, а затем id=enter-text-area. Для большей ясности взгляните на приведенный ниже скрипт и скриншот:

browser.$(‘#todo-app’).shadow$(‘#adds-item’).shadow$(‘#enter-text-area’);

В нашем скрипте мы выполним два действия над элементами Shadow DOM:

  • Введите текст внутри элемента‘enter-text-area’
  • Щелкните элемент ‘btn-enter’
// WebDriverIO JS code snippet - GitHub Repo
get inputTaskName () { return browser.$(‘#todo-app’).shadow$(‘#adds-item’).shadow$(‘#enter-text-area’); }
get enterButton () { return browser.$(‘#todo-app’).shadow$(‘#adds-item’).shadow$(‘.btn-enter’); }
enterTodayTaskName (todayTaskName) {
  this.inputTaskName.setValue(todayTaskName);
  this.enterButton.click();
}

Среда Cypress поверх Shadow DOM
Cypress v5.2.0 представила встроенную поддержку теневого DOM с помощью команды shadow(selector), которая переходит в Shadow DOM для поиска элемента:

  • shadow() — Переход в теневой DOM элемента

В нашем тестовом приложении у нас есть многоуровневые теневые корни, поэтому нам нужно связать метод shadow() настолько глубоко, насколько это необходимо. Прежде всего, с помощью метода get() мы будем обращаться к элементу Shadow Host, т.е. id=todo-app, затем с помощью метода shadow() мы будем обращаться к элементам Shadow Root, т.е. id=adds- item, а затем id=enter-text-area. Для большей ясности взгляните на приведенный ниже код и скриншот:

cy
.get(‘#todo-app’)
.shadow().find(‘#adds-item’)
.shadow().find(‘#enter-text-area’);

// Cypress JS code snippet - GitHub Repo
describe(‘Example to demonstrate the handling of Shadow Dom in Cypress’, () => {
before(() => {
  cy.visit(‘http://localhost:3000/')
  })
it(‘Input a text in the plan box and add it to todays list’, () => {
  cy.get(‘#todo-app’)
    .shadow().find(‘#adds-item’)
    .shadow().find(‘#enter-text-area’)
    .type(‘Shadow DOM’)
  cy.get(‘#todo-app’)
    .shadow().find(‘#adds-item’)
    .shadow().find(‘.btn-enter’)
    .click()
  })
})

📍📍 Особый случай — Что, если Shadow DOM находится внутри iFrame? Обработка будет такой же, но Webdriver должен переключить контекст, прежде чем предпринимать какие-либо действия с элементами Shadow DOM iFrame.

Ключевые выводы

  • Осведомлен о фреймворках на основе JS, которые изначально поддерживают Shadow DOM.
  • Познакомился с нативной обработкой Shadow DOM с помощью WebDriverIO.
  • Более известная встроенная обработка Shadow DOM с помощью WebDriverIO.
  • Понятно — обработка Shadow DOM, если они находятся внутри iFrame.

Итак, пришло время опустить занавес — на этом серия автоматизации Shadow DOM заканчивается. Давайте запачкаем руки Shadow DOM и его элементами!!

Для дальнейшего обсуждения или любых сомнений — прокомментируйте ниже и начните открытое сотрудничество над Shadow DOM👍👍👍👍