Selenium для Python. Глава 4. Пошук елементів

Продовження перекладу неофіційною документації Selenium для Python.
Переклад зроблений з дозволу автора Baiju Muthukadan.
Оригінал можна знайти на тут.

Зміст:
1. Установка
2. Перші Кроки
3. Навігація
4. Пошук Елементів
5. Очікування
6. Об'єкти Сторінки
7. WebDriver API
8. Додаток: Часто Задавані Питання

4. Пошук елементів
Існує ряд способів пошуку елементів на сторінці. Ви вправі використовувати найбільш доречні для конкретних завдань. Selenium надає наступні методи пошуку елементів на сторінку:

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector
знайти всі елементи, що задовольняють умові пошуку, використовуйте наступні методи (повертається список):

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector
[Як ви могли помітити, у другому списку відсутня пошук по id. Це обумовлюється особливістю властивості id для елементів HTML: ідентифікатори елементів сторінки завжди унікальні. — Прим. пер.]

Крім загальнодоступних (public) методів, перерахованих вище, існує два приватних (private) методу, які при знанні покажчиків об'єктів сторінки можуть бути дуже корисні: find_element and find_elements.

Приклад використання:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

Для класу By доступні наступні атрибути:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

4.1. Пошук по Id
Використовуйте цей спосіб, коли відомий id елемента. Якщо жоден елемент не задовольняє заданому значенню id, буде викликано виключення NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>

Елемент form може бути визначений наступним чином:

login_form = driver.find_element_by_id('loginForm')

4.2. Пошук по Name
Використовуйте цей спосіб, коли відомий атрибут name елемента. Результатом буде перший елемент з шуканим значенням атрибута name. Якщо жоден елемент не задовольняє заданому значенню name, буде викликано виключення NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>

Елементи з іменами username і password можуть бути визначені наступним чином:

username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')

Наступний код отримає кнопку «Login», що знаходиться перед кнопкою «Clear»:

continue = driver.find_element_by_name('continue')

4.3. Пошук по XPath
XPath — це мова, що використовується для пошуку вузлів дерева XML-документа. Оскільки в основі HTML може лежати структура XML (XHTML), користувачам Selenium надається можливість посредоством цього потужного мови відшукувати елементи в їх веб-додатках. XPath виходить за рамки простих методів пошуку за атрибутами id або name (і в той же час підтримує їх), і відкриває спектр нових можливостей, таких як пошук третього чекбокса (checkbox) на сторінці, наприклад.

Одне з вагомих підстав використовувати XPath укладено в наявності ситуацій, коли ви не можете похвалитися придатними як покажчиків атрибутами, такими як id або name, для елемента, який ви хочете отримати. Ви можете використовувати Їх для пошуку елемента як за абсолютним шляху (не рекомендується), так і у відносному (для елементів з заданими id або name). XPath покажчики в тому числі можуть бути використані для визначення елементів за допомогою атрибутів відмінних від id name.

Абсолютний шлях XPath містить у собі всі вузли дерева від кореня (html) до необхідного елемента, і, як наслідок, схильний до помилок в результаті найменших коригувань вихідного коду сторінки. Якщо знайти найближчий елемент з атрибутами id або name (в ідеалі один з елементів-батьків), можна визначити шуканий елемент, використовуючи зв'язок «батьки-підлеглий». Ці зв'язки будуть набагато стабільніше і зроблять ваші тести стійкими до змін у вихідному коді сторінки.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>

Елемент form може бути визначений наступними способами:

login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")

  1. Абсолютний шлях (зламається при найменшій зміні структури HTML сторінки)
  2. Перший елемент form сторінки HTML
  3. Елемент form, для якого визначений атрибут з ім'ям id і значенням loginForm
Елемент username може бути знайдений так:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")

  1. Перший елемент form з дочірнім елементом input, для якого визначений атрибут з ім'ям name і значенням username
  2. Перший дочірній елемент input елемента form, для якого визначений атрибут з ім'ям id і значенням loginForm
  3. Перший елемент input, для якого визначений атрибут з ім'ям name і значенням username
Кнопка «Clear» може бути знайдена наступними способами:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")

  1. Елемент input, для якого задані атрибут з ім'ям name і значенням continue і атрибут з ім'ям type і значенням button
  2. Четвертий дочірній елемент input елемента form, для якого заданий атрибут з ім'ям id і значенням loginForm
Представлені приклади покривають деякі основи використання XPath, для більш поглибленого вивчення рекомендую наступні матеріали:

Існує також кілька дуже корисних доповнень (add-on), які можуть допомогти в з'ясуванні XPath елемента:

  • XPath Checker — отримує шляху XPath і може використовуватися для перевірки результатів шляху XPath
  • Firebug — послуги шляху XPath — лише одне з багатьох потужних засобів, підтримуваних цим дуже корисним плагіном
  • XPath Helper — для Google Chrome
4.4. Пошук гіперпосилань за текстом гіперпосилання
Використовуйте цей спосіб, коли відомий текст всередині анкер-тега [anchor tag, анкер-тег, тег «якір» — тег — Прим. пер.]. За допомогою такого способу ви отримаєте перший елемент з шуканим значенням тексту тега. Якщо жоден елемент не задовольняє шуканого значення, буде викликано виключення NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>

Елемент-гіперпосилання з адресою «continue.html» може бути отримано наступним чином:

continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

4.5. Пошук елементів по тегу
Використовуйте цей спосіб, коли ви хочете знайти елемент за його тегу. Таким способом ви отримаєте перший елемент з іменем тега. Якщо пошук не дасть результатів, буде порушено виняток NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>

Елемент заголовка h1 може бути знайдений наступним чином:

heading1 = driver.find_element_by_tag_name('h1')

4.6. Пошук елементів по класу
Використовуйте цей спосіб у випадках, коли хочете знайти елемент по значенню атрибута class. Таким способом ви отримаєте перший елемент з потрібним ім'ям класу. Якщо пошук не дасть результату, буде порушено виняток NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>

Елемент «p» може бути знайдений наступним чином:

content = driver.find_element_by_class_name('content')

4.7. Пошук елементів по CSS-селектору
Використовуйте цей спосіб, коли хочете отримати елемент з використанням синтаксису CSS селекторів [CSS-селектор — це формальний опис відносного шляху до елемента/елементів HTML. Класично, селектори використовуються для задання правил стилю. У випадку з WebDriver, існування самих правил не обов'язково, веб-драйвер використовує синтаксис CSS тільки для пошуку — Прим. пер.]. Цим способом ви отримаєте перший елемент задовольняє CSS-селектору. Якщо жоден елемент не задовольняють селектору CSS, буде порушено виняток NoSuchElementException.

Для прикладу, розглянемо наступний вихідний код сторінки:

<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>

Елемент «p» може бути визначений наступним чином:

content = driver.find_element_by_css_selector('p.content')

На Sauce Labs є хороша документація селекторам CSS.
Від перекладача: раджу також звернутися до наступних матеріалів:


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.