Selenium 2.0 + Python

Содержание

Слайд 2

Обзор команд Selenium WebDriver Занятие 2

Обзор команд Selenium WebDriver

Занятие 2

Слайд 3

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 4

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 5

Общий обзор команд http://selenium.googlecode.com/git/docs/api/py/index.html браузер – запуск, остановка окно браузера –

Общий обзор команд

http://selenium.googlecode.com/git/docs/api/py/index.html
браузер – запуск, остановка
окно браузера – открыть, закрыть, переключиться,

размер
диалоговые окна, меню, тулбар, статусбар, плагины
страница – открыть, предыдущая, следующая, выполнить JS-код
элементы – найти, мышь, клавиатура, текст, атрибуты, стили, размер
фреймы – найти, переключиться
Слайд 6

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 7

Запуск браузера from selenium import webdriver driver = webdriver.Firefox() driver =

Запуск браузера

from selenium import webdriver
driver = webdriver.Firefox()
driver = webdriver.Chrome()
driver = webdriver.Ie()
driver

= webdriver.Opera()
driver = webdriver.PhantomJS()
driver = webdriver.Remote()
Слайд 8

Запуск браузера Google Chrome https://code.google.com/p/chromedriver/downloads/list Internet Explorer https://code.google.com/p/selenium/downloads/list PhantomJS https://code.google.com/p/phantomjs/downloads/list

Запуск браузера

Google Chrome
https://code.google.com/p/chromedriver/downloads/list
Internet Explorer
https://code.google.com/p/selenium/downloads/list
PhantomJS
https://code.google.com/p/phantomjs/downloads/list

Слайд 9

Запуск браузера from selenium import webdriver driver = webdriver.Firefox( capabilities={'native_events': False}) https://code.google.com/p/selenium/wiki/DesiredCapabilities

Запуск браузера

from selenium import webdriver
driver = webdriver.Firefox( capabilities={'native_events': False})
https://code.google.com/p/selenium/wiki/DesiredCapabilities

Слайд 10

Остановка браузера driver.quit() закрыть все окна и завершить работу driver.close() закрыть

Остановка браузера

driver.quit() закрыть все окна и завершить работу
driver.close() закрыть текущее окно, если оно последнее

– завершить работу
Слайд 11

Открытие страниц и навигация driver.get("http://selenium2.ru/") открыть страницу и подождать, пока она загрузится driver.back() driver.refresh() driver.forward()

Открытие страниц и навигация

driver.get("http://selenium2.ru/") открыть страницу и подождать, пока она загрузится
driver.back() driver.refresh() driver.forward()

Слайд 12

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов и ожидания
Действия

с элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 13

Базовые команды поиска element = driver.find_element(by, locator) найти первый элемент по

Базовые команды поиска

element = driver.find_element(by, locator) найти первый элемент по заданному условию
elements

= driver.findElements(by, locator) найти все элементы по заданному условию
Слайд 14

Типы локаторов By.ID By.NAME By.CSS_SELECTOR By.XPATH By.TAG_NAME By.CLASS By.LINK_TEXT By.PARTIAL_LINK_TEXT

Типы локаторов

By.ID
By.NAME
By.CSS_SELECTOR
By.XPATH

By.TAG_NAME
By.CLASS
By.LINK_TEXT
By.PARTIAL_LINK_TEXT

Слайд 15

Типизированные команды поиска driver.find_element_by_id('myid') driver.find_element_by_name('myname') driver.find_element_by_xpath('//a') driver.find_element_by_css_selector('a') driver.find_element_by_tag_name('a')

Типизированные команды поиска

driver.find_element_by_id('myid')
driver.find_element_by_name('myname')
driver.find_element_by_xpath('//a')
driver.find_element_by_css_selector('a')
driver.find_element_by_tag_name('a')

Слайд 16

Поиск внутри элемента element2 = element1.find_element(by, locator) найти первый элемент по

Поиск внутри элемента

element2 = element1.find_element(by, locator) найти первый элемент по заданному условию, находящийся

внутри элемента element1
elements = element1.find_elements(by, locator) найти все элементы по заданному условию, находящиеся внутри элемента element1
Слайд 17

Пример cell41 = driver.find_element_by_css_selector("table.t1") .find_elements_by_tag_name("tr")[3] .find_elements_by_tag_name("td")[0] это первая ячейка в четвёртой строке таблицы, имеющий класс t1

Пример

cell41 =
driver.find_element_by_css_selector("table.t1")
.find_elements_by_tag_name("tr")[3]
.find_elements_by_tag_name("td")[0]
это первая ячейка в четвёртой строке таблицы, имеющий класс t1

Слайд 18

Если ничего не нашлось… find_element выбрасывает исключение NoSuchElementException find_elements возвращает пустой список

Если ничего не нашлось…

find_element выбрасывает исключение NoSuchElementException
find_elements возвращает пустой список

Слайд 19

Как проверить наличие? def is_element_present(self, by, locator) { try: self.driver.find_element(by, locator)

Как проверить наличие?

def is_element_present(self, by, locator) {
try:
self.driver.find_element(by, locator)
except

NoSuchElementException, e:
return False
return True
Слайд 20

Как проверить наличие? def is_element_present(self, by, locator) { return len( self.driver.find_elements(by,

Как проверить наличие?

def is_element_present(self, by, locator) {
return len(
self.driver.find_elements(by, locator))

> 0
то же самое, даже по скорости одинаково!
Слайд 21

Неявное ожидание driver.implicitly_wait(10) find_element ждёт, пока элемент появится find_elements ждёт, пока хотя бы один элемент появится

Неявное ожидание

driver.implicitly_wait(10)
find_element ждёт, пока элемент появится
find_elements ждёт, пока хотя бы один

элемент появится
Слайд 22

Явное ожидание for i in range(60): try: if self.is_element_present(by, locator): break

Явное ожидание

for i in range(60):
try:
if self.is_element_present(by, locator): break
except:

pass
time.sleep(1)
else:
self.fail("time out")
Слайд 23

Явное ожидание from selenium.webdriver.support.wait import WebDriverWait wait = WebDriverWait(driver, 30) element

Явное ожидание

from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 30)
element = wait.until(
lambda

x: x.find_element(by, locator))
Слайд 24

Явное ожидание from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.expected_conditions import * wait

Явное ожидание

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.expected_conditions import *
wait = WebDriverWait(driver, 30)
element

= wait.until(
presence_of_element_located((by, locator))
http://selenium.googlecode.com/git/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html
Слайд 25

Явные и неявные ожидания Явные На стороне клиента Ждать можно чего

Явные и неявные ожидания

Явные
На стороне клиента
Ждать можно чего угодно
Надо писать явно
TimeoutException
Много

сетевых запросов

Неявные
На стороне браузера
Ожидание появления в DOM
Работают автоматически
NoSuchElementException
Один сетевой запрос

Слайд 26

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Окнами и фреймами
Слайд 27

«Простые» действия кликнуть ссылки и кнопки радио и чекбоксы списки ввести текст прицепить файл

«Простые» действия

кликнуть
ссылки и кнопки
радио и чекбоксы
списки
ввести текст
прицепить файл

Слайд 28

«Сложные» действия клавиатурные сочетания наведение мыши перетаскивание правая кнопка мыши двойной клик

«Сложные» действия

клавиатурные сочетания
наведение мыши
перетаскивание
правая кнопка мыши
двойной клик

Слайд 29

Две главные операции click любой видимый элемент клик в центр элемента

Две главные операции

click
любой видимый элемент
клик в центр элемента
срабатывают все события

send_keys
любой видимый

элемент
добавление в конец текста
срабатывают все события
прицепляет файлы
сочетания клавиш
работают стрелки и т.п.
Слайд 30

А другие операции? select ? это просто клик по элементу списка

А другие операции?

select ? это просто клик по элементу списка
toggle ? это просто

клик по чекбоксу
check / uncheck ? клик с предварительной проверкой
Слайд 31

Тем не менее, Select from selenium.webdriver.support.select import Select dropdown = Select(element) dropdown.select_by_index(1) dropdown.select_by_value("mon") dropdown.select_by_visible_text("Monday")

Тем не менее, Select

from selenium.webdriver.support.select import Select
dropdown = Select(element)
dropdown.select_by_index(1)
dropdown.select_by_value("mon")
dropdown.select_by_visible_text("Monday")

Слайд 32

Пример from selenium.webdriver.common.keys import Keys element.click() element.send_keys(Keys.HOME) element.send_keys("some text") добавить текст

Пример

from selenium.webdriver.common.keys import Keys
element.click()
element.send_keys(Keys.HOME)
element.send_keys("some text")
добавить текст в начало, а не в

конец
Слайд 33

Пример element.send_keys(Keys.CONTROL, "a") time.sleep(1) element.send_keys(Keys.DELETE) удалить содержимое поля ввода

Пример

element.send_keys(Keys.CONTROL, "a")
time.sleep(1)
element.send_keys(Keys.DELETE)
удалить содержимое поля ввода

Слайд 34

Пример element.send_keys("text to search") element.send_keys(Keys.RETURN) засабмитить форму, если нет кнопки

Пример

element.send_keys("text to search")
element.send_keys(Keys.RETURN)
засабмитить форму, если нет кнопки

Слайд 35

Пример body = driver.find_element_by_tag_name("body") body.send_keys( Keys.CONTROL, Keys.SHIFT, "1") «горячие клавиши», клавиатурные сочетания

Пример

body = driver.find_element_by_tag_name("body")
body.send_keys( Keys.CONTROL, Keys.SHIFT, "1")
«горячие клавиши», клавиатурные сочетания

Слайд 36

Пример set_clipboard_contents(longtext) textarea.send_keys(Keys.CONTROL , "v") вставить длинный текст из буфера обмена

Пример

set_clipboard_contents(longtext)
textarea.send_keys(Keys.CONTROL , "v")
вставить длинный текст из буфера обмена

Слайд 37

Нативные и синтезированные события Нативные На уровне ОС Реализация на C/C++

Нативные и синтезированные события

Нативные
На уровне ОС
Реализация на C/C++
Точнее эмулируют
Иногда требуют фокус
Не

все версии браузеров

Синтезированные
Внутри браузера
Реализация на JavaScript
Не всегда точно эмулируют
Работают в бэкграунде
Все версии всех браузеров

Слайд 38

Запуск браузера from selenium import webdriver driver = webdriver.Firefox( capabilities={'native_events': True}) https://code.google.com/p/selenium/wiki/DesiredCapabilities

Запуск браузера

from selenium import webdriver
driver = webdriver.Firefox( capabilities={'native_events': True})
https://code.google.com/p/selenium/wiki/DesiredCapabilities

Слайд 39

Actions click send_keys move_to_element click_and_hold release key_down key_up webdriver.ActionChains(driver) .move_to_element(drag) .key_down(Keys.CONTROL) .click_and_hold() .move_to_element(drop) .release() .key_up(Keys.CONTROL) .perform()

Actions

click
send_keys
move_to_element
click_and_hold
release
key_down
key_up

webdriver.ActionChains(driver) .move_to_element(drag) .key_down(Keys.CONTROL) .click_and_hold() .move_to_element(drop) .release() .key_up(Keys.CONTROL) .perform()

Слайд 40

Actions webdriver.ActionChains(driver) .move_to_element(el, 1, 1) .click() .perform() webdriver.ActionChains(driver) .move_to_element(el) .move_by_offset(5,5) .click()

Actions

webdriver.ActionChains(driver) .move_to_element(el, 1, 1) .click() .perform()
webdriver.ActionChains(driver) .move_to_element(el) .move_by_offset(5,5) .click() .perform()

webdriver.ActionChains(driver) .move_to_element(menu) .move_to_element(submenu) .move_to_element(item) .click() .perform()
webdriver.ActionChains(driver) .drag_and_drop(el1, el2) .perform()

Слайд 41

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 42

text Видимый текст невидимые элементы имеют пустой текст Нормализация – удаление пробелов Preformatted – сохранение пробелов

text

Видимый текст невидимые элементы имеют пустой текст
Нормализация – удаление пробелов Preformatted – сохранение

пробелов
Слайд 43

get_attribute input.get_attribute("value"); input.get_attribute("href"); всегда абсолютные ссылки button.get_attribute("disabled") либо null, либо true

get_attribute

input.get_attribute("value");
input.get_attribute("href"); всегда абсолютные ссылки
button.get_attribute("disabled") либо null, либо true disabled, selected, checked, readonly, …
div.get_attribute("innerText"); attribute

или property?
Слайд 44

is_displayed вроде бы всё очевидно, но… находится за левым или верхним

is_displayed

вроде бы всё очевидно, но…
находится за левым или верхним краем частично находится

за краем
скрыт под другим элементом частично скрыт под другим элементом
прозрачный, либо цвет сливается с фоном
Слайд 45

Что ещё? element.value_of_css_property("color") element.size() element.location() element.get_tag_name() element.is_enabled() element.is_selected()

Что ещё?

element.value_of_css_property("color")
element.size()
element.location()
element.get_tag_name()
element.is_enabled()
element.is_selected()

Слайд 46

План занятия Общий обзор команд Запуск и остановка, открытие страниц Поиск

План занятия

Общий обзор команд
Запуск и остановка, открытие страниц
Поиск элементов (+ожидания)
Действия с

элементами, простые и сложные
Получение свойств элементов
Переключение между окнами и фреймами
Слайд 47

driver.switch_to_... driver.switch_to_alert() driver.switch_to_frame() driver.switch_to_default_content() driver.switch_to_window()

driver.switch_to_...

driver.switch_to_alert()
driver.switch_to_frame()
driver.switch_to_default_content()
driver.switch_to_window()

Слайд 48

Диалоговые окна alert = driver.switch_to_alert() alert_text = alert.text() alert.accept() # либо

Диалоговые окна

alert = driver.switch_to_alert()
alert_text = alert.text()
alert.accept() # либо alert.dismiss()
а если нет

алёрта? NoAlertPresentException
а если не сделать? UnhandledAlertException
Слайд 49

Фреймы driver.switch_to_frame( driver.find_element_by_tag_name("iframe")) # что-то сделали внутри фрейма driver.switch_to_default_content() фреймы могут быть вложены как матрёшка

Фреймы

driver.switch_to_frame( driver.find_element_by_tag_name("iframe"))
# что-то сделали внутри фрейма
driver.switch_to_default_content()
фреймы могут быть вложены как матрёшка

Слайд 50

Окна all_windows = driver.window_handles() this_window = driver.current_window_handle() driver.switch_to_window(handle) # что-то делаем в этом окне driver.close() driver.switch_to_window(original_window)

Окна

all_windows = driver.window_handles()
this_window = driver.current_window_handle()
driver.switch_to_window(handle)
# что-то делаем в этом окне
driver.close()
driver.switch_to_window(original_window)

Слайд 51

Туда и обратно # запоминаем идентификатор текущего окна original_window = driver.current_window_handle()


Туда и обратно

# запоминаем идентификатор текущего окна
original_window = driver.current_window_handle()
# запоминаем

идентификаторы уже открытых окон
existing_windows = driver.window_handles()
# кликаем кнопку, которая открывает новое окно
driver.find_element_by_id("button").click()
# ждем появления нового окна, с новым идентификатором
new_window = wait.until(any_window_other_than(existing_windows))
# переключаемся в новое окно
driver.switch_to_window(new_window)
# закрываем его
driver.close()
# и возвращаемся в исходное окно
driver.switch_to_window(original_window)
Слайд 52

Ожидание появления нового окна class any_window_other_than(object): def __init__(self, existing_windows): self.existing_windows =

Ожидание появления нового окна

class any_window_other_than(object):
def __init__(self, existing_windows):
self.existing_windows = existing_windows

def __call__(self, driver):
handles = driver.window_handles()
diff = set(handles)-set(existing_windows)
return iter(diff).next() if len(diff) > 0 else False
Слайд 53

Размеры и положение окна driver.get_window_size() driver.set_window_size(800, 600) driver.maximize_window() driver.get_window_position() driver.set_window_position(0, 0)

Размеры и положение окна

driver.get_window_size()
driver.set_window_size(800, 600)
driver.maximize_window()
driver.get_window_position()
driver.set_window_position(0, 0)