Selenium для Python. Розділ 1. Установка

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

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

1. Установка
1.1. Введення
Прив'язка Selenium до Python надає собою простий API [Інтерфейс програмування додатків (англ. Application Programming Interface) — Прим. пер.] для написання тестів функціональності/тестів на відповідність вимогам з використанням веб-драйвера Selenium WebDriver. З допомогою Selenium Python API ви можете інтуїтивно просто отримати доступ до всього функціоналу Selenium WebDriver.

Прив'язка Python-Selenium надає зручний API для доступу до веб-драйверам Selenium як Firefox, Ie, Chrome Remote та інших. На даний момент підтримуються версії Python 2.7, 3.2, 3.3 і 3.4.

В даній документації розглянуто Selenium 2 WebDriver API. Selenium 1 / Selenium RC API в ній не охоплені.

1.2. Завантаження Selenium для Python
Ви можете завантажити прив'язку Selenium до Python сторінки пакета selenium на PyPI. Однак, найкращим способом буде використання модуля pip. Python 3.4 містить pip стандартній бібліотеці. Використовуючи pip, ви можете встановити selenium наступною командою:
pip install selenium
Для створення ізольованою середовища Python можливе використання virtualenv. Бібліотека Python 3.4 також містить модуль pyvenv, який практично аналогічний virtualenv.

1.3. Детальна інструкція для користувачів Windows
Примітка
Для даної інсталяції вам необхідний доступ до мережі Інтернет.
1. Встановіть Python 3.4 через файл MSI, доступний на сторінці завантажень сайту python.org.
2. Запустіть командний рядок через программуcmd.exe і запустіть команду pip установки selenium, як показано нижче.
C:\Python34\Scripts\pip.exe install selenium
Тепер ви можете запускати свої тестові скрипти, використовуючи Python. Наприклад, якщо ви створили скрипт на основі Selenium і зберегли його в C:\my_selenium_script.py, то ви можете запустити його наступною командою:
C:\Python34\python.exe C:\my_selenium_script.py
1.4. Завантаження Selenium server
Примітка
Selenium server необхідний у випадках, коли ви хочете використовувати remote WebDriver [віддалений — Прим. пер.]. За додатковою інформацією звертайтеся до розділу Використання Selenium з remote WebDriver. Якщо ви тільки починаєте вивчати Selenium, ви можете пропустити цей розділ і продовжити вивчення з наступної глави.
Selenium server написаний на мові Java. Для його запуску рекомендована середовище Java Runtime Environment (JRE) версії 1.6 або вище.

Ви можете завантажити Selenium server 2.x сторінці завантажень сайту selenium. Ім'я файлу повинно виглядати приблизно таким чином: selenium-server-standalone-2.x.x.jar. Ви завжди можете завантажити останню версію Selenium server 2.x.

Якщо Java Runtime Environment (JRE) не встановлена у вашій системі, ви можете завантажити JRE з сайту Oracle. Якщо ви використовуєте системи GNU/Linux і маєте права root [права адміністратора — Прим. пер.], ви так само можете встановити JRE, використовуючи інструкції вашої системи.

Якщо команда java доступна в PATH (змінна оточення), ви можете запустити Selenium server використовуючи наступну команду:
java-jar selenium-server-standalone-2.x.x.jar
Замініть 2.x.x актуальною версією Selenium server, завантаженої вами з сайту.

Якщо JRE встановлена під користувачем, не володіє правами root і/або якщо вона недоступна у змінній оточення PATH, ви можете ввести відносний або повний шлях до файлу java. Аналогічно, ви можете доповнити ім'я jar-файлу Selenium server до відносного або повного шляху. Після цього команда буде виглядати так:
/шлях/до/java-jar /шлях/до/selenium-server-standalone-2.x.x.jar
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 коментарів

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