Как найти элемент в коде элемента

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

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

Если кто-то ещё не видел, что из себя представляет код шаблона, то зайдите в Консоль — Внешний вид — Редактор.

Перед Вами откроется код файла style.css. Покрутите его вниз, и первое, что придёт Вам в голову будет: ё-моё, как же в этой массе английских слов, цифр и символов, найти то, что нам будет нужно.

Для полноты ощущения, можно открыть один из php файлов, которые расположены в колонке справа от поля редактора.

Только сразу отгоните мысль типа: «Я в этом до самой смерти не разберусь». Разберётесь, и я Вам в этом помогу.

Рассмотрим два варианта, в зависимости от начальных условий, нахождения нужного элемента в коде.

Вариант 1.

Условие: мы точно знаем то, что нам нужно найти.

Для примера возьмём код страницы.

Комбинация клавиш Contrl-F откроет окно поиска в правом верхнем углу, в которое можно ввести искомый элемент кода. Элемент и все его повторения подсветятся.

Поиск в коде

Этот поиск работает абсолютно для любого кода, открытого в браузере, то есть на странице.

Вариант 2.

Условие: мы видим элемент на странице, но не знаем ни его html, ни css.

В этом случае потребуется web-инспектор, или по другому Инструмент разработчика.

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

Главное не выбирайте «Просмотреть код страницы». Похоже, но не то.

После этого появится web-инспектор. Его интерфейс в разных браузерах немного отличается, но принцип действия везде одинаковый.

Я покажу на примере web-инспектора Chrome.

Заходим на страницу и открываем web-инспектор. По умолчанию он откроется в двух колонках, в левой будет html код всех элементов, находящихся на странице, а в правой — css оформление.

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

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

Определить, какой код, какому элементу соответствует, очень просто.

Надо просто вести по строкам курсором, и как только курсор оказывается на строке с кодом, так тут-же элемент, которому соответствует этот код, подсвечивается.

Теперь найдём css этого элемента. Для этого надо один раз щёлкнуть левой клавишей по строке с html, и в правой колонке отобразятся все стили, которые ему заданы, а так-же стили, влияющие на элемент, от родительских элементов.

Теперь, зная class или id элемента, можно спокойно идти в файл style.css, найти в нём нужный селектор, с помощью Поиска (Ctrl+F), и править внешний вид элемента.

Желаю творческих успехов.

Неужели не осталось вопросов? Спросить


Перемена

— Мам, ну почему ты думаешь, что если я была на дне рождения, то сразу пила?!
— Дочь а нечего что я папа?

Объявление в метро: «при обнаружении подозрительных предметов сделайте подозрительное лицо.

В раздел > > > Исправляем шаблон WordPress. Веб-инспектор

  • Что такое исходный код страницы и зачем его смотреть
  • Как посмотреть код сайта с компьютера
  • Google Chrome
  • Яндекс.Браузер
  • Apple Safari
  • Microsoft Edge
  • Mozilla Firefox
  • Opera
  • Как посмотреть код страницы на телефоне
  • Android
  • iOS
  • Как найти любой элемент в коде
  • Любая страница в интернете — это по сути HTML-код, который по-другому называют «исходный код». 

    В нём можно посмотреть некоторую полезную информацию для SEO. Например, как прописаны теги и метатеги, вроде title, description и Last-Modified, установлены ли счётчики аналитики и многое другое. Посмотреть код можно и с компьютера, и с телефона.

    Покажем, как вызвать код страницы и как найти любой элемент в коде.

    Что такое исходный код страницы и зачем его смотреть

    Код страницы — это структура тегов, в которой зашифрованы все видимые и невидимые элементы контента: тексты, изображения, счётчики, скрипты и т. д.

    HTML-код сайта выглядит так:

    Пример кода страницы сайта

    Пример кода страницы сайта

    Просмотр кода поможет выявить ошибки, найти баги в отображении отдельных элементов или подсмотреть интересные SEO-решения у конкурентов.

    Как посмотреть код сайта с компьютера

    Покажем на примере самых популярных браузеров: Google Chrome, Яндекс.Браузер, Apple Safari, Microsoft Edge, Mozilla Firefox, Opera. Но принцип одинаковый во всех браузерах.  

    Google Chrome

    Чтобы открыть код страницы в браузере, достаточно нажать комбинацию клавиш:

    • на Windows — Ctrl + U;
    • на Mac — Cmd (⌘) + Option (⌥) + U.

    Если не любите горячие клавиши, то можно кликнуть правой кнопкой мыши на странице и в открывшемся меню выбрать пункт «Просмотр кода страницы»:

    Просмотр кода страницы в Google Chrome

    Просмотр кода страницы в Google Chrome

    Откроется новая вкладка с кодом. 

    Можно и по-другому — через меню браузера. Для этого нужно кликнуть на три вертикальные точки в правом верхнем углу окна и перейти в «Дополнительные инструменты» → «Инструменты разработчика».

    Как открыть «Инструменты разработчика» в Google Chrome

    Как открыть «Инструменты разработчика» в Google Chrome

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

    Просмотр кода элементов страницы в Google Chrome

    Как открыть код элемента страницы в Google Chrome

    Более быстрые способы сделать то же самое:

    • с помощью горячих клавиш Ctrl + Shift + I на Windows, Cmd (⌘) + Option (⌥) + I на Mac;
    • правой кнопки мыши, кликнув «Просмотреть код». 

    Яндекс.Браузер

    Первый способ посмотреть код страницы в Яндекс.Браузере — с помощью правой кнопки мыши. В меню нужно выбрать пункт «Посмотреть код страницы». 

    Просмотр кода страницы в Яндекс.Браузере

    Просмотр кода в Яндекс.Браузере

    Второй — через меню браузера. Для этого необходимо кликнуть на три горизонтальные полоски в верхнем правом углу, затем «Дополнительно» → «Дополнительные инструменты» → «Посмотреть код страницы».

    Просмотр кода через меню Яндекс.Браузера

    Просмотр кода через меню Яндекс.Браузера

    В обоих случаях код откроется в отдельной вкладке. Также код можно посмотреть с помощью горячих клавиш Ctrl + U.

    Чтобы открыть код в той же вкладке, что и просматриваемая страница, вместо «Посмотреть код страницы» нужно выбрать пункт «Инструменты разработчика» или нажать Ctrl + Shift + I на Windows, Cmd (⌘) + Option (⌥) + I на Mac, как и в Chrome.

    Apple Safari

    Для просмотра кода в Safari необходимо сначала войти в «Настройки» браузера, кликнув по надписи Safari в верхнем левом углу экрана. 

    Где находятся настройки браузера в Safari

    Где находятся настройки браузера в Safari

    Затем в открывшемся окне выбрать раздел «Дополнительно» и поставить галочку напротив «Показывать меню «Разработка» в строке меню» в нижней части окна:

    Включение меню разработчика в Safari

    Включение меню разработчика в Safari

    После этого в верхнем меню окна появится вкладка «Разработка», в которой для просмотра кода страницы необходимо кликнуть на пункт «Показать программный код страницы»: 

    Как открыть код в Safari

    Как открыть код страницы в браузере Safari

    Код откроется в нижней части страницы:

    Код страницы в Safari

    Код страницы в Safari

    Microsoft Edge

    Просмотреть код в Microsoft Edge можно с помощью правой кнопки мыши → команда «Просмотреть исходный код»: 

    Просмотр кода страницы в Microsoft Edge

    Просмотр кода страницы в Microsoft Edge

    Код откроется в новой вкладке. Можно и с помощью горячих клавиш Ctrl + U.

    Также его можно посмотреть через меню браузера. Для этого нужно в правом верхнем углу кликнуть на три горизонтальные точки и выбрать команду «Другие инструменты» → «Средства разработчика»:

    Инструменты разработчика в Microsoft Edge

    Инструменты разработчика в Microsoft Edge

    Панель откроется снизу или справа на просматриваемой странице. Чтобы увидеть код, нужно выбрать вкладку «Элементы»:

    Исследование кода отдельных элементов в Microsoft Edge

    Исследование кода отдельных элементов в Microsoft Edge

    Горячие клавиши здесь тоже работают: Ctrl + Shift + I на Windows, Cmd (⌘) + Option (⌥) + I на Mac.

    Mozilla Firefox

    Код открывается в отдельной вкладке с помощью правой кнопкой мыши по команде «Исходный код страницы»:

    Просмотр кода в Mozilla Firefox

    Просмотр кода в Mozilla Firefox

    Также открыть исходный код в отдельной вкладке можно через меню браузера. Для этого в правом верхнем углу кликните на три горизонтальные черты и в открывшемся меню выберите команду «Другие инструменты» → «Исходный код страницы»:

    Исходный код в меню Mozilla Firefox

    Исходный код в меню Mozilla Firefox

    А можно и просто нажать горячие клавиши Ctrl + U — это работает во всех браузерах. 

    Инструменты разработчика здесь тоже можно открыть горячими клавишами Ctrl + Shift + I на Windows, Cmd (⌘) + Option (⌥) + I на Mac или кликнув правой кнопкой мыши и выбрав пункт «Исследовать»:

    Как открыть инструменты разработчика в Mozilla Firefox

    Как открыть инструменты разработчика в Mozilla Firefox

    Панель откроется снизу или справа на странице. 

    Opera

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

    Чтобы открыть код, кликните правой кнопкой мыши в любой части страницы и выберите команду «Исходный текст страницы»:

    Просмотр кода страницы в браузере Opera

    Просмотр кода страницы в браузере Opera

    То же самое можно сделать сочетанием клавиш Ctrl + U

    Чтобы открыть инструменты разработчика, в этом же меню можно выбрать «Проверить код элемента» или нажать комбинацию горячих клавиш Ctrl + Shift + I на Windows, Cmd (⌘) + Option (⌥) + I на Mac.

    Как посмотреть код страницы на телефоне

    Способы отличаются в зависимости от операционной системы телефона.

    Android

    Открыть код элемента на телефоне можно с помощью команды view-source, которую необходимо добавить перед URL в адресную строку: 

    view-source:https://site.ru/page-1

    Во вкладке откроется исходный код страницы:

    Просмотр кода страницы с мобильного на Android

    Просмотр кода страницы с мобильного на Android

    Открыть инструменты разработчика подобным способом не получится. Если это необходимо, установите специальные приложения. Например, VT View Source.

    iOS

    На iPhone ни в Safari, ни в Google Chrome по команде «view-source:» код не откроется. Необходимо установить специальные приложения для просмотра кода. Например, HTML Viewer Q или iSource Browser.

    iSource Browser — полноценный браузер для iOS, с помощью которого можно просматривать HTML-код страниц:

    Посмотреть исходный код страницы в айфоне

    Посмотреть код элемента страницы в айфоне

    Как найти любой элемент в коде

    Чтобы найти что угодно в открытом исходном коде, откройте поиск по странице. Обычно это можно сделать сочетанием клавиш Ctrl + F или через меню браузера и команду «Найти…» или «Найти на странице…»:

    Поиск элементов в коде страницы

    Поиск элементов в коде страницы

    В открывшемся окошке введите начало фразы или тег, который хотите найти. Например, viewport:

    Как выглядят найденные элементы

    Как выглядят найденные элементы

    Найденный элемент браузер выделит цветом. 

    Продолжение: На какие элементы в исходном коде обращать внимание SEO-специлисту

    Мы уже пишем другие интересные и полезные статьи для вас. Подписывайтесь на наш Телеграм-канал, чтобы читать новые статьи первыми.

    Подписаться 

    В этой статье мы изучим методы JavaScript для поиска элементов в HTML-документе: querySelector, querySelectorAll, getElementById и другие. Кроме них рассмотрим ещё следующие: matches, contains и closest. Первые два из них могут быть полезны для выполнения различных проверок, а третий использоваться, когда нужно получить родительский элемент по CSS-селектору.

    Методы для выбора HTML-элементов

    Работа с веб-страницей так или иначе связана с манипулированием HTML-элементами. Но перед тем, как над ними выполнить некоторые действия (например, добавить стили), их сначала нужно получить.

    Выбор элементов в основном выполняется с помощью этих методов:

    • querySelector;
    • querySelectorAll.

    Они позволяют выполнить поиск HTML-элементов по CSS-селектору. При этом querySelector выбирает один элемент, а querySelectorAll – все.

    Кроме них имеются ещё:

    • getElementById;
    • getElementsByClassName;
    • getElementsByTagName;
    • getElementsByName.

    Но они сейчас применяются довольно редко. В основном используется либо querySelector, либо querySelectorAll.

    querySelectorAll

    Метод querySelectorAll применяется для выбора всех HTML-элементов, подходящих под указанный CSS-селектор. Он позволяет искать элементы как по всей странице, так и внутри определённого элемента:

    // выберем элементы по классу item во всем документе
    const items = document.querySelectorAll('.item');
    // выберем .btn внутри #slider
    const buttons = document.querySelector('#slider').querySelectorAll('.btn');

    Здесь на первой строчке мы нашли все элементы с классом item. На следующей строчке мы сначала выбрали элемент с id="slider", а затем в нём все HTML-элементы с классом btn.

    Метод querySelectorAll как вы уже догадались принимает в качестве аргумента CSS-селектор в формате строки, который соответственно и определяет искомые элементы. В качестве результата querySelectorAll возвращает объект класса NodeList. Он содержит все найденные элементы:

    Выбор HTML-элементов с помощью метода querySelectorAll в JavaScript

    Полученный набор представляет собой статическую коллекцию HTML-элементов. Статической она называется потому, что она не изменяется. Например, вы удалили элемент из HTML-документа, а в ней как был этот элемент, так он и остался. Чтобы обновить набор, querySelectorAll нужно вызвать заново:

    Статический набор HTML-элементов, выбранный с помощью querySelectorAll в JavaScript

    Узнать количество найденных элементов можно с помощью свойства length:

    // выберем элементы с атрибутом type="submit"
    const submits = document.querySelectorAll('[type="submit"]');
    // получим количество найденных элементов
    const countSubmits = submits.length;

    Обращение к определённому HTML-элементу коллекции выполняется также как к элементу массива, то есть по индексу. Индексы начинаются с 0:

    // получим первый элемент
    const elFirst = submits[0];
    // получим второй элемент
    const elSecond = submits[1];

    Здесь в качестве результата мы получаем HTML-элемент или undefined, если элемента с таким индексом в наборе NodeList нет.

    Перебор коллекции HTML-элементов

    Перебор NodeList обычно осуществляется с помощью forEach:

    // получим все <p> на странице
    const elsP = document.querySelectorAll('p');
    // переберём выбранные элементы
    elsP.forEach((el) => {
      // установим каждому элементу background-color="yellow"
      el.style.backgroundColor = 'yellow';
    });

    Также перебрать набор выбранных элементов можно с помощью цикла for или for...of:

    // получим все элементы p на странице
    const elsP = document.querySelectorAll('p');
    // for
    for (let i = 0, length = elsP.length; i < length; i++) {
      elsP[i].style.backgroundColor = 'yellow';
    }
    // for...of
    for (let el of elsP) {
      el.style.backgroundColor = 'yellow';
    }

    querySelector

    Метод querySelector также как и querySelectorAll выполняет поиск по CSS-селектору. Но в отличие от него, он ищет только один HTML-элемент:

    // ищем #title во всём документе
    const elTitle = document.querySelector('#title');
    // ищем footer в <body>
    const elFooter = document.body.querySelector('footer');

    На первой строчке мы выбираем HTML-элемент, имеющий в качестве id значение title. На второй мы ищем в <body> HTML-элемент по тегу footer.

    В качестве результата этот метод возвращает найденный HTML-элемент или null, если он не был найден.

    querySelector всегда возвращает один HTML-элемент, даже если под указанный CSS-селектор подходят несколько:

    <ul id="list">
      <li>First</li>
      <li>Second</li>
      <li>Third</li>
    </ul>
    <script>
      // выберем <li>, расположенный в #list
      const elFirst = document.querySelector('#list > li');
      elFirst.style.backgroundColor = 'yellow';
    </script>

    Задачу, которую решает querySelector можно выполнить через querySelectorAll:

    const elFirst = document.querySelectorAll('#list > li')[0];

    Но querySelector в отличие от querySelectorAll делает это намного быстрее, да и писать так проще. То есть querySelectorAll не возвращает как querySelector сразу же первый найденный элемент. Он сначала ищет все элементы, и только после того, как он это сделает, мы можем уже обратиться к первому HTML-элементу в этой коллекции.

    Обычно перед тем, как выполнить какие-то действия с найденным HTML-элементом необходимо сначала проверить, а действительно ли он был найден:

    const elModal = document.querySelector('.modal');
    // если элемент .modal найден, то ...
    if (elModal) {
      // переключим у elModal класс show
      elModal.classList.toggle('show');
    }

    Здесь мы сначала проверили существования HTML-элемента, и только потом выполнили над ним некоторые действия.

    Методы getElement(s)By* для выбора HTML-элементов

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

    • getElementById – получает один элемент по id;
    • getElementsByClassName – позволяет найти все элементы с указанным классом или классами;
    • getElementsByTagName – выбирает элементы по тегу;
    • getElementsByName – получает все элементы с указанным значением атрибута name.

    1. Метод getElementById позволяет найти HTML-элемент на странице по значению id:

    <div id="comments">...</div>
    ...
    <script>
      // получим HTMLElement и сохраним его в переменную elComments
      const elComments = document.getElementById('comments');
    </script>

    В качестве результата getElementById возвращает объект класса HTMLElement или значение null, если элемент не был найден. Этот метод имеется только у объекта document.

    Указывать значение id необходимо с учётом регистра. Так например, document.getElementById('aside') и document.getElementById('ASIDE') ищут элементы с разным id.

    Обратите внимание, что в соответствии со стандартом в документе не может быть несколько тегов с одинаковым id, так как значение идентификатора на странице должно быть уникальным.

    Тем не менее, если вы допустили ошибку и в документе существуют несколько элементов с одинаковым id, то метод getElementById более вероятно вернёт первый элемент, который он встретит в DOM. Но на это полагаться нельзя, так как такое поведение не прописано в стандарте.

    То, что делает getElementById можно очень просто решить посредством querySelector:

    // получим элемент #title
    const elTitle = document.getElementById('title');
    // получим элемента #title, используя querySelector
    const elTitleSame = document.querySelector('#nav');

    Кстати, оба этих метода возвращают в качестве результата один и тот же результат. Это либо HTML-элемент (экземпляр класса HTMLElement) или null, если элемент не найден.

    2. Метод getElementsByClassName позволяет найти все элементы с заданным классом или классами. Его можно применить для поиска элементов как во всём документе, так и внутри указанного. В первом случае его нужно будет вызывать как метод объекта document, а во втором – как метод соответствующего HTML-элемента:

    // найдем элементы с классом control в документе
    const elsControl = document.getElementsByClassName('control');
    // выберем элементы внутри другого элемента, в данном случае внутри формы с id="myform"
    const elsFormControl = document.forms.myform.getElementsByClassName('form-control');

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

    Здесь мы сохранили найденные элементы в переменные elsControl и elsFormControl. В первой переменной будет находиться HTMLCollection, содержащая элементы с классом control. Во второй – набор элементов с классом form-control, находящиеся в форме с id="myform". Для получения этой формы мы использовали document.forms.myform.

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

    // выберем элементы .btn.btn-danger
    const elsBtn = document.getElementsByClassName('btn btn-danger');

    На querySelectorAll этот пример решается так:

    const elsBtn = document.querySelectorAll('.btn.btn-danger');

    3. Метод getElementsByTagName предназначен для получения коллекции элементов по имени тега:

    // найдем все <a> в документе
    const anchors = document.getElementsByTagName('a');
    // найдем все >li> внутри #list
    const elsLi = document.getElementById('list').getElementsByTagName('li');

    На первой строчке мы выбрали все <a> в документе и присвоили полученную HTMLCollection переменной anchors. На второй – мы сначала получили #list, а затем в нём нашли все <li>.

    Задачу по выбору элементов внутри другого элемента с помощью querySelectorAll выполняется намного проще:

    const elsLi = document.querySelectorAll('#list li');

    Для выбора всех элементов можно использовать символ *:

    // выберем все элементы в <body>
    const els = document.body.getElementsByTagName('*');

    4. В JavaScript getElementsByName можно использовать для выбора элементов, имеющих определенное значение атрибута name:

    // получим все элементы с name="phone"
    const elsPhone = document.getElementsByName('phone');

    Через querySelectorAll это выполняется так:

    const elsPhone = document.querySelectorAll('[name="phone"]');

    getElementsBy* и живые HTML-коллекции

    В JavaScript getElementsByTagName, getElementsByClassName и getElementsByName в отличие от других методов (например, querySelectorAll) возвращают живую коллекцию HTML-элементов (на английском live HTMLCollection). То есть коллекцию содержимое которой автоматически обновляется при изменении DOM. Для наглядности рассмотрим следующий пример.

    Например, на странице изначально имеется два <li>. Выберем их с помощью getElementsByTagName и сохраним полученную HTMLCollection в переменную els. Теперь с помощью els мы можем получить эту коллекцию. Сейчас в ней два <li>. Затем через 5 секунд, используя setTimeout добавим ещё один <li>. Если сейчас мы обратимся к переменной els, то увидим, что в ней уже находятся три <li>:

    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
    
    <script>
    // получим живую коллекцию <li>
    const els = document.getElementsByTagName('li');
    // выведем количество <li> в консоль
    console.log(`Количество <li>: ${els.length}`); // 2
    // через 5 секунд добавим ещё один <li>
    setTimeout(() => {
      // вставим на страницу новый <li>
      document.querySelector('ul').insertAdjacentHTML('beforeend', '<li>Three</li>');
    // выведем количество <li> в консоль
      console.log(`Количество <li>: ${els.length}`); // 3
    }, 5000);
    </script>

    Живая коллекция элементов, полученная с помощью getElementsByTagName, обновляется при изменении DOM

    Как вы видите, здесь полученная коллекция является живой, то есть она может автоматически измениться. В ней сначала было два <li>. Но после того, как мы на страницу добавили ещё один подходящий элемент, в ней их стало уже три.

    Если в коде приведённом выше заменить выбор элементов на querySelectorAll, то мы увидим, что в ней находится статическая (не живая) коллекция элементов:

    // получим статическую коллекцию
    const els = document.querySelectorAll('li'); <li>

    Статическая коллекция элементов, полученная с помощью querySelectorAll, не обновляется при изменении DOM

    Как вы видите количество элементов в коллекции не изменилось. Чтобы после изменения DOM получить актуальную коллекцию элементов, их нужно просто выбрать заново посредством querySelectorAll:

    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
    
    <script>
    // получим статическую коллекцию <li>
    let els = document.querySelectorAll('li');
    // выведем количество <li> в консоль
    console.log(`Количество <li>: ${els.length}`); // 2
    // через 5 секунд добавим ещё один <li>
    setTimeout(() => {
      // вставим на страницу новый <li>
      document.querySelector('ul').insertAdjacentHTML('beforeend', '<li>Three</li>');
      // получим заново статическую коллекцию <li>
      els = document.querySelectorAll('li');
      // выведем количество <li> в консоль
      console.log(`Количество <li>: ${els.length}`); // 3
    }, 5000);
    </script>

    Таким образом в JavaScript насчитывается 6 основных методов для выбора HTML-элементов на странице. По чему они ищут и что они возвращают приведено на следующем рисунке:

    Методы JavaScript для выбора HTML-элементов на странице, приведены сведения по признаку на основании которого они ищут и тому что возвращают в качестве результата

    Экземпляры класса HTMLCollection не имеют в прототипе метод forEach. Поэтому если вы хотите использовать этот метод для перебора такой коллекции, её необходимо преобразовать в массив:

    const items = document.getElementsByClassName('item');
    [...items].forEach((el) => {
      console.log(el);
    });

    matches, closest и contains

    В JavaScript имеются очень полезные методы:

    • matches – позволяет проверить соответствует ли HTML-элемент указанному CSS-селектору;
    • closest – позволяет найти для HTML-элемента его ближайшего предка, подходящего под указанный CSS-селектор (поиск начинается с самого элемента);
    • contains – позволяет проверить содержит ли данный узел другой в качестве потомка (проверка начинается с самого этого узла).

    1. Метод matches ничего не выбирает, но он является очень полезным, так как позволяет проверить HTML-элемент на соответствие CSS-селектору. Он возвращает true, если элемент ему соответствует, иначе false.

    // выберем HTML элемент, имеющий атрибут data-target="slider"
    const elSlider = document.querySelector('[data-target="slider"]');
    // проверим соответствует ли он CSS селектору 'div'
    const result = element.matches('div');

    Пример, в котором выберем все <li>, расположенные внутри #questions, а затем удалим те из них, которые соответствуют селектору .answered:

    // выберем все <li> в #questions
    const els = document.querySelectorAll('#questions > li');
    // переберём выбранные элементы
    els.forEach((el) => {
      // если элемент соответствует селектору .answered, то ...
      if (el.matches('.answered')) {
        // удалим элемент
        el.remove();
      }
    });

    В этом примере проверим каждый <li> на соответствие селектору active. Выведем в консоль каждый такой элемент:

    <ul>
      <li>One</li>
      <li class="active">Two</li>
      <li>Three</li>
    </ul>
    
    <script>
      document.querySelectorAll('li').forEach((el) => {
        if (el.matches('.active')) {
          console.log(el);
        }
      });
      // li.active
    </script>

    Ранее, в «старых» браузерах данный метод имел название matchesSelector, а также поддерживался с использованием префиксов. Если вам нужна поддержка таких браузеров, то можно использовать следующий полифилл:

    if (!Element.prototype.matches) {
      Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector;
    }

    2. Метод closest очень часто используется в коде. Он позволяет найти ближайшего предка, подходящего под указанный CSS-селектор. При этом поиск начинается с самого элемента, для которого данный метод вызывается. Если этот элемент будет ему соответствовать, то closest вернёт его.

    <div class="level-1">
      <div class="level-2">
        <div class="level-3"></div>
      </div>
    </div>
    
    <script>
      const el = document.querySelector('.level-3');
      const elAncestor = el.closest('.level-1');
      console.log(elAncestor);
    </script>

    Здесь мы сначала выбираем HTML-элемент .level-3 и присваиваем его переменной el. Далее мы пытаемся среди предков этого элемента включая его сам найти такой, который отвечает заданному CSS-селектору, в данном случае .level-1.

    Начинается поиск всегда с самого этого элемента. В данном случае он не подходит под указанный селектор. Следовательно, этот метод переходит к его родителю. Он тоже не отвечает этому CSS-селектору. Значит, closest переходит дальше, то есть уже к его родителю. Этот элемент подходит под указанный селектор. Поэтому поиск прекращается и этот метод возвращает его в качестве результата.

    Метод closest возвращает null, когда он дошёл бы конца иерархии и не нашёл элемент отвечающий указанному селектору. То есть, если такого элемента нет среди предков.

    В этом примере найдем с помощью closest для .active его ближайшего родителя, отвечающего CSS-селектору #list > li:

    <ul id="list">
      <li>One</li>
      <li>
        Two
        <ul>
          <li>Four</li>
          <li class="active">Five</li>
        </ul>
      </li>
      <li>Three</li>
    </ul>
    <script>
      const elActive = document.querySelector('.active');
      const elClosest = elActive.closest('#list > li');
      elClosest.style.backgroundColor = 'yellow';
    </script>

    В JavaScript closest очень часто используется в обработчиках событий. Это связано с тем, чтобы события всплывают и нам нужно, например, узнать кликнул ли пользователь в рамках какого-то элемента:

    document.addEventListener('click', (e) => {
      if (e.closest.matches('.btn__action')) {
        // пользователь кликнул внутри .btn__action
      }
    });

    3. Метод contains позволяет проверить содержит ли некоторый узел другой в качестве потомка. При этом проверка начинается с самого этого узла, для которого этот метод вызывается. Если узел соответствует тому для которого мы вызываем данный метод или является его потомком, то contains в качестве результата возвращает логическое значение true. В противном случае false:

    <div id="div-1">
      <div id="div-2">
        <div id="div-3">...</div>
      </div>
    </div>
    <div id="div-4">...</div>
    
    <script>
      const elDiv1 = document.querySelector('#div-1');
      elDiv1.contains(elDiv1); // true
      const elDiv3 = document.querySelector('#div-3');
      elDiv1.contains(elDiv3); // true
      const elDiv4 = document.querySelector('#div-4');
      elDiv1.contains(elDiv4); // false
    </script>

    Здесь выражение elDiv1.contains(elDiv1) возвращает true, так как проверка начинается с самого элемента. Это выражение elDiv1.contains(elDiv3) тоже возвращает true, так как elDiv3 находится внутри elDiv1. А вот elDiv1.contains(elDiv4) в качестве результата возвращает false, так как elDiv4 не находится внутри elDiv1.

    В этом примере проверим с помощью contains содержит ли <p> другие узлы в качестве потомка:

    <h1>Tag b</h1>
    <p>This is <b>tag b</b>.</p>
    
    <script>
      const elP = document.querySelector('p');
      const elB = document.querySelector('b');
      const textNode = elB.firstChild;
      const elH1 = document.querySelector('h1');
      elP.contains(elP); // true
      elP.contains(elB); // true
      elP.contains(elH1); // false
      elP.contains(textNode); // true
    </script>

    Метод contains позволяет проверить является ли потомком не только узел-элемент, но и любой другой узел. Например, узнаем является ли потомком elDiv1 указанный текстовый узел:

    const elDiv1 = document.querySelector('#div-1');
    const textNode = document.querySelector('#div-3').firstChild;
    elDiv1.contains(textNode); // true

    Задачи

    1. Узнать количество элементов с атрибутом data-toggle="modal" на странице:

    const count = document.querySelectorAll('[data-toggle="modal"]').length;
    console.log(count);

    2. Найти все элементы <a> с классом nav внутри элемента <ul> :

    const anchors = document.querySelectorAll('ul.nav a');

    3. Получить элемент по id, значение которого равно pagetitle:

    var pagetitle = document.querySelector('#pagetitle');

    4. Выполнить поиск элемента по классу nav:

    var el = document.querySelector('.nav');

    5. Найти элемент <h3>, находящийся в теге <div> с классом comments, который в свою очередь расположен в <main>:

    var header = document.querySelector('main div.comments h3');

    6. Имеется страница. В ней следует выбрать:

    • последний элемент с классом article, расположенный в <main> (решение);
    • все элементы .section, находящиеся в .aside кроме 2 второго (решение);
    • элемент <nav> расположенный после <header> (решение).

    Содержание

    • Если вы работаете на десктопе
    • Как открыть код конкретного элемента страницы
    • Если хотите просмотреть исходный код страницы сайта через смартфон?

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

    Если вы работаете на десктопе

    Просмотреть исходный код страницы можно через любой браузер — эта опция есть у каждого из них. Используйте следующие способы.

    Google Chrome

    Собираетесь открыть код страницы через браузер Google Chrome? Вот 4 варианта, как это сделать:

    Находясь на нужной странице, зажмите одновременно Ctrl и U. Для ОС macOS действует другая комбинация. А именно COMMAND+OPTION+U. После того, как вы примените подходящее сочетание горячих клавиш, появится новая вкладка с HTML.Как видите, у источника цветная кодировка и четкая структура, что упрощает поиск нужных элементов. Чтобы найти требующееся значение ещё быстрее, можете задействовать клавиши Crtl+F. Обнаруженный фрагмент будет выделен ярким цветом.

    1Скриншот

    Второй способ просмотреть код страницы — через вызов контекстного меню. Достаточно нажать на правую кнопку мыши, и вы откроете контекстное меню, где вам нужно будет выбрать строку «Просмотр кода страницы».

    4Crhbyijn

    Открыть исходный код страницы, можно забив в адресную строку «view-source:», а потом УРЛ самой страницы.

    1561456

    Требуется изучить код страницы более детально? Задействуйте инструменты разработчика Google Chrome.

    • Для начала войдите в основное меню браузера. Для этого справа вверху найдите иконку, на которой изображены три вертикально расположенные точки.
    • Затем выберите раздел «Дополнительные инструменты».
    • Отобразится подменю, в котором находится требующийся вам пункт — «Инструменты разработчика».

    3Crhbyijn

    Этот же путь можно проделать просто нажав на клавиши быстрого доступа Ctrl+Shift+I. Если вы пользуетесь macOS, зажимайте COMMAND+OPTION+I.

    Mozilla Firefox

    1. Один из способов открыть исходный код страницы в Mozilla Firefox — вызвать контекстное меню, в котором содержится строчка «Исходный код страницы». Как и в случае с Google Ghrome, страница с кодом появится в отдельной вкладке.
    2. 5Скриншот

    3. Можно применить и комбинацию клавиш Ctrl+U.
    4. Также вы можете действовать через основное меню. У браузера Mozilla Firefox оно представлено тремя вертикальными полосками в правом верхнем углу страницы. Раскрываем список, выбираем «Другие инструменты», а затем — «Исходный код страницы».
    5. 6Crhbyijn

    6. Подойдет и метод прописывания в адресной строке «view-source:»+ УРЛа интересующей страницы.
    7. 7Crhbyijn

    Opera

    1. Чтобы посмотреть исходный код страницы в этом браузере, вы также можете зажать Ctrl+U.
    2. Или указать перед УРЛом страницы «view-source:».
    3. Держа курсор в любом месте страницы, нажмите на правую кнопку мыши. В возникшем окне выберите строчку «Исходный код страницы».
    4. 8Скриншот

    5. Раскройте главное меню Opera (нажмите на значок браузера — он находится в самом верху, слева), выберите пункт «Разработка», а потом подпункт «Исходный текст страницы».
    6. 9Скриншотjpg

    Как открыть код конкретного элемента страницы

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

    Единственное «но» — определять местоположение нужного фрагмента приходится в ручном режиме. Поэтому крайне полезным оказывается специальный элемент, который мы предлагаем вам рассмотреть ниже.

    Как открыть код элемента в Google Chrome

    Для начала открываем панель с кодом страницы при помощи комбинации клавиш Ctrl+Shift+I. Консоль автоматически появится в правой части экрана. Если вам неудобен такой вариант, вы можете изменить положение панели.

    10Скриншот

    Для этого открываем меню панели и в разделе «Dock Side» выбираем, где будет находиться консоль (можно даже открыть её в отдельном окне).

    Нас интересует первая вкладка «Elements», где и отображается код страницы. Код представлен в удобном виде — каждый элемент при необходимости раскрывается. Это позволяет оценить иерархию.

    Представим, что мы оставили консоль на её первоначальном месте. Тогда CSS-код выбранного элемента будет отображаться под основной частью.

    11Скриншот

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

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

    12Скриншот

    Если хотите просмотреть исходный код страницы сайта через смартфон?

    Важное отличие мобильных версий браузеров от десктопных — более бедный функционал. Например, на компьютере вы можете использовать инспекторов кода. Для смартфонов эта опция не реализована. Но изучить исходный код страницы всё же можно.

    1. Пропишите перед УРЛом параметр «view-source:». Этот способ мы уже опробовали при работе с исходным кодом через десктопную версию браузеров.
    2. Вооружитесь специальными приложениями. Например, если у вас Android, вы можете задействовать приложение VT View Source. Запуская его, укажите ссылку на ту страницу, код которой хотите посмотреть. Приложение способно выполнять поиск по коду, проверку валидности, копирование фрагментов, сохранение кода в отдельный документ и пр. Важный нюанс — приложение англоязычное.

    Специальные приложения разработаны, конечно, и для iOS. Например, Web Inspector, View Source, просмоторщик HTML и другие. Достаточно указать в AppStore название одного из этих приложений, и на экране появится целый список схожих по функционалу инструментов.

    5545646464646

    Ещё больше интересных и полезных статей ищите в новостном разделе на сайте Студии ЯЛ. Там мы регулярно публикуем материалы на разные темы: разработка сайтов, поисковое продвижение, контекстная реклама, SMM, SERM и др.

    Fm1LxP5s8vs

    Наталья Щукина

    Специалист отдела контент-маркетинга Студии ЯЛ


    Другие материалы на тему:

    • Как битые ссылки вредят SEO-продвижению и что сделать, чтобы минимизировать этот ущерб
    • Зачем нужны поддомены и в чём заключаются особенности их продвижения?
    • Как создать идеальный чекаут в интернет-магазине

    Привет! Меня зовут Иван, я руковожу горизонталью автоматизации тестирования в Skyeng. Часть моей работы — обучать ручных тестировщиков ремеслу автоматизации. И тема с поиском локаторов, по моему опыту, самая тяжкая для изучения. Здесь куча нюансов, которые надо учитывать. Но стоит разобраться, и локаторы начинают бросаться в глаза сами. Хороший автоматизатор должен идеально уметь находить читабельные и краткие локаторы на странице. Об этом и пойдет речь ниже.

    Наливаем чай-кофе и погнали!

    Что такое локатор

    Локатор — обычный текст, которой идентифицирует себя как элемент DOM’а страницы. Простым языком: с помощью локатора на странице можно найти элементы. В случае CSS — локатор включает в себя набор уникальных атрибутов элемента, а в случае XPath — это путь по DOM’у к элементу. 

    Если вы изучали CSS ранее, то в конструкции ниже p будет являться локатором элемента, также и атрибут color: red может являться его локатором. Атрибут элемента это всё, что идёт после тега. Например, в теге <p class=”element” id=”value”> атрибутами являются class и id.

    p: {
     color: red;
    }

    Сразу оговорка по терминологии, локатор = селектор.

    Локатор — это название селектора на русском. Иногда встречаю в интернете, что селектор относится только к CSS, но это не совсем так. XPath-локатор тоже может быть, просто означает он путь к элементу в DOM’е. Давайте похоливарим в комментах, чем же всё-таки локатор отличается от селектора  ;)

    DOM страницы — это HTML-код, написанный человеком или сгенерированный фреймворком, который преобразуется браузером в DOM. То есть набор объектов, где каждый объект — это HTML-тег.

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

    • имя элемента

    • id

    • классы

    • кастомные атрибуты

    • родители и дети элементов

    • ссылки

    • и так далее.

    Полное строение элемента

    Элемент состоит из имени, то есть самого HTML-тега. Например, div, span, input, button и другие. Внутри него перечислены атрибуты, которые отвечают за все возможные свойства элемента. Например, цвет, размер, действие, которое будет происходить по клику на элемент.

    У элемента может быть родитель и ребёнок. Родитель может быть один, а детей может быть несколько. Если детей несколько, то они являются соседями и каждый из них образует свою ось. 1 ребёнок = 1 ось со своими особенностями и своими вложенными элементами. А — родитель, B D E F W X Y — дети A. У каждого элемента есть свои дети, свои дальнейшие ветки, это и называется оси.

    Поиск локаторов в браузере

    Для поиска элементов в DOM’е страницы нужны средства разработчиков в браузере. Рассмотрим их на примере Chrome. Они же называются DevTools (F12). Нас интересует вкладка Elements, именно там находятся все элементы. Чтобы найти локатор в поле Elements, нужно нажать Ctrl+F. Внизу появится небольшое поле поиска, с ним мы будем работать всё время.

    Давайте попробуем найти элемент по названию HTML-тега. Искать просто: в строке поиска вводим название тега. Скорее всего этот локатор элемента будет не уникальным и по его значению найдутся много элементов. Для тестов важно, чтобы был только один элемент для взаимодействия. Если одному локатору будут соответствовать несколько элементов, то тест или будет взаимодействовать с первым из них, или просто упадёт с ошибкой. Элементы можно искать не только с помощью тегов (p, span, div и т.д.), но и с помощью атрибутов тега. Например, color=”red” и class=”button”. Подробнее об этом чуть ниже.

    Мы пытаемся найти элемент по тегу button, нам вернулось 269 результатов.

    Мы пытаемся найти элемент по тегу button, нам вернулось 269 результатов.

    Микро-задание: попробуй открыть DevTools на этой страничке (F12) и найти (Ctrl + F) количество элементов с тегом button. 

    P.S. поздравляю, ты уже написал свой первый локатор! Дальше — больше :)

    Уникальные локаторы

    Где будем практиковаться? https://eu.battle.net/login/ru/ — простая и понятная форма авторизации.

    Рассмотрим поиск на примере формы авторизации и регистрации. В коде страницы есть 2 поля («Почта» и «Пароль») и кнопка «Авторизация». Сравним, по каким атрибутам можно найти локатор и определим уникальные атрибуты.

    Подробно разберём, как можно найти локатор поля Почта:

    Остальные не приложил, потому что значения атрибутов или слишком длинные, или не несут какого-то смысла.

    Остальные не приложил, потому что значения атрибутов или слишком длинные, или не несут какого-то смысла.

    Разберём, как можно найти локатор поля Пароль:

    Больше примеров не добавлял — аналогично с предыдущим: другие значения атрибутов слишком длинные.

    Больше примеров не добавлял — аналогично с предыдущим: другие значения атрибутов слишком длинные.

    Разберём, как можно найти локатор поля Авторизация:

    Начнём с разбора не уникальных локаторов. Если по локатору находятся 2 и более элементов на HTML-странице, такой локатор можно назвать неуникальным. Тест при обнаружении большого количества элементов по данному локатору упадёт или возьмёт первый. Ненадежно, точно не наш бро.

    Уникальный, но non-suitable локатор. Если мы в DevTools введем вышеуказанные названия, то найдется элемент. И здесь мы опускаемся до следующего уровня написания локаторов — уровня понятности, читаемости и надёжности локатора.

    • title=»Электронная почта или телефон» — считается плохим паттерном писать локаторы с русским текстом. Тем более в примере текст в title еще и длинный, это визуально громоздко. На текст завязываться можно в крайнем случае, но нужно быть готовым к тому, что тексты часто меняются, любая правка может сломать автотесты.

    • title=»Пароль» — аналогично ^

    • type=»text» — представь, ты открываешь среду разработки и видишь локатор “тип=текст”. Совсем не ясно, к какому элементу относится локатор. Со смысловой точки зрения, это неудачный локатор, потому что он не передаёт смысл локатора.

    • type=»password» — этот атрибут говорит о том, что у поля тип «password» и все символы, которые мы вводим заменяются на звёздочки/точки. При добавлении еще одного поля с type=”password” (например, поле «Подтвердите пароль») локатор сразу станет неактуальным. Стараемся думать наперёд.

    Уникальные локаторы. Они найдут только один элемент, они осмысленные, иногда читабельные и краткие. Как раз уникальные атрибуты — это class, id, name и подобные. Они точно наши бро!

    Небольшой итог

    Хороший локатор — краткий, читабельный и осмысленный. Например, у поля «Пароль» хорошо иметь в локаторе слово password.

    Возникает вопрос, почему class=»btn-block btn btn-primary submit-button btn-block» был вынесен в категорию уникальных? Такие локаторы встречаются повсеместно, и именно их мы берём за основу и приводим к красивому виду.

    Поиск элементов с помощью CSS

    id и class — самые важные атрибуты, с помощью которых мы будем искать бóльшую часть элементов на странице. Есть очень много тонкостей по работе с ними, постараемся рассмотреть все из них. 

    Кнопка «Авторизация» имеет несколько классов в одном:

    • btn-block

    • btn

    • btn-primary

    • submit-button

    • btn-block

    Каждый из этих классов определяет свой визуал кнопки. Например, btn-primary определяет цвет кнопки, submit-button увеличивает её размер (это лишь догадки, основное значение знают только Blizzard). Несколько классов внутри атрибута class разделяются пробелом.

    Наличие более одного класса внутри атрибута говорит о том, что он комбинированный. Бывают и комбинированные атрибуты кроме классов. Но классы необязательно будут уникальны для одного элемента. В данном случае у кнопки «Авторизация» такие атрибуты: 

    class="btn-block btn btn-primary submit-button btn-block"

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

    class="btn-block btn btn-primary registration-button btn-block"

    Сразу заметно, что отличается всего лишь один класс — submit-button сменился на registration-button. Остальные свойства могут иметь и другие кнопки.

    Читабельность локатора

    Допустим, мы ищем элемент по полному классу. Это хороший и действенный способ. Почти всегда элемент будет уникальным, но очень нечитабельным и громоздким, как в случае с кнопкой «Авторизация».

    class с помощью CSS можно записать следующим образом:

    • .locator (точка — сокращенная запись class’а)

    • или выделяем название и значение класса в квадратные скобочки: [class=”value”]

    Полный класс элемента кнопки «Авторизация» состоит из 5 классов: btn-block btn btn-primary submit-button btn-block, а выглядеть полный локатор будет так:

    [class=”btn-block btn btn-primary submit-button btn-block”]

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

    btn-block.btn.btn-primary.submit-button.btn-block 

    Да, стало короче, но всё равно есть смысловая перегрузка. Сокращаем дальше.

    Отдельно здесь стоит добавить про поиск по подстроке. Запись [class=”локатор”] ищет только всю строку класса элемента. Если мы напишем [class=”btn-block”] или любой другой класс, то кнопка «Авторизация» не будет найдена. Но если мы запишем локатор полностью [class=”btn-block btn btn-primary submit-button btn-block”], то кнопка найдётся.

    Из данной ситуации помогает найти выход символ звёздочки. Он ищет ПОДстроку в строке, то есть часть локатора может найти элемент.

    Краткость локатора

    Про подстроку

    Можно почитать на википедии, там приведён доступный пример для общего понимания поиска по подстроке. Также поиск по подстроке можно сравнить с методом includes из JS

    Локатор кнопки«Авторизация» [class=”btn-block btn btn-primary submit-button btn-block”] можно записать следующим образом:

    • [class*=”btn-block”]

    • [class*=”submit-button”]

    • [class*=”btn-block btn”]

    • [class*=”btn btn-primary”]

    • [class*=”primary submit”] (конец одного класса и начала другого, но только в том случае, если они написаны подряд, друг за другом)

    • можно даже сократить название подкласса: не длинное submit-button, а просто submit, например, [class*=”submit”]. Можно даже сократить слово submit — [class*=”sub”].

    Важно понимать, это будет работать, если классы идут только последовательно. Если мы укажем [class*=”btn-block submit-button”], то локатор работать не будет, потому что между btn-block и submit-button идут несколько классов: btn и btn-primary. Но это можно обойти, разделив локатор на 2 разных. Например, 2 класса слитно — [class*=”btn-block”][class*=”submit-button”]. Это работает и часто пригождается, когда нужно уточнить, в каком именно элементе мы ищем определенный класс.

    Также можно комбинировать краткую запись с помощью точки и тега элемента:

    • .submit-button = [class*=”submit-button”]

    • .btn = [class*=”btn”]

    • .btn-block = [class*=”btn-block”]

    • button[class*=”submit-button”] = button.submit-button

    • button[class*=”btn”] = button.btn

    • button[class*=”btn”][class*=“submit-button”] = button.btn.submit-button

    • button[class*=”submit”]

    Краткую запись (через точку) предпочтительнее использовать, чем полную (в квадратных скобках). 

    Лаконичность локатора

    Мы можем определить кнопку «Авторизация» по классу submit-button. Это не самый лаконичный локатор, но дословно означает действие отправки данных на сервер с формы авторизации. Но что делать, если у кнопки нет контекста? Например, классы кнопки Авторизации будут выглядеть так: [class=”btn-block btn btn-primary btn-block”]. Если нет контекста из слова submit (отправка), то можно очень быстро потеряться и сразу не ясно, к какому элементу относится этот локатор. В данном случае нам поможет название текущего элемента или его родителя.

    Для наглядности рассмотрим весь блок с кнопкой «Авторизация».

    Как вариант — к локатору можно добавить сам тег button. Например, button[class*=”btn”] (сократил класс для наглядности). В таком случае можно взять тег или класс родителя за основу, а именно div или [class=»control-group submit no-cancel»]. Если нужно указать родителя, то эта связь пишется через пробел. Через пробел можно обращаться на любой уровень вложенности, например, из form сразу прыгнуть к button. Полный путь будет выглядеть так: form div button.

    С полученными знаниями можно расширить пул локаторов:  

    • form button

    • form [type=”submit”]

    • #password-form #submit (решётка — сокращённая форма id, точка — сокращённая форма class)

    • и еще много-много локаторов, которые можно найти комбинаторикой, главное, чтобы по итогу локатор выглядел кратко и лаконично, передавал суть элемента

    А как с ID

    С ID работает всё точно также, только краткая запись ID — это решётка, например, <form id=”password-form”> можно записать как form#password-form, по такому же принципу, как и с классом

    Поиск по кастомным атрибутам

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

    • data-loading-text

    • tabindex=»0″

    Очень хорошей практикой на проекте является обвешивание интерактивных элементов кастомным атрибутом data-qa или data-qa-id. Например, <button id=”css-1232” data-qa=”login-button”>. Если поменяют локатор, то этот атрибут останется и тесты будут стабильными долгое время. Добавлять эти атрибуты могут фронтенд-разработчики или автоматизаторы, если имеют доступ к коду фронтенда и возможность пушить в него правки.

    Локаторы можно и нужно комбинировать! Элементы, состоящие из нескольких классов, айди и других атрибутов, можно объединять в один локатор. Например, возьмем элемент формы, который находится выше кнопки «Авторизация»: form#password-form[method=”post”][class*=”username”]

    Итоги поиска локаторов с помощью CSS

    • классы и id можно писать сокращенно с помощью точки и решетки

    • <button class=”login”>: .login = [class=”login”] = [class*=”log”] = button.login = button[class=”login”]

    • <button id=”size”>: #size = [id=”size”] = [id*=”ze”] = button#size = button[id=”size”]

    • всё, что не class, и не id в сокращённом виде пишем в [] (квадратных скобках), например, [name=”phone”], [data-qa-id=”regButton”]

    • если тег лежит внутри другого тега, то переходим к нему через пробел (независимо от степени вложенности), например, <span> -> <button> -> <a> = span a = button a = span button a

    Поиск элементов с помощью XPath

    XPath в корне отличается от CSS как идеей, так и реализацией. XPath — это полноценный язык для поиска элементов в дереве, причём неважно каком, будь это XML или XHTML. Можно использовать XPath в веб-страницах, нативной мобильной вёрстке и других инструментах. 

    Я изучал XPath больше месяца с нуля. Проблема была в том, что я никак не понимал принцип его работы — мы ходим от элемента к элементу, но не ясно, как это происходит, как писать красивые пути, какие преимущества у такого подхода. Неделями изучал документацию, статьи на блогах (к сожалению, тогда еще не было человекопонятных статей на Хабре) и видео в ютубе. Мне очень помогло одно видео, где автор объяснял базовые принципы XPath, после чего меня осенило и в голове сложилась картинка. Поэтому хочу поделиться с вами этой информацией, чтобы сократить время на изучение тонны материала. Изучение XPath самостоятельно полезно, но я бы с огромным удовольствием потратил полтора месяца на вещи поважнее.

    Предположим, у нас есть следующая структура документа:

    <div class="popup">
    		<div id="payment-popup">
    			<button name="regButton">
    				<span href="/doReg">Кнопка</span>
    			</button>
    		</div>
    	</div>

    XPath — это путь от элемента к элементу. Можно представить, что структура тегов — это дерево каталогов, как в любой ОС. Например, в данном случае теги можно представить в виде папок: div -> div -> button -> span. В терминале по ним можно переключаться через команду cd, а именно: cd div/div/button/span

    div/div/button/span — это и есть путь к элементу с помощью XPath, только первый элемент ищут по всему дереву элементов, поэтому пишут // в начале строки. В данном случае это будет выглядеть так: //div/div/button/span. 2 слэша можно использовать не только в начале — они обозначают то, что мы ищем элемент где-то внутри. Например, //div//span — элемент будет найден, мы пропустили второй div и button

    Главная отличительная особенность XPath — возможность проходить не только от родителя к детям, но и от детей к родителям. Например, есть структура:

    <div class=”popup”>
    	<div id=”payment-popup”>
    		<button name=”regButton”>
    			<span href=”/doReg” />
    		</button>
    		<button name=”loginButton”>
    			<span href=”/doLogin” />
    		</button>
    	</div>
    </div>
    

    Мы можем перейти от кнопки doLogin в кнопку doReg вот так:

    //*[@href=”/doLogin”]/../..//*[@href=”/doReg”]

    Чтобы перейти на уровень выше, как и терминале ОС, нужно написать 2 точки, как показано в примере. С помощью 2 точек мы поднимаемся с уровня span сначала до button, а с button до общего div

    Главный вопрос, который может возникнуть, а где это может пригодиться? Практически всюду, где есть одинаковые блоки, которые отличаются по какому-то одному признаку. Возьмем страницу RDR2 в Epic Games. На середине страницы сейчас перечислены 3 издания:

    В DevTools отчётливо видно, что блоки идентичные. Отличия только в названии издания, описании и цене.

    Есть задача: нажмите на кнопку «Купить сейчас» у издания Red Dead Online. Для этого надо завязаться на текст издания, подняться до первого общего элемента у названия издания и кнопки и опуститься до кнопки «Купить сейчас».

    //*[contains(text(), “Red Dead Online”)]/ancestor::*[contains(@data-component, "OfferCard")]//*[contains(@data-component, "Purchase")]

    Лайфхак: как найти первый общий элемент у двух элементов?

    Нажимаем на любом элементе ПКМ -> Посмотреть код, открывается вкладка Elements. Наводим курсором на текущий элемент и он выделяется синим цветом. Просто тащим курсор наверх, пока визуально не найдём элемент, который объединяет 2 элемента — в нашем случае текст и кнопку «Купить сейчас».

    В XPath, как и в CSS, можно искать по элементам и по атрибутам в элементе. Например: 

    <div class=”popup”>
    	<div id=”payment-popup”>
    		<button name=”regButton”>
    			<span href=”/doReg” />
    		</button>
        
        <button name=”loginButton”>
    			<span href=”/doLogin” />
    		</button>
    	</div>
    </div>

    Можно найти кнопку регистрации: 

    • //*[@href=”/doReg”] или //span[@href=”/doReg”]

    • //*[@name=”regButton”] или //button[@name=”regButton”]

    Как мы можем заметить — звёздочка заменяет название элемента. Где стоит звёздочка, означает, что элемент может называться как угодно. Главное, чтобы внутри него был заданный атрибут. Если мы хотим указать конкретный элемент, то подставляем его вместо звёздочки. Например, путь //span[@href=”/doReg”] — сразу говорит нам, что в элементе span мы ищем @href=”/doReg”, но если нам не важен элемент, то тогда span заменяем на звёздочку //*[@href=”/doReg”].

    Атрибуты всегда пишутся со знаком @ в начале, это тоже особенность языка.

    Еще следует упомянуть переходы по смежным осям. В примере выше есть 2 разные оси — 2 button: элементы одинаковые, но отвечают за разные кнопки. Это можно сделать с помощью зарезервированных слов: following-sibling и preceding-sibling.

    Например, нам нужно достать кнопку Войти, зная кнопку Регистрация: //*[@name=”regButton”]/following-sibling::*[@name=”loginButton”]. Если нужно найти кнопку Регистрации зная кнопку Войти, то делается это точно также, только ищем в осях, идущих до кнопки Регистрации: //*[@name=”loginButton”]/preceding-sibling::*[@name=”regButton”]. Переходы между осями или дереву (вверх-вниз) всегда происходит через 2 точки, если мы пишем полное название направления, например, following-sibling::, ancestor::

    Не всегда есть возможность искать элементы по полному названию класса, так как оно может являться достаточно большим и нечитабельным. В CSS мы это делали с помощью символа звёздочки. Здесь звёздочку заменяет слово contains и работает точно также, как и в CSS. Например, ищем кнопку Войти: //*[contains(@name, “Login”)]. Как мы видим, contains — это что-то вроде функции в XPath. 1 параметр — атрибут, в котором ищем часть текста, 2 — сам текст.

    Последней функцией, которую мы рассмотрим, будет text(). Она позволяет искать элемент по тексту, который в нём находится. Например, есть HTML-разметка:

    <button>
    	<span>Кнопка Войти</span>
    </button>
    <button>
    	<span>Кнопка Регистрация</span>
    </button>

    Чтобы найти текст по точному совпадению, нужно писать следующий путь: //*[text()=”Кнопка Войти”]. Но если мы захотим искать по 1 слову, то на помощь приходит комбинация со словом contains, а именно: //*[contains(text(), “Войти”)].

    Коротко про «Гибкие локаторы»

    Термин «гибкий локатор» применяется к поиску локаторов через CSS и с XPath. Называется он гибким, потому что независимо от текста внутри — локатор не изменится. Для примера снова возьмём страничку с игрой RDR2. На ней есть 3 издания. Сами локаторы не меняются, меняется только текст (название, описание, цена). Общий шаблон локатора будет выглядеть так: //*[contains(text(), “Название издания”)]/ancestor::*[contains(@data-component, «OfferCard»)]//*[contains(@data-component, «Purchase»)]. Текст уже можем в него передавать любой, какой захотим. Так вот именно этот локатор будет называться гибким — его тело остаётся неизменным, а меняются лишь параметры внутри него. В автоматизации мы очень часто пользуемся гибкими локаторами.

    Выводы

    Мы разобрали 2 основных способа поиска элементов на странице, с помощью CSS и XPath. Небольшое сравнение этих методов:

    Плюсы CSS

    Минусы CSS

    — краткий

    — читабельный

    — простой для освоения и полностью граничит с изучением базового CSS

    — что-то вроде мифа — он работает быстрее, то есть быстрее ищет элемент на странице, но на фоне мощности современных процессоров эта разница во времени неощутима и составляет пару миллисекунд

    — может переходить только от родителя к ребёнку, но не наоборот — вверх подниматься нельзя

    — более ограниченный набор функций для поиска элементов, например, нельзя искать элемент по тексту, который в нём находится

    — CSS заточен только под веб-страницы

    Плюсы XPath

    Минусы XPath

    — полноценный язык для поиска элементов не только в вебе, но и в других средах и документах

    — позволяет перемещаться по дереву вниз и вверх

    — гибко работает с осями элементов

    — есть очень много функций, которые помогают в поиске локаторов, например, поиску по тексту в элементе или аналог normalize-space, который убирает пробелы у строки по бокам

    — громоздкий

    — нечитабельный

    — сложен в освоении

    — работает дольше, чем поиск по CSS, хоть и незначительно

    В тестах лучше использовать CSS, но это не всегда реально. Именно поэтому в таких случаях приходит на помощь XPath.

    Полезные ссылки

    CSS:

    • https://flukeout.github.io/ — практика в поиске локаторов.

    • https://code.tutsplus.com/ru/tutorials/the-30-css-selectors-you-must-memorize—net-16048 — полезно узнать про различные виды селекторов. Мы используем не все, но всегда бывает ситуация, когда раз в жизни придётся использовать тот или иной локатор.

    • https://appletree.or.kr/quick_reference_cards/CSS/CSS%20selectors%20cheatsheet.pdf — локаторы наглядно.

    • https://learn.javascript.ru/css-selectors — оформление в виде документации.

    XPath:

    • https://topswagcode.com/xpath/ — практика в поиске локаторов.

    • https://www.w3schools.com/xml/xpath_nodes.asp — подробнее про ноды.

    • https://www.w3schools.com/xml/xpath_syntax.asp — синтаксис.

    • https://www.w3schools.com/xml/xpath_axes.asp — оси.

    • https://soltau.ru/index.php/themes/dev/item/413-kratkoe-rukovodstvo-po-xpath — более подробная информация с примерами на русском.

    Понравилась статья? Поделить с друзьями:
  • Как найти среднюю температуру города
  • Как найти номер актрисы
  • Как найти абсциссу общей точки графиков функций
  • Компьютер зависает намертво как исправить
  • Как быстро найти друзей в стиме