Структура статьи:
1 Введение
2 Предварительные настройки для использования Selenium WebDriver
3 Классы, их методы и свойства
3.1 <class 'selenium.webdriver.firefox.webdriver.WebDriver'>
3.1.1 Метод find_element_by_xpath() - поиск элемента web-страницы по xPath
3.1.2 Метод get() - переход по URL
3.1.3 Метод get_screenshot_as_file() - снятие скриншота web-страницы в .png-файл
3.1.4 Метод switch_to_alert() - переключение на окно сообщения
3.2 <class 'selenium.webdriver.remote.webelement.WebElement'>
3.2.1 Свойство text - возвращает текстовое значение элемента web-страницы
3.2.2 Свойство tag_name - имя тега элемента web-страницы
3.2.3 Метод clear() - очистка текстового содержимого элемента
3.2.4 Метод get_attribute() - получить имя некоторого атрибута для тега элемента web-страницы
3.2.5 Метод send_keys() - печать в поля ввода
3.2.6 Метод click() - щелчок левой кнопки на элементе
3.2.7 Метод is_displayed() - проверка видимости элемента
3.3 <class 'selenium.webdriver.support.wait.WebDriverWait'>
3.3.1 Метод until() - проверка выполнения логического условия
3.4 <class 'selenium.webdriver.support.select.Select'>
3.4.1 Метод select_by_index() - выбор строк в селекторе по индексу
3.4.2 Метод select_by_value() - выбор строк в селекторе по значению
3.5 <class 'selenium.webdriver.common.action_chains.ActionChains'>
3.5.1 Метод move_to_element() - перемещение курсора мыши на элемент
3.5.2 Метод perform() - выполнение сохраненных действий
1 Введение
2 Предварительные настройки для использования Selenium WebDriver
3 Классы, их методы и свойства
3.1 <class 'selenium.webdriver.firefox.webdriver.WebDriver'>
3.1.1 Метод find_element_by_xpath() - поиск элемента web-страницы по xPath
3.1.2 Метод get() - переход по URL
3.1.3 Метод get_screenshot_as_file() - снятие скриншота web-страницы в .png-файл
3.1.4 Метод switch_to_alert() - переключение на окно сообщения
3.2 <class 'selenium.webdriver.remote.webelement.WebElement'>
3.2.1 Свойство text - возвращает текстовое значение элемента web-страницы
3.2.2 Свойство tag_name - имя тега элемента web-страницы
3.2.3 Метод clear() - очистка текстового содержимого элемента
3.2.4 Метод get_attribute() - получить имя некоторого атрибута для тега элемента web-страницы
3.2.5 Метод send_keys() - печать в поля ввода
3.2.6 Метод click() - щелчок левой кнопки на элементе
3.2.7 Метод is_displayed() - проверка видимости элемента
3.3 <class 'selenium.webdriver.support.wait.WebDriverWait'>
3.3.1 Метод until() - проверка выполнения логического условия
3.4 <class 'selenium.webdriver.support.select.Select'>
3.4.1 Метод select_by_index() - выбор строк в селекторе по индексу
3.4.2 Метод select_by_value() - выбор строк в селекторе по значению
3.5 <class 'selenium.webdriver.common.action_chains.ActionChains'>
3.5.1 Метод move_to_element() - перемещение курсора мыши на элемент
3.5.2 Метод perform() - выполнение сохраненных действий
Введение
Selenium Web Driver (далее WD), входящий в Selenium 2.0, - это библиотека, эмулирующая браузер и позволяющая работать с элементами web-форм. В отличие от Selenium Server не требует предварительного запуска сервера, обрабатывающего команды Selenium.
Для идентификации элементов на web-форме, чаще всего при работе с Selenium используют xPath, с примерами можно ознакомиться здесь:
http://forworktests.blogspot.ru/2013/03/xpath-web.html
http://forworktests.blogspot.ru/2013/03/xpath-web.html
Некоторые ссылки:
- http://seleniumhq.org/docs/03_webdriver.html - официальная документация по WD;
- http://selenium2.ru/docs/webdriver.html#webdriver - Selenium 2.0 и WebDriver, начало работы;
- http://automated-testing.info - сайт, на котором много технических статей по использованию инструментов тестирования, в том числе Selenium WD.
Предварительные настройки для использования Selenium WebDriver
Проверялось для Windows 7 x64, Python 3.2 x64. Патчи файлов касаются только Python 3.2, для Python 2.7 достаточно только первого шага.
- Для установки Selenium WebDriver для Python можно:a) либо скачать пакет selenium-*.*.*.tar.gz из http://pypi.python.org/pypi/selenium#downloads, распаковать, затем установить через setup:
python setup.py installb) либо установить через pip (бинарники для pip под Windows можно скачать на http://www.lfd.uci.edu/~gohlke/pythonlibs/):pip install -U selenium - Т.к. Selenium WD изначально написан для Python 2.* его нужно портировать на Python 3.*. Для этого можно воспользоваться инструкцией http://habrahabr.ru/post/143355/a) скачать скрипт pyselenium.py http://code.google.com/p/pyselenium/downloads/listb) в тот же каталог со скриптом скачать пакет пакет selenium-*.*.*.tar.gz из http://pypi.python.org/pypi/selenium#downloadsc) выполнить команду (для версии файла selenium-2.25.0, аналогично для других):
python pyselenium.py selenium-2.25.0.tar.gzСкрипт сначала скопирует файлы архива в каталоги Python, запустит утилиту 2to3.py для конвертации файлов, после чего вставит в нужные места encode() строки перед отправкой по сети и decode() в строку полученных данных. - Для проверки правильной установки Selenium WD:В результате должен открыться браузер ff и произойти переход на google.ru.
- Если при попытке открытия браузера будут возникать ошибки связанные с кодировкой, то значит, что скрипт pyselenium.py по какой-то причине отработал не до конца. В этом случае нужно вручную заменить в файле
<Python32_Path>\Lib\site-packages\<selenium-*.*.*-py3.2.egg>\selenium\webdriver\remote\remote_connection.py
все строки, указанные в скрипте pyselenium.py (в словаре для замены replace_dict):
http://code.google.com/p/selenium/issues/attachmentText?id=2139&aid=21390005000&name=pyselenium.py - Для использования функции WD снятия скриншотов в .png-файл, нужно заменить в файле
<Python32_Path>\Lib\site-packages\<selenium-*.*.*-py3.2.egg>\selenium\webdriver\remote\webdriver.py,
в методе get_screenshot_as_file из класса WebDriver, строку
f.write(base64.decodestring(png))
на строку
f.write(base64.decodestring(png.encode())).
Классы, их методы и свойства
Основные импорты:
from selenium import webdriver # работа с браузеромfrom selenium.webdriver.support.ui import WebDriverWait # ожидания различных событийfrom selenium.webdriver.support.ui import Select # работа со спискамиfrom selenium.webdriver.common.action_chains import ActionChains # различные действия |
Примеры запуска браузера:
ffp = webdriver.FirefoxProfile(ff_Profile) # Установка профиля мозиллы, где ff_Profile - это путь к каталогу с профилем.page = webdriver.Firefox(firefox_profile=ffp, timeout=5)) # page - экземпляр класса <class 'selenium.webdriver.firefox.webdriver.WebDriver'>. Фактически - это окно браузера.page.maximize_window() # разворачивание окна браузера во весь экран |
Далее будут представлены некоторые часто встречающиеся в web-проектах команды Selenium WD из различных классов и примеры их использования.
<class 'selenium.webdriver.firefox.webdriver.WebDriver'>
Список методов и свойств:
['NATIVE_EVENTS_ALLOWED', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_unwrap_value', '_wrap_value', 'add_cookie', 'back', 'close', 'create_web_element', 'current_url', 'current_window_handle', 'delete_all_cookies', 'delete_cookie', 'desired_capabilities', 'execute', 'execute_async_script', 'execute_script', 'find_element', 'find_element_by_class_name', 'find_element_by_css_selector', 'find_element_by_id', 'find_element_by_link_text', 'find_element_by_name', 'find_element_by_partial_link_text', 'find_element_by_tag_name', 'find_element_by_xpath', 'find_elements', 'find_elements_by_class_name', 'find_elements_by_css_selector', 'find_elements_by_id', 'find_elements_by_link_text', 'find_elements_by_name', 'find_elements_by_partial_link_text', 'find_elements_by_tag_name', 'find_elements_by_xpath', 'firefox_profile', 'forward', 'get', 'get_cookie', 'get_cookies', 'get_screenshot_as_base64', 'get_screenshot_as_file', 'get_window_position', 'get_window_size', 'implicitly_wait', 'maximize_window', 'name', 'orientation', 'page_source', 'quit', 'refresh', 'save_screenshot', 'set_page_load_timeout', 'set_script_timeout', 'set_window_position', 'set_window_size', 'start_client', 'start_session', 'stop_client', 'switch_to_active_element', 'switch_to_alert', 'switch_to_default_content', 'switch_to_frame', 'switch_to_window', 'title', 'window_handles']
Метод find_element_by_xpath() - поиск элемента web-страницы по xPath
Примеры использования:
# Обращение к элементам страницы по xpath:login = page.find_element_by_xpath("//input[@id='UserName']")pwd = page.find_element_by_xpath("//input[@id='Password']")# Печать в поля ввода:login.send_keys(self.login)pwd.send_keys(self.password)# Или можно сразу:page.find_element_by_xpath("//*[@type='submit']").click() |
Метод get() - переход по URL
Примеры использования:
page = webdriver.Firefox(firefox_profile=ffp, timeout=5)) # открываем браузерpage.get('ya.ru') # Переходим на Яндекс.# Переходим по ссылке, содержащейся в теге а, для которого есть текстовое описание 'Настройка синхронизации':page.get(page.find_element_by_xpath("//a[contains(text(),'Настройка синхронизации')]").get_attribute('href')) |
Метод get_screenshot_as_file() - снятие скриншота web-страницы в .png-файл
Примеры использования:
# Снять скриншот с текущего экземпляра браузера:ffp = webdriver.FirefoxProfile(ff_Profile) # указываем профильpage = webdriver.Firefox(firefox_profile=ffp, timeout=5)) # открываем браузерpage.get_screenshot_as_file('full_path.png') # делаем скриншот |
Метод switch_to_alert() - переключение на окно сообщения
Примеры использования:
alert = page.switch_to_alert() # Переключаемся на окно алерта. switch_to_alert возвращает класс Alert:alert.text # Возвращает текст алерта.alert.dismiss() # Выполняет действие "отказаться" от алерта.alert.accept() # Выполняет действие "принять" алерт.alert.send_keys() # Выполняет действие "напечатать" в окне алерта. |
<class 'selenium.webdriver.remote.webelement.WebElement'>
Список методов и свойств:
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_execute', '_upload', 'clear', 'click', 'find_element', 'find_element_by_class_name', 'find_element_by_css_selector', 'find_element_by_id', 'find_element_by_link_text', 'find_element_by_name', 'find_element_by_partial_link_text', 'find_element_by_tag_name', 'find_element_by_xpath', 'find_elements', 'find_elements_by_class_name', 'find_elements_by_css_selector', 'find_elements_by_id', 'find_elements_by_link_text', 'find_elements_by_name', 'find_elements_by_partial_link_text', 'find_elements_by_tag_name', 'find_elements_by_xpath', 'get_attribute', 'id', 'is_displayed', 'is_enabled', 'is_selected', 'location', 'parent', 'send_keys', 'size', 'submit', 'tag_name', 'text', 'value_of_css_property']
Свойство text - возвращает текстовое значение элемента web-страницы
Примеры использования:
# Получение текстового значения некоторой ссылки, искомой по xpath:link = page.find_element_by_xpath("//tr[@class='odd-row']/td/a")a = link.text# Или можно сразу получить это значение:b = page.find_element_by_xpath("//tr[@class='odd-row']/td/a").text |
Свойство tag_name - имя тега элемента web-страницы
Примеры использования:
# Получение имени тега, для некоторого элемента, найденного по xpath:element = page.find_element_by_xpath("//div[@id='main']/..//input[@id='Title']")a = element.tag_name # получим имя тега, в данном случае a = 'input'# Или можно сразу:b = page.find_element_by_xpath("//div[@id='main']/..//input[@id='Title']").tag_name |
Метод clear() - очистка текстового содержимого элемента
Примеры использования:
# Удаляем текст, введенный в input:page.find_element_by_xpath("//input[@id='Login']").clear() |
Метод get_attribute() - получить имя некоторого атрибута для тега элемента web-страницы
Примеры использования:
# 1. Получение значения атрибута, для некоторого тега найденного по xpath:tag = page.find_element_by_xpath("//div[@id='main']/..//input[@id='Title']")a = tag.get_attribute('value') # Получаем значение атрибута 'value' для тега input# Или можно сразу:b = page.find_element_by_xpath("//div[@id='main']/..//input[@id='Title']").get_attribute('value')# 2. Переход по ссылке для пункта меню "Настройка синхронизации":page.get(page.find_element_by_xpath("//a[contains(text(),'Настройка синхронизации')]").get_attribute('href')) |
Метод send_keys() - печать в поля ввода
Примеры использования:
# Ввод текста в поле формы, найденного по xPath:login = page.find_element_by_xpath("//input[@id='UserName']")login.send_keys('my_login') # Или можно сразу:page.find_element_by_xpath("//input[@id='UserName']").send_keys('my_login') |
Метод click() - щелчок левой кнопки на элементе
Примеры использования:
# Щелчок левой кнопки мыши на иконку выпадающего списка, найденную по xpath:element = page.find_element_by_xpath("//img[@id='osSelect']")element.click()# Или можно сразу:page.find_element_by_xpath("//img[@id='osSelect']").click() |
Метод is_displayed() - проверка видимости элемента
Примеры использования:
# 1. Определение того, является ли элемент, найденный по xpath, видимым на форме:element = page.find_element_by_xpath("//div[@id='treeWrapper']") # В данном случае определяется, виден ли выпадающий списокflag = element.is_displayed() # flag = True - если элемент видим, flag = False - если нет# Или можно сразу:flag = page.find_element_by_xpath("//div[@id='treeWrapper']").is_displayed()# 2. Использование в блоке ожидания появления элемента на форме:WebDriverWait(page, 5).until( lambda element: element.find_element_by_xpath("//div[@id='treeWrapper']").is_displayed(), 'Timeout while waiting popup-tree list.') # Ждём 5 сек. пока не появится выпадающий список, иначе - пишем сообщение. |
<class 'selenium.webdriver.support.wait.WebDriverWait'>
Список методов и свойств:
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'until', 'until_not']
Метод until() - проверка выполнения логического условия
Примеры использования:
opTimeout = 5 # задаём таймаут 5 сек.# Ждем появления некоторых элементов на форме, найденных по xpath, с указанным таймаутом. Until() принимает в качестве параметра логическое условие.# В данном случае - ожидается появление надписи 'Основные параметры' и кнопки Сохранить внизу страницы. Если они не появятся, в лог запишется сообщение:WebDriverWait(page, opTimeout).until(lambda element: (element.find_element_by_xpath("//div[@id='main']/..//div[contains(text(), 'Основные параметры')]")) and (element.find_element_by_xpath("//div[@id='main']/..//input[@id='save']")), 'Таймаут! Элементы на форме не появились!') |
<class 'selenium.webdriver.support.select.Select'>
Список методов и свойств:
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_escapeString', '_get_longest_token', '_setSelected', '_unsetSelected', 'all_selected_options', 'deselect_all', 'deselect_by_index', 'deselect_by_value', 'deselect_by_visible_text', 'first_selected_option', 'options', 'select_by_index', 'select_by_value', 'select_by_visible_text']
Метод select_by_index() - выбор строк в селекторе по индексу
Примеры использования:
# Обращение к существующей строке селектора по индексу, если селектор найден по xPath:Select(page.find_element_by_xpath("//select[@id='SelectedAttackType']")).select_by_index(1) # Выбирает 2-ю строку в селекторе (отсчет с нуля). |
Метод select_by_value() - выбор строк в селекторе по значению
Примеры использования:
# Обращение к существующей строке селектора по значению атрибута value, если селектор найден по xPath:Select(page.find_element_by_xpath("//select[@id='SelectedStatusId']")).select_by_value(2) # Выбирает строку в селекторе с value=2. |
<class 'selenium.webdriver.common.action_chains.ActionChains'>
Список методов и свойств:
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_actions', '_driver', 'click', 'click_and_hold', 'context_click', 'double_click', 'drag_and_drop', 'drag_and_drop_by_offset', 'key_down', 'key_up', 'move_by_offset', 'move_to_element', 'move_to_element_with_offset', 'perform', 'release', 'send_keys', 'send_keys_to_element']
Метод move_to_element() - перемещение курсора мыши на элемент
Примеры использования:
# Переместить мышь на элемент, найденный по xPath:administrationTab = page.find_element_by_xpath("//ul[@class='dropdown']/li[11]/div") # Ищем выпадающее меню.hover = ActionChains(page).move_to_element(administrationTab) # Действие по перемещению мыши сохраняется в объекте ActionChains. Затем нужно использовать метод perform() |
Метод perform() - выполнение сохраненных действий
Примеры использования:
# Переместить мышь на пункт меню и подождать выпадающее меню:administrationTab = page.find_element_by_xpath("//ul[@class='dropdown']/li[11]/div") # Ищем выпадающее меню.hover = ActionChains(page).move_to_element(administrationTab) # Сохраняем действие в объекте ActionChains.hover.perform() # применяем действие# Ждем, пока выпадающее меню не откроется, то есть не станет видимой одна из его ссылок:WebDriverWait(page, opTimeout).until( lambda el: el.find_element_by_xpath("//a[@href='/polidon2/ScheduledEntity']").is_displayed(), 'Timeout while we are wait pop-up menu.') |