Содержание

Селекторы — Основы CSS — HTML Academy

Загрузка…
Через несколько секунд всё будет готово

  • index.html
  • style.css
HTML

<!DOCTYPE html> <html lang=»ru»> <head> <meta charset=»utf-8″> <title>Сайт начинающего верстальщика</title> <link rel=»stylesheet» href=»style.css»> </head> <body> <header> <h2>Сайт начинающего верстальщика</h2> </header> <main> <img src=»img/raccoon.svg» alt=»Аватарка»> <nav> <h3>Записи в блоге</h3> <ul> <li><a href=»day-1.html»>День первый. Как я забыл покормить кота</a></li> <li><a href=»day-2.html»>День второй. Хочу быть верстальщиком</a></li> <li><a href=»day-3.html»>День третий. Мой кот на меня обиделся</a></li> <li><a href=»day-4.

html»>День четвёртый. Как я чуть не заболел</a></li> <li><a href=»day-5.html»>День пятый. Отдыхаю</a></li> <li><a href=»day-6.html»>День шестой. Как я ничего не понял</a></li> <li><a href=»day-7.html»>День седьмой. Кекс выдал мне задание</a></li> <li><a href=»day-8.html»>День восьмой. Очень серьёзный</a></li> <li><a href=»day-9.html»>День девятый. Точнее ночь</a></li> <li><a href=»day-10.html»>День десятый. Подведение итогов</a></li> <li><a href=»day-11.html»>День одиннадцатый. Без фанатизма</a></li> <li><a href=»day-12.html»>День двенадцатый. Все любят печенье</a></li> <li><a href=»day-13.html»>День тринадцатый. Нашёл статью</a></li> <li><a href=»day-14.
html»>День четырнадцатый. Новый формат</a></li> <li><a href=»day-15.html»>День пятнадцатый. Галерея селфи</a></li> </ul> </nav> <section> <p>Всем привет! Добро пожаловать на мой первый сайт. Ещё недавно я понятия не имел, кто такой верстальщик, а теперь я нашёл <a href=»https://htmlacademy.ru/courses»>тренажёры по HTML и CSS</a> и поставил перед собой цель — стать им. У меня даже появился инструктор — Кекс, который не позволит мне расслабиться и будет следить за моими успехами.</p> <p>Моё первое задание — вести дневник и честно писать обо всех своих свершениях.</p> </section> <section> Раздел про навыки </section> </main> <footer> Подвал сайта </footer> </body> </html>

CSS

body { padding: 0 30px; font-size: 14px; line-height: 22px; font-family: «Georgia», serif; color: #222222; } h2 { font-size: 36px; line-height: normal; } h3 { font-size: 20px; line-height: normal; } a { color: #0099ef; text-decoration: underline; } /* Замените название селектора в правиле ниже */ selector { border-radius: 10px; } nav { margin-bottom: 30px; background-color: #4470c4; } /* Замените название селектора в правиле ниже */ selector { color: #ffffff; } ul { list-style: none; padding-left: 0; } footer { margin-top: 30px; }

Что в задании вам не понравилось?

Не работает проверка кодаЗадание слишком сложноеНепонятная теорияДругое (сейчас напишу)

Другое (сейчас напишу)

Спасибо! Мы скоро всё исправим)

Код изменился, нажмите «Обновить» или включите автозапуск.

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

ЗадачиВыполнено

  1. В CSS-правиле на 25 строке замените заглушку selector на селектор .avatar,
  2. а затем на 35 строке замените заглушку selector на селектор nav a (да, с пробелом, позже расскажем почему).

CSS | Селектор правила

Селектор CSS – указатель (маркер) браузеру выполнения внешнего или внутреннего стилевого правила отображения выбранного html-элемента

  1. Стилевое правило
  2. CSS-стили
  3. Правило CSS
  4. Селектор правила CSS
  5. Селектор html-тегов
  6. Селектор классов
  7. Селектор идентификаторов
Стилевое правило

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


свойство: значение;

CSS-стили

CSS-стили определяют внешний вид и расположение html-элемента на странице – цвет, шрифт, размер блока, списка, абзаца … Различают встроенный стиль html-элемента и таблицы стилей CSS (внутренние и внешние). Таблицы стилей CSS, в отличие от встроенного стиля – находятся за пределами html-элемента. Связать воедино правило стиля html-элемента и сам элемент, указать браузеру конкретный html-элемент выполнения правила стиля, требуется маркер –

CSS-селектор правила. Селектор правила CSS указывает браузеру место на странице (html-элемент) применения прописанных CSS-стилей. CSS-селектор – неотъемлемая часть внешних и внутренних таблиц CSS. Справка:

Правило CSS

Подключенные (внутренние и внешние) таблицы CSS-стилей состоят из правил и содержат минимум одно правило отображения html-элемента. Текст

правила начинается его селектором. Селектор правила располагается до знака фигурной открывающей скобки «{» и определяет элемент html-документа, подчиненный правилу.
Блок объявлений правила расположен за селектором, заключен в фигурные скобки и содержит объявления стилей, разделённых знаком «;». В объявлении стиля указано конкретное свойство элемента и его значение.

Допускается (но, не приветствуется) сокращенная форма записи правила таблицы CSS, без пробелов и перевода строки:

селектор{свойсто:значение;}

Селектор правила CSS

Селектор правила CSS – неотъемлемая часть CSS-стиля, находящегося за пределами html-элемента документа. Cелектор CSS указывает браузеру html-элемент для применения CSS-стилей, содержащихся в блоке объявлений возглавляемого им правила и определяющих внешний вид и расположение html-элемента на странице – цвет, шрифт, размер, обтекание блока, списка, абзаца …

Селектор html-тегов

Селектором html-тегов (селектором по типу элементов) выступает непосредственно html-тег спецификации HTML. Правило селектора тегов распространяется на элементы страницы с прописанным html-тегом и применяется браузером при отсутствии указания иного:

/* Кроссбраузерный сброс отступов */
html, body, div, p, a, span, h2, dl, dt, dd, ol, ul, li, form, label, table, caption, tr, th, td, article, aside, menu, nav, output, section, audio, video {margin:0;}

Селектор классов

Правило селектора классов верно для элементов HTML с присвоенным атрибутом class указанного в селекторе имени. Имя слагается из цифр и латинских символов в любой комбинации. Желательно использовать человеко-понятную форму имени, отличимую от названий тегов спецификации HTML и литеры нижнего регистра. Селектору классов в CSS характерна точка перед именем:
CSS

.red123{color:red;}
HTML
<div class=”red123”>красный текст</div>
<p class=”red123”>красный текст</p>
<h4 class=”red123”>красный текст</h4>

Селектор идентификаторов

Действие селектора идентификатора ничем не отличается от работы селектора классов, кроме одного: идентификатор «id» присваивается исключительно одному элементу HTML. Свойства правила, обозначенные селектором идентификаторов, применятся в одном единственном экземпляре с уникальным атрибутом «id» – универсальным индивидуальным идентификатором. Имя идентификатора формируется (придумывается автором) по принципу имени селектора классов и прибавляется спереди решетка. Принципиальное отличие идентификатора от класса: идентификаторы универсальны, они используются в якорях-html и jаvascript для нахождения уникального места в документе. Выбирая имя, важно не повториться и не сбить работу страницы.

CSS
#red123{color:red;}
HTML
<div id=”red123”>красный текст исключительно здесь !!!</div>

Классы и идентификаторы элементов

Основное отличие класса от идентификатора – идентификатор предназначен для одного элемента, класс присваивают сразу нескольким. Для идентификаторов такое невозможно, два идентификатора с одинаковым именем не работают.

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

=»http://»] {свойство: значение;}

– часть атрибута, любое слово в маске*
а[атрибут*=»любое_слово_в_маске»]

a[href*=»tehnopost «]{свойство: значение;}

– часть атрибута, окончание маски$:
ссылки на домен «. Info»
[атрибут$=»_окончание»]
а[href$=». info»] {свойство: значение;}
ссылки на фото «.jpg»:
а[href$=».jpg»]

Браузер выберет элементы с указанным атрибутом и отобразит в описанном стиле. В учебниках приводятся в основном, примеры со ссылками.

Селектор потомков
Селектор потомков (контекстный селектор, селектор вложений) используется в стилизации подчиненных элементов. Классика примера – оформление списка:
1. #menu {свойство: значение;}
2. #menu ul {свойство: значение;}
3. #menu ul li {свойство: значение;}
4. #slidemenu ul li a {свойство: значение;}
5. #slidemenu ul li a span{свойство: значение;}
/* Глубже вкладывать и засовывать свойства не надо. */
Селектор дочерних элементов
ul > b {свойство: значение;}
Селектор дочерних элементов (селектор вложений) выберет прямого потомка (элемент b) в первой строке и не выберет элемент b в остальных строках html-кода:
1.   <ul><b>текст</b>
2.   <li><b>текст</b>
3.    <ul>
4.     <li><b>текст</b></li>
5.    </ul>
6.    <ul>
7.     <li><b>текст</b></li>
8.    </ul>
9.   </li>
10.  <li><b>текст</b></li>
11. </ul>
Селектор элементов одного уровня
Селектор элементов одного уровня (соседний селектор) поможет выбрать элемент, следующий сразу же за указанным элементом. Выберем первый абзац текста, следующий за тэгом h2 (первый абзац на каждой странице):
h2 + p {свойство: значение;}
Селекторы псевдоклассов и псевдоэлементов

Отдельный интерес представляют селекторы псевдоклассов и псевдоэлементов, образуемые при обращении к интерактивному html-элементу, как правило – ссылке или якорю:

Селектор псевдоклассов
a:active {color: blue;}
a:link { color: red; }
a:visted { color: purple; }

Селектор псевдоэлементов
/* Выделение первой буквы абзаца*/
p::first-line {font-weight:bold; font-size: 1. 2em;}

Разница не только в лишнем двоеточии.

В CSS существует ограниченный набор псевдоклассов, описывающих вид гиперссылок с определённым состоянием в документе, вид элемента, на котором находится фокус ввода, а также вид элементов, являющихся первыми дочерними элементами других элементов. Псевдоэлементов в CSS существует четыре: первая буква, первая строка, стили «до» и «после» элемента.

{color: blue;}
{font-size: 32px;}
{color: red;}
дальше по тексту:
{свойство: значение;}

Имена классов и идентификаторов, в отличие от названий тегов и их атрибутов, чувствительны к регистру ввода букв.


Вестимо, внешние стили CSS находятся в отдельных (внешних) файлах, внутренние – в теле веб-документа, встроенные – непосредственно в открывающем теге html-элемента.

CSS описывает свойства элемента – в CSS-стили определяют внешний вид и свойства HTML-элементов. Подключаются CSS-стили к веб-странице: встроенно, внутренне и внешне. html-элемент и стиль отображения могут находиться в разных местах веб-страницы, в разных файлах и на разных сайтах (серверах, адресах). Чтобы связать html-элемент и код нужного стиля – в CSS используют селекторы.

Подключаются или внедряются CSS-стили в документ следующим образом:
CSS-стили указаны в атрибутах отдельного html-элемента, в открывающем теге:
<p>
CSS-стили внутри документа заключаются в элемент <style>, находящийся в теле веб-документа. Место нахождения элемента <style> на поле веб-страницы для браузера не имеет значения. CSS-код отработается браузером в любом случае:
<style type=»text/css»>селектор{правила}</style>
CSS-стили находятся в отдельном внешнем файле, подключаемом к документу посредством элемента <link>, включённом в элемент <head>:
<link rel=»stylesheet» type=»text/css» href=»style.css»>

В html назначаю тегу <section> класс <section>.
В style.css прописываю свойства и значения классу:
section . mainpage {…} — свойства и значения игнорируются (смотрю в последнем Хроме).
Пишу:
section.mainpage {…} (без пробела между тегом и классом) — свойства и значения срабатывают.

Под селектор «section .mainpage» попадает любой элемент с классом mainpage, НАХОДЯЩИЙСЯ ВНУТРИ элемента section. Под селектор «section.mainpage» попадает любой элемент section, которому назначен класс mainpage.

Дело в пробеле. «section .mainpage {}» — Тут под него попадут все элементы с классом ‘mainpage’, которые идут после любого <section>. «section.mainpage» — правила применятся только к <section> , но не к вложенным в него элементам.

Селекторов | WebdriverIO

Протокол WebDriver предоставляет несколько стратегий выбора для запроса элемента. WebdriverIO упрощает их, чтобы упростить выбор элементов. Обратите внимание, что хотя команда для запроса элементов называется $ и $$ , они не имеют ничего общего с jQuery или Sizzle Selector Engine.

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

  

Мы делаем и не рекомендуем следующие селекторы:

900 38
Селектор Рекомендуемый Примечания
$('кнопка') 🚨 Никогда Худшее — тоже общий, без контекста.
$('.btn.btn-large') 🚨 Никогда Плохо. В сочетании со стилем. Сильно подвержен изменениям.
$('#main') ⚠️ Экономно Лучше. Но все же в сочетании со стилями или прослушивателями событий JS.
$(() => document. queryElement('button')) ⚠️ Экономно Эффективные запросы, сложные в написании.
$('кнопка[name="submission"]') ⚠️ Редко В сочетании с атрибутом имени , который имеет семантику HTML.
$('button[data-testid="submit"]') ✅ Хорошо Требуется дополнительный атрибут, не связанный с a11y.
$('aria/Submit') или $('button=Submit') ✅ Всегда Лучший. Напоминает, как пользователь взаимодействует со страницей.

Селектор запросов CSS​

Если не указано иное, WebdriverIO будет запрашивать элементы, используя шаблон селектора CSS, например:

selectors/example.js

 loading... 

View on GitHub

Текст ссылки

To получить якорный элемент с определенным текстом в нем запросите текст, начинающийся со знака равенства ( = ).

Например:

selectors/example.html

 loading... 

Посмотреть на GitHub

Вы можете запросить этот элемент, вызвав:

selectors/example.js

 loading... 

Посмотреть на GitHub

Частичный текст ссылки

Чтобы найти якорный элемент, видимый текст которого частично соответствует вашему поисковому значению, запросите его, используя *= перед строкой запроса (например, *=driver ).

Вы можете запросить элемент из приведенного выше примера, также вызвав:

selectors/example.js

 loading... 

Посмотреть на GitHub

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

 const elem = await $('header h2*=Welcome') // не работает!!! 
// используйте вместо этого
const elem = await $('header'). $('*=driver')

Элемент с определенным текстом

Тот же метод можно применить и к элементам.

Например, вот запрос заголовка 1 уровня с текстом «Добро пожаловать на мою страницу»:

selectors/example.html

 loading... 

Посмотреть на GitHub

Вы можете запросить этот элемент, вызвав:

selectors/example.js

 loading... 
900 02 Посмотреть на GitHub

Или используя частичный текст запроса:

selectors/example.js

 loading... 

Посмотреть на GitHub

То же самое работает для id и class имена:

selectors/example.html

 загрузка. .. 

Посмотреть на GitHub

Вы можете запросить этот элемент, вызвав:

selectors/example.js

 loading... 

Посмотреть на GitHub

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

 const elem = await $('header h2*=Welcome') // не работает!!! 
// вместо этого используйте
const elem = await $('header').$('h2*=Welcome')

Имя тега​

Чтобы запросить элемент с определенным именем тега, используйте или .

selectors/example.html

 loading... 

Посмотреть на GitHub

Вы можете запросить этот элемент, вызвав:

selectors/example.js

 loading... 
90 020

Посмотреть на GitHub

Атрибут имени

Для запроса элементов с определенным атрибутом имени вы можете использовать либо обычный селектор CSS3, либо предложенную стратегию имен из JSONWireProtocol, передав что-то вроде [name="some-name"] в качестве параметра селектора:

selectors/example.html

 loading... 

Посмотреть на GitHub

selectors/example. js

 loading... 

Посмотреть на GitHub

Примечание: Эта стратегия выбора устарела и работает только в старых браузерах, работающих по протоколу JSONWireProtocol или с помощью Appium.

xPath​

Также можно запрашивать элементы через определенный xPath.

Селектор xPath имеет такой формат, как //body/div[6]/div[1]/span[1] .

selectors/xpath.html

 loading... 

Посмотреть на GitHub

Вы можете запросить второй абзац, вызвав:

selectors/example.js

 loading... 
90 020

Посмотреть на GitHub

Вы можете использовать XPath, чтобы также пройти вверх и вниз по дереву DOM:

Selectors/example.js

 Загрузка ... 

Просмотр на GitHub

Селектор имен доступности

Элементы запроса под их доступным именем. Доступное имя — это то, что объявляет программа чтения с экрана, когда этот элемент получает фокус. Значением доступного имени может быть как визуальный контент, так и скрытые текстовые альтернативы.

Получить по

aria-label

selectors/aria.html

 loading... 

Посмотреть на GitHub

selectors/example.js

 загрузка... 

Посмотреть на GitHub

Fetch by

aria-labeledby

selectors/aria.html

 loading... 

View on GitHub

selectors/example.js

 loading... 

Посмотреть на GitHub

Получить по содержание

selectors/aria.html

 loading... 

Посмотреть на GitHub

selectors/example.js

 loading... 

Посмотреть на GitHub

9 0321 Выборка по заголовку

селекторов/ария. html

 loading... 

Посмотреть на GitHub

selectors/example.js

 loading... 

Посмотреть на GitHub

Fetch by

alt свойство

selectors/aria. html

 загрузка... 

Просмотреть на GitHub

selectors/example.js

 loading... 

Просмотреть на GitHub

ARIA — Атрибут роли​

Для запроса элементов на основе Роли ARIA, вы можете напрямую указать роль элемента например [role=button] в качестве параметра селектора:

selectors/aria.html

 loading... 

Посмотреть на GitHub

selectors/example.js

 loading... 

Посмотреть на GitHub

Атрибут ID​

Стратегия локатора "id" не поддерживается в протоколе WebDriver, вместо этого следует использовать стратегии селектора CSS или xPath для поиска элементов, использующих ID.

Однако некоторые драйверы (например, Appium You.i Engine Driver) могут по-прежнему поддерживать этот селектор.

Текущие поддерживаемые синтаксисы селектора для идентификатора:

 //локатор css 
const button = await $('#someid')
//локатор xpath
const button = await $('//*[@id="someid "]')
// ID стратегии
// Примечание: работает только в Appium или подобных фреймворках, которые поддерживают стратегию поиска. "ID"
const button = await $('id=resource-id/iosname')

Функция JS​

Вы также можете использовать функции JavaScript для извлечения элементов с помощью собственных веб-API. Конечно, вы можете сделать это только внутри веб-контекста (например, браузера или веб-контекста на мобильных устройствах).

Учитывая следующую структуру HTML:

selectors/js.html

 loading... 

Посмотреть на GitHub

Вы можете запросить родственный элемент #elem следующим образом:

selectors/example.js

 loading... 

Посмотреть на GitHub

Deep Селекторы​

Многие внешние приложения сильно полагаться на элементы с теневым DOM. Технически невозможно запрашивать элементы в теневой модели DOM без обходных путей. shadow$ и shadow$ были такими обходными путями, у которых были свои ограничения. С помощью глубокого селектора теперь вы можете запрашивать все элементы в любом теневом DOM, используя общую команду запроса.

У нас есть приложение со следующей структурой:

С помощью этого селектора вы можете запросить элемент

И аналогично View Matcher

 const menuItem = await $({ 
"name": "hasEntry",
"args": ["title", "ViewTitle"],
"class": "androidx.test.espresso.matcher.ViewMatchers"
})
await menuItem. click()

Android View Tag (только Espresso)

Стратегия просмотра тегов обеспечивает удобный способ поиска элементов по их тегу.

 const elem = await $('-android viewtag:tag_identifier') 
await elem.click()

iOS UIAutomation​

При автоматизации приложения iOS для поиска элементов можно использовать платформу Apple UI Automation.

Этот JavaScript API имеет методы для доступа к представлению и всему на нем.

 const selector = 'UIATarget.localTarget().frontMostApp().mainWindow().buttons()[0]' 
const button = await $(`ios=${selector}`)
await button.click()

Вы также можете использовать поиск предикатов в iOS UI Automation в Appium, чтобы еще больше уточнить выбор элементов. Подробнее см. здесь.

iOS XCUITest строк предикатов и цепочек классов

В iOS 10 и выше (используя драйвер XCUITest ), вы можете использовать предикатные строки:

 const selector = `type == 'XCUIElementTypeSwitch' && name CONTAINS 'Allow'` 
const switch = await $(`-ios predicate string:${selector}`)
await switch. click()

И цепочки классов:

 const selector = '**/XCUIElementTypeCell[`name BEGINSWITH "D"`]/**/XCUIElementTypeButton' 
const button = await $(`-ios class chain:${selector}`)
await button.click()

Идентификатор доступности

Стратегия локатора идентификатора доступа предназначена для считывания уникального идентификатора элемента пользовательского интерфейса. Преимущество этого заключается в том, что он не меняется во время локализации или любого другого процесса, который может изменить текст. Кроме того, это может помочь в создании кросс-платформенных тестов, если функционально одинаковые элементы имеют одинаковый идентификатор доступа.

  • Для iOS это идентификатор доступности , представленный Apple здесь.
  • Для Android идентификатор доступности сопоставляется с описанием контента для элемента, как описано здесь.

Для обеих платформ получение элемента (или нескольких элементов) по их идентификатору доступности обычно является лучшим методом. Это также предпочтительнее устаревшей стратегии name .

 const elem = await $('~my_accessibility_identifier') 
await elem.click()

Имя класса

Имя класса Стратегия представляет собой строку , представляющий элемент пользовательского интерфейса в текущем представлении.

  • Для iOS это полное имя класса UIAutomation, которое будет начинаться с UIA-, например UIATextField для текстового поля. Полную ссылку можно найти здесь.
  • Для Android это полное имя класса UI Automator, например android.widget.EditText для текстового поля. Полную ссылку можно найти здесь.
  • Для Youi.tv это полное название класса Youi.tv, и оно будет с CYI-, например CYIPushButtonView для элемента кнопки. Полную ссылку можно найти на странице GitHub You.i Engine Driver
 // пример iOS 
await $('UIATextField').click()
// пример Android
await $('android. widget.DatePicker') .click()
// Пример Youi.tv
await $('CYIPushButtonView').click()

Цепные селекторы

нашел правильный элемент. Если вы позвоните элемент перед вашей фактической командой, WebdriverIO запускает запрос из этого элемента.

Например, если у вас есть структура DOM, такая как:

 
















И вы хотите добавить товар B в корзину, это будет сложно сделать только с помощью селектора CSS.

С цепочкой селекторов все намного проще. Просто сузьте нужный элемент шаг за шагом:

 await $('. row .entry:nth-child(2)').$('button*=Add').click() 

Appium Image Selector​

Используя стратегию поиска -image , можно отправить Appium файл изображения, представляющий элемент, к которому вы хотите получить доступ.

Поддерживаемые форматы файлов jpg,png,gif,bmp,svg

Полный справочник можно найти здесь

 const elem = await $('./file/path/of/image/test.jpg') 
await elem.click()

Примечание . Способ работы Appium с этим селектором заключается в том, что он внутри делает снимок экрана (приложения) и использует предоставленный селектор изображений. чтобы проверить, можно ли найти элемент на этом снимке экрана (приложения).

Имейте в виду, что Appium может изменить размер сделанного снимка экрана (приложения), чтобы он соответствовал размеру CSS экрана вашего (приложения) (это произойдет на iPhone, но также и на компьютерах Mac с дисплеем Retina, поскольку DPR больше 1). Это приведет к тому, что совпадение не будет найдено, потому что предоставленный селектор изображений мог быть взят из исходного снимка экрана. Вы можете исправить это, обновив настройки Appium Server, см. документацию Appium. для настроек и этот комментарий с подробным объяснением.

Селекторы React​

WebdriverIO предоставляет способ выбора компонентов React на основе имени компонента. Для этого у вас есть на выбор две команды: react$ и react$$.

Эти команды позволяют выбирать компоненты из React VirtualDOM и возвращать либо один элемент WebdriverIO, либо массив элементов (в зависимости от того, какая функция используется).

Примечание : Команды реагируют $ и реагируют $ $ аналогичны по функционалу, за исключением того, что react$$ вернет все совпадающих экземпляров в виде массива элементов WebdriverIO, а react$ вернет первый найденный экземпляр.

Базовый пример​
 // index.jsx 
import React from 'react'
import ReactDOM from 'react-dom'

function MyComponent() {
return (


MyComponent

)
}

function App() {
return ()
}

ReactDOM.render(, document.querySelector('#root'))

В приведенном выше коде есть простой экземпляр MyComponent внутри приложения, который React отображает внутри HTML элемент с id="root" .

С помощью команды browser.react$ вы можете выбрать экземпляр MyComponent.0003 myCmp переменная, с ней можно выполнять команды элемента.

Фильтрация компонентов

Библиотека, которую WebdriverIO использует внутри, позволяет фильтровать ваш выбор по свойствам и/или состоянию компонента. Для этого вам нужно передать второй аргумент для реквизита и/или третий аргумент для состояния в команду браузера.

 // index.jsx 
импортировать React из 'реакции'
импортировать ReactDOM из 'реагировать-дом'

function MyComponent(props) {
return (


Привет { props.name || 'Мир' }!

)
}

function App() {
return (





)
} 9000 7

РеактДОМ .render(, document.querySelector('#root'))

Если вы хотите выбрать экземпляр MyComponent с именем prop как WebdriverIO , вы можете выполнить команду вот так:

 const myCmp = await browser.react$('MyComponent', { 
props: { name: 'WebdriverIO' }
})

Если вы хотите отфильтровать наш выбор по состоянию, команда browser выглядела бы так примерно так:

 const myCmp = await browser.react$('MyComponent', { 
state: { myState: 'some value' }
})
Работа с
React. Fragment

При использовании 90 003 react$ для выбора фрагментов React, WebdriverIO вернет первый дочерний элемент этого компонента в качестве узла компонента. Если вы используете react$$ , вы получите массив, содержащий все узлы HTML внутри фрагментов, соответствующих селектору.

 // index.jsx 
импортировать React из 'реакции'
импортировать ReactDOM из 'реагировать-дом'

function MyComponent() {
return (


MyComponent


MyComponent


)
}

function App() {
return ()
}

ReactDOM.render(, document.querySelector('#root'))

В приведенном выше примере команды будут работать следующим образом:

 await browser.react$('MyComponent ') // возвращает элемент WebdriverIO для первого 

await browser.react$$('MyComponent') // возвращает элементы WebdriverIO для массива [
,
]

Примечание: Если у вас есть несколько экземпляров MyComponent и вы используете react$$ для выбора этих компонентов фрагмента, вам будет возвращен одномерный массив всех узлов. Другими словами, если у вас есть 3 экземпляра , вам будет возвращен массив с шестью элементами WebdriverIO.

Стратегии настраиваемых селекторов​

Если вашему приложению требуется особый способ извлечения элементов, вы можете сами определить индивидуальную стратегию селекторов, которую можно использовать с custom$ и custom$$ . Для этого зарегистрируйте свою стратегию один раз в начале теста:

 browser.addLocatorStrategy('myCustomStrategy', (селектор, корень) => { 
/**
* область действия должна быть документирована при вызове объекта браузера
* и ` root`, если вызывается для объекта элемента
*/
const scope = root ? барфу