Selenium для Python. Розділ 2. Перші Кроки

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

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

2. Перші кроки
2.1. Просте використання
Якщо ви встановили прив'язку Selenium до Python, ви можете почати використовувати її з допомогою інтерпретатора Python.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

Код вище може бути збережений у файл (наприклад, python_org_search.py), і запущено:
python python_org_search.py
Запускається вами Python повинен містити встановлений модуль selenium.

2.2. Покроковий розбір прикладу
Модуль selenium.webdriver надає весь функціонал WebDriver'а. На даний момент WebDriver підтримує реалізації Firefox, Chrome, Ie і Remote. Клас Keys забезпечує взаємодію з командами клавіатури, такими як RETURN, F1, ALT і т. д…

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

Далі створюється елемент класу Firefox WebDriver.

driver = webdriver.Firefox()

Метод driver.get перенаправляє до сторінки URL в полі. WebDriver буде чекати поки сторінка не завантажиться повністю (тобто, подія «onload» ігнорується), перш ніж передати контроль вашого тесту або скрипту. Варто відзначити, що якщо сторінка використовує багато AJAX-коду при завантаженні, то WebDriver може не розпізнати, завантажилася вона повністю:

driver.get("http://www.python.org")

Наступний рядок — це твердження (англ. assertion), що заголовок містить слово «Python» [assert дозволяє перевіряти припущення про значеннях довільних даних в довільному місці програми. По своїй суті assert нагадує констатацію факту, розташовану посередині коду програми. У випадках, коли вимовлене твердження не вірно, assert збуджує виняток. Така поведінка дозволяє контролювати виконання програми в строго певному руслі. Відмінність assert від умов полягає в тому, що програма з assert не сприймає іншого перебігу подій, вважаючи подальше виконання програми або функції безглуздим — Прим. пер.]:

assert "Python" in driver.title

WebDriver надає ряд способів отримання елементів з допомогою методів find_element_by_*. Для прикладу, елемент вводу тексту input може бути знайдений за його атрибуту name методом find_element_by_name. Детальний опис методів пошуку елементів можна знайти в розділі Пошук Елементів:

elem = driver.find_element_by_name("q")

Після цього ми посилаємо натискання клавіш (аналогічно введенню клавіш клавіатури). Спеціальні команди можуть бути передані за допомогою класу Keys імпортованого з selenium.webdriver.common.keys:

elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

Після відповіді сторінки, ви отримаєте результат, якщо він очікується. Аби впевнитися, що ми отримали якийсь результат, додамо твердження:

assert "No results found." not in driver.page_source

На завершення, вікно закривається. Ви також можете викликати метод quit замість close. Метод quit закриє браузер повністю, в той час як close закриє одну вкладку. Однак, у випадку, коли відкрита тільки одна вкладка, за замовчуванням більшість браузерів закривається повністю:

driver.close()

2.3. Використання Selenium для написання тестів
Selenium найчастіше використовується для написання тестових ситуацій. Сам пакет selenium не надає жодних тестових утиліт або інструментів розробки. Ви можете писати тести з допомогою модуля Python unittest. Іншим вашим вибором в якості тестових утиліт/інструментів розробки можуть стати py.test і nose.
В цій главі, в якості вибраної утиліти буде використовуватися unittest. Нижче наводиться видозмінений приклад з використанням цього модуля. Даний скрипт тестує функціональність пошуку на сайті python.org:

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

def setUp(self):
self.driver = webdriver.Firefox()

def test_search_in_python_org(self):
driver = self.driver
driver.get("http://www.python.org")
self.assertIn("Python", driver.title)
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
assert "No results found." not in driver.page_source
elem.send_keys(Keys.RETURN)

def tearDown(self):
self.driver.close()

if __name__ == "__main__":
unittest.main()

Ви можете запустити тест вище з командного рядка наступної команди:
python test_python_org_search.py
.
— Ran 1 test in 15.566 s

OK
Результат зверху показує, що тест завершився успішно.

2.4. Покроковий розбір прикладу
Спочатку були імпортовані всі основні необхідні модулі. Модуль unittest вбудований в Python і реалізований на Java's JUnit. Цей модуль надає собою утиліту для організації тестів.

Модуль selenium.webdriver надає весь функціонал WebDriver'а. На даний момент WebDriver підтримує реалізації Firefox, Chrome, Ie і Remote. Клас Keys забезпечує взаємодію з командами клавіатури, такими як RETURN, F1, ALT і т. д…

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

Клас тесту успадкований від unittest.TestCase. Спадкування класу TestCase є способом повідомлення модулю unittest, що це тест:

class PythonOrgSearch(unittest.TestCase):

setUp — це частина ініціалізації, цей метод буде викликатися перед кожним методом тесту, який ви збираєтеся написати всередині класу тесту. Тут ми створюємо елемент класу Firefox WebDriver.

def setUp(self):
self.driver = webdriver.Firefox()

Далі описаний метод нашого тесту. Метод тесту завжди повинен починатися з фрази test. Перший рядок методу створює локальну посилання на об'єкт драйвера, створений методом setUp.

def test_search_in_python_org(self):
driver = self.driver

Метод driver.get перенаправляє до сторінки URL в полі. WebDriver буде чекати поки сторінка не завантажиться повністю (тобто, подія «onload» ігнорується), перш ніж передати контроль вашого тесту або скрипту. Варто відзначити, що якщо сторінка використовує багато AJAX-коду при завантаженні, то WebDriver може не розпізнати, завантажилася вона повністю:

driver.get("http://www.python.org")

Наступний рядок — це твердження, що заголовок містить слово «Python»:

self.assertIn("Python", driver.title)

WebDriver надає ряд способів отримання елементів з допомогою методів find_element_by_*. Для прикладу, елемент вводу тексту input може бути знайдений за його атрибуту name методом find_element_by_name. Детальний опис методів пошуку елементів можна знайти в розділі Пошук Елементів:

elem = driver.find_element_by_name("q")

Після цього ми посилаємо натискання клавіш (аналогічно введенню клавіш клавіатури). Спеціальні команди можуть бути передані за допомогою класу Keys імпортованого з selenium.webdriver.common.keys:

elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

Після відповіді сторінки, ви отримаєте результат, якщо він очікується. Аби впевнитися, що ми отримали якийсь результат, додамо твердження:

assert "No results found." not in driver.page_source

Метод tearDown буде викликаний після кожного методу тесту. Це метод для дій чищення. У поточному методі реалізовано закриття вікна браузера. Ви також можете викликати метод quit замість close. Метод quit закриє браузер повністю, в той час як close закриє одну вкладку. Однак, у випадку, коли відкрита тільки одна вкладка, за замовчуванням більшість браузерів закривається повністю.:

def tearDown(self):
self.driver.close()

Завершальний код — це стандартна вставка коду для запуску набору тестів [Порівняння __name__ "__main__" означає, що модуль (файл програми) запущений як окрема програма («main» (англ.) — «основна», «головна» (а не імпортований з іншого модуля). Якщо ви імпортуєте модуль, атрибут модуля __name__ буде дорівнює імені файлу, каталогу і розширення — Прим. пер.]:

if __name__ == "__main__":
unittest.main()

2.5. Використання Selenium з remote WebDriver
Для використання remote WebDriver (віддаленого веб-драйвера) необхідно запустити Selenium server. Для запуску сервера використовуйте команду:
java-jar selenium-server-standalone-2.x.x.jar
Поки Selenium server запускається, ви можете бачити повідомлення виду:
15:43:07.541 INFO — RemoteWebDriver instances should connect to: 127.0.0.1:4444/wd/hub
Строка вище повідомляє про те, що ви можете використовувати вказаний URL для підключення remote WebDriver. Нижче наводиться кілька прикладів:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)

driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.OPERA)

driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)

Змінна desired_capabilities — це словник. Замість того, щоб використовувати словники за замовчуванням, ви можете явно прописати значення:

driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version': '2',
'javascriptEnabled': True})


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

0 коментарів

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