CoderCastrov logo
CoderCastrov
Парсер

Локаторы Selenium — Подробное руководство

Локаторы Selenium — Подробное руководство
просмотров
5 мин чтение
#Парсер

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

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

Локатор - это команда, которая сообщает Selenium IDE, с какими элементами GUI (например, текстовое поле, кнопки, флажки и т. д.) нужно работать. Точная идентификация элементов GUI является предпосылкой для создания автоматического сценария. Однако точная идентификация элементов GUI гораздо сложнее, чем кажется. Иногда вы оказываетесь работаете с неправильными элементами GUI или вообще без элементов. Selenium предоставляет ряд локаторов для точного определения элемента GUI.

Шаги для выполнения автоматического шага с помощью Selenium

1. Загрузите драйверы браузера

2. Инициализируйте Selenium WebDriver

3. Создайте экземпляр браузера

4. Загрузите веб-приложения

5. Выполните назначенные действия в определенном тесте

6. Оцените, достигнуто ли желаемое результат

7. Закройте WebDriver

Локаторы в Selenium начинают действовать на пятом шаге выше, после инициализации Selenium WebDriver и загрузки веб-страницы для тестирования. Локатор позволяет тестировщикам выбрать элемент HTML DOM для действий. В этом посте рассматриваются различные типы локаторов в Selenium WebDriver.

Различные локаторы в Selenium следующие:

· По CSS ID: find_element_by_id

· По имени CSS класса: find_element_by_class_name

· По атрибуту имени: find_element_by_name

· По DOM-структуре или XPath: find_element_by_xpath

· По тексту ссылки: find_element_by_link_text

· По частичному тексту ссылки: find_element_by_partial_link_text

· По имени HTML тега: find_element_by_tag_name

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

Поиск элементов по CSS ID

Это самый простой способ найти элемент в HTML DOM. CSS ID, хранящийся в атрибуте id элемента HTML DOM, является уникальным для каждого элемента на странице по умолчанию. Таким образом, ID может однозначно идентифицировать элемент.

Для использования этой функции необходимо вызвать метод .find_element_by_id() класса webdriver. Вот пример для этого.

from selenium import webdriverdriver = webdriver.Chrome(‘./chromedriver’)driver.get(“https://www.google.org")search_bar = driver.find_element_by_id(“id-search-field”)

Если нет элемента DOM с ID, который вы ищете, возникает исключение NoSuchElementException, которое можно обработать с помощью блока try-catch.

Теоретически каждый элемент DOM на странице должен иметь уникальный ID. Однако на практике это не всегда так. Большинство элементов могут не иметь ID или могут встретиться два элемента с одним и тем же ID. В таких случаях необходимо использовать другую стратегию для однозначной идентификации элемента DOM.

Поиск элементов по имени CSS класса

Вторая стратегия поиска элементов на странице - это поиск по имени класса. Имя класса хранится в атрибуте класса HTML-тега. По умолчанию CSS-класс применяется к группе элементов DOM. Метод .find_element_by_class_name() возвращает только первый элемент с соответствующим классом. Если элемент с заданным именем класса отсутствует, возникает исключение NoSuchElementException. Вот пример кода для этого.

from selenium import webdriverdriver = webdriver.Chrome(‘./chromedriver’)driver.get(“https://www.google.org")# Возвращает первый элемент с соответствующим классомfirst_search_bar = driver.find_element_by_class_name(“id-class-name”)

Поиск элементов по имени

В HTML5 элементы формы часто имеют атрибут имени. Метод .find_element_by_name() возвращает только первый элемент с соответствующим именем. Если есть несколько элементов с одним и тем же именем, будет возвращен первый совпавший элемент. Отсутствие совпадающих элементов приводит к ошибке NoSuchElementException.

Рассмотрим следующую форму:

_<form id=”loginForm”>__<input name=”name” type=”text” value=”First Name” />__<input name=”name” type=”text” value=”Last Name” />__<input name=”email” type=”text” value=”Business Email” />__<input name=”password” type=”password” />__<input name=”continue” type=”submit” value=”Sign Me Up” />__</form>_

Следующий код возвращает элемент формы для ввода электронной почты.

email_input = driver.find_element_by_name(“email”)

Однако следующий код возвращает только элемент формы для имени.

name_input = driver.find_element_by_name(“name”)

С использованием метода .find_element_by_name() невозможно получить поле ввода для фамилии в приведенном примере. Мы можем использовать find_elements_by_name(), который возвращает список элементов, и затем мы можем выбрать из этого списка. Это также возможно для следующего локатора.

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

Если не удалось идентифицировать элемент по ID, классу или имени, необходимо найти элемент по его XML-пути. Этот процесс также может быть реализован при чтении XML-документа. В этом блоге мы рассмотрим использование относительных путей, так как абсолютные пути подвержены ошибкам при малейшем изменении структуры HTML.

Мы будем использовать метод .find_element_by_xpath() для поиска соответствующего элемента в документе. Аргументом, который принимает метод .find_element_by_xpath(), является путь к элементу.

Чтобы найти поле ввода электронной почты в приведенном выше примере HTML-формы, можно использовать следующий код:

email_input=driver.find_element_by_xpath(“//form[input/@name=’email’]”)

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

Теперь давайте попробуем найти элементы ввода имени и фамилии в приведенной выше форме.

first_name=driver.find_element_by_xpath(“//form[@id=’loginForm’]/input[1]”)

last_name=driver.find_element_by_xpath(“//form[@id=’loginForm’]/input[2]”)

Метод сначала ищет форму с идентификатором loginForm, а затем выбирает первый и второй элементы ввода формы в качестве имени и фамилии.

Другие локаторы одиночных элементов

Помимо популярных методов, о которых мы говорили, в Selenium WebDriver есть несколько других локаторов элементов, которые тестировщики могут исследовать.

Можно найти элементы по имени HTML-тега с помощью метода .find_element_by_tag_name().

page_heading = driver.find_element_by_tag_name(‘h1’)

Также можно искать элемент гиперссылки по тексту ссылки. Можно использовать метод .find_element_by_link_text() для поиска точного текста ссылки или метод .find_element_by_partial_link_text() для поиска частичного текста.

# Точный текст ссылкиclick_here_link = driver.find_element_by_link_text(‘Click Here’)# Частичный текст ссылкиclick_here_link = driver.find_element_by_partial_link_text(‘Click’)

Поиск нескольких элементов

В этом руководстве мы рассмотрели методы, которые находят только одиночные элементы. Возможно, вы захотите выбрать группу элементов, а затем пройти по ним. Метод .find_elements() помогает найти несколько элементов в структуре DOM.

Вот общие примеры использования метода .find_elements(). Чтобы найти все элементы ввода формы с ID loginForm, используйте следующий фрагмент кода:

from selenium.webdriver.common.by import Byall_inputs = driver.find_elements(By.XPATH, ‘//form[@id=’loginForm’]/input’)Чтобы найти все элементы с именем класса, используйте следующий код:from selenium.webdriver.common.by import Byall_elements = driver.find_elements(By.CLASS_NAME, ‘my-css-class’)

Заключительные мысли о локаторах в Selenium

С этим мы подошли к концу блога о локаторах в Selenium с использованием Python. Мы обсудили различные подходы к выбору элементов на HTML-странице. Сначала мы рассмотрели селекторы одиночных элементов, а затем перешли к селекторам нескольких элементов в Selenium WebDriver.