Selenium + Python
Введение
В этой статье вы узнаете как пользоваться связкой PyCharm + Python + unittest + Selenium + JavaScript.
Для лучшего понимания пригодятся начальные знания
Python
и
JavaScript
Основные методы работы в Selenium не зависят от языка, на котором вы пишете тест. Они разобраны
в статье
«Основы Selenium»
Я для работы использую
PyCharm
. Как добавить в PyCharm Selenium
читайте
здесь
Можете взять другой IDE или запускать из-под
Linux
,но не советую пытаться запускать тесты Selenium из
Подсистемы Windows для Linux
так как в bash для Windows нет поддержки графики по умолчанию. Можно заморочиться
и поставить что-то вроде Xming, но я не стал пробовать.
В этой статье я постараюсь показать развитие тестировщика на Python + Selenium.
Сначала попробуем запускать Selenium Webdriver и выполнять разные задачи, как средствами,
встроенными в Webdriver, так и включая различные JavaScript манипуляции с DOM.
Затем перейдём к использованию unittest, а потом посмотрим что делать, может быть
читатели что-то подскажут.
Установка
Первым делом нужно убедиться что установлен Python
python3 --version
Python 3.9.1
Затем нужно убедиться что установлен pip
pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
Если всё в порядке, то selenium можно установить через pip как обычный пакет
pip3 install selenium
Collecting selenium Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB) |████████████████████████████████| 904 kB 8.7 MB/s Requirement already satisfied: urllib3 in /usr/lib/python3/dist-packages (from selenium) (1.25.8) Installing collected packages: selenium Successfully installed selenium-3.141.0
Выбор драйвера
После установки Selenium нужно скачать драйверы для нужных браузеров.
Это действие не зависит от того на каком языке программирования вы планируете писать тест.
Подробную инструкцию можете прочитать в статье
Selenium
Когда путь до драйвера добавлен в PATH можно подключать нужный браузер в ваш Python код.
Firefox
драйвер называется Gecko Driver и подключается так
from selenium import webdriver
driver = webdriver.Firefox()
Chrome аналогично. Вместо слова driver вы можете придумать свои называния. Например chdriver и ffdriver.
from selenium import webdriver
driver = webdriver.Chrome()
Поиск элеменотов
Есть много способов искать элементы, но их объединяет необходимость импортировать By
from selenium.webdriver.common.by import By
Простой тест
Зайдём на сайт и проверим, что в названии есть фраза «О Финляндии и путешествиях» найдём изображение по имени класса, найдём изображение по имени селектора
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
url = "https://www.heihei.ru/"
driver.get(url)
assert "О Финляндии и путешествиях" in driver.title
image = driver.find_element_by_class_name("w100");
# Returns only the first element with the class
image2 = driver.find_element_by_css_selector('img.w100')
# Returns only the first element with the css selector
print('image2: ')
print(image2)
headless
Для «невидимого» запуска Selenium Webdriver нужно использовать опцию headless
Это очень полезный режим для тестирования в связке с CI/CD инструментами.
Чтобы пользоваться этим режимом нужно импортировать Options
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options)
Можно добавить логику на основе переданного аргумента. Я обычно добавляю лог.
chrome_options = Options()
if headless == True:
chrome_options.add_argument("--headless")
print("Running in headless mode")
else:
print("Running head over hills")
driver = webdriver.Chrome(options=chrome_options)
Как нажать на кнопку
Чтобы нажать на кнопку нужно найти элемент и использовать функцию click()
Например, найдём элемент button с классом new-button и нажмём на него.
driver.find_element_by_css_selector('button.new-button').click()
Можно искать по id
driver.find_element_by_id('loginButtonId').click()
Также допустимо сперва присвоить переменной результат поиска и потом вызвать click()
loginButton = driver.find_element_by_id('loginButtonId')
loginButton.click()
Поиск по тексту
Задача: кликнуть на кнопку с текстом LOGIN
Известно: div с текстом LOGIN имеет класс title, но элементов этого класса несколько и какой по счёту
нам нужен неизвестно
Находим все элементы класса title
title_class = driver.find_elements_by_class_name("title")
for el in title_class:
if el.text == "LOGIN":
login_button = el
login_button.click()
Дождаться загрузки элемента
Допустим, вам нужно дождаться загрузки элементов с классом
Buttons
Вы готовы ждать максимум десять секунд.
driver.implicitly_wait(10)
buttons = driver.find_elements_by_class_name("Buttons")
Если элементы появятся быстрее, специально ждать десять секунд драйвер не будет.
Таким образом implicit wait это либо пока элемент не нашёлся, либо пока
лимит времени не истёк. Лимит вы устанавливаете сами для каждого случая отдельно.
Автозаполнение формы
Пример автозаполнения формы на сайте. Может пригодиться, если вы сделали форму и хотите
время от времени проверять всё ли на ней работает.
Разберу на примере заявки на
ремонт квартиры на Коста-дель-соль
на сайте
HeiHei.ru
Сперва убедимся, что в названии страницы присутствует «Коста-дель-Соль»
затем автоматически заполним форму.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
url = "https://www.heihei.ru/Spain/renovation/costa_del_sol/"
driver.get(url)
assert "Коста-дель-Соль" in driver.title
driver.find_element_by_id('container')
driver.find_element_by_class_name('imgfull')
municipality_list = Select(driver.find_element_by_name('municipality'))
municipality_list.select_by_visible_text('Марбелья')
area_list = Select(driver.find_element_by_name('price'))
area_list.select_by_value('area-larger100')
bedrooms_list = Select(driver.find_element_by_name('bedrooms'))
bedrooms_list.select_by_value('3-bedroom')
meetingplace_list = Select(driver.find_element_by_name('meetingplace'))
meetingplace_list.select_by_visible_text('Хельсинки')
your_name_form = driver.find_element_by_name('your_name')
your_name_form.send_keys('Andrei')
email_form = driver.find_element_by_name('email')
email_form.send_keys('heihei@heihei.ru')
message_form = driver.find_element_by_name('message')
message_form.send_keys('TEST Message')
sum_form = driver.find_element_by_name('sum')
sum_form.send_keys('100')
driver.find_element_by_css_selector('.img40c.bookingbutton').click()
Пример реального теста на создание пользователя
Запускаем Chrome и заходим на сайт.
Логинимся, находим нужный пункт в верхнем меню - Tools
открываем его.
Выпадает список - находим там нужный - User Profiles.
Заходим туда, заполняем все формы, сохраняем и проверяем - не получили ли мы
предупреждение о том, что пользователь с таким именем уже существует.
Проверяем не выдал ли фреймворк, на котором сделан сайт, необработанную ошибку.
В этом примере поиск элементов по классу сделан средствами JavaScript, затем
найденным элементам присвоены определённые id и уже по этим id из находит
Selenium Webdriver
Не копируйте этот тест себе пока не прочитаете всю статью. Очень много чего ещё можно оптимизировать
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get("http://your_url.ru/test/")
driver.set_window_size(1920, 1024)
driver.find_element_by_id('someDivId')
time.sleep(2)
driver.execute_script("""
div1 = document.getElementById('someDivId');
div1.style.backgroundColor = 'red';
""")
time.sleep(2)
driver.execute_script("""
window.scrollBy(0,1000)
div1 = document.getElementById('someDivId');
div1.style.backgroundColor = 'red';
div2 = div1.children;
div2[0].style.backgroundColor = 'green';
div3 = div2[0].children;
div3[0].style.backgroundColor = 'yellow';
table1 = document.getElementsByClassName('v-formlayout-margin-top');
array1 = document.getElementsByClassName('v-textfield');
array1[0].style.backgroundColor = 'violet';
array1[0].style.padding = '40px';
array1[0].id = 'usernameId';
array1[1].style.backgroundColor = 'pink';
array1[1].style.padding = '40px';
array1[1].id = 'passwordId';
idCandidates = document.getElementById('some-uid-5')
div1.style.backgroundColor = 'grey';
button1 = document.getElementsByClassName('v-button');
button1[0].id = 'loginButtonId';
console.log(div2.length);
""")
usernameForm = driver.find_element_by_id('usernameId')
usernameForm.send_keys('user')
passwordForm = driver.find_element_by_id('passwordId')
passwordForm.send_keys('password')
loginButton = driver.find_element_by_id('loginButtonId')
loginButton.click()
print("Logged in successfully!")
time.sleep(4)
driver.execute_script("""
topMenuElements = document.getElementsByClassName('v-menubar-menuitem');
toolsButton = topMenuElements[5];
toolsButton.style.color = 'red';
toolsButton.id = 'topToolsButton';
""")
topToolsButton = driver.find_element_by_id('topToolsButton')
topToolsButton.click()
print("Tools menu entered!")
time.sleep(4)
driver.execute_script("""
toolsButtonBlockOfOptions = document.getElementsByClassName('v-menubar-submenu-top-menu');
console.log('------------------------------------------ '+toolsButtonBlockOfOptions);
toolsButtonBlockOfOptions[0].style.color = 'violet';
toolsButtonBlockOfOptions[0].id = 'toolsDropDownDiv';
toolsDropDownOptions = toolsButtonBlockOfOptions[0].children;
console.log('-----------------------------------------2 '+toolsButtonBlockOfOptions[0]);
toolsDropDownOptions[1].style.color = 'orange';
toolsDropDownOptions[1].id = 'usersProfilesId';
""")
time.sleep(2)
userProfilesButton = driver.find_element_by_id('usersProfilesId')
userProfilesButton.click()
print("User Profiles menu entered!")
time.sleep(4)
driver.execute_script("""
toolsAddUserButtonCandidates = document.getElementsByClassName('v-button');
toolsAddUserButtonCandidates[2].style.color = 'red';
toolsAddUserButtonCandidates[2].style.paddingRight = '150px';
toolsAddUserButtonCandidates[2].id = 'addUserButtonId';
""")
time.sleep(2)
addUserButton = driver.find_element_by_id('addUserButtonId')
addUserButton.click()
time.sleep(2)
driver.execute_script("""
userNamFieldCandidates = document.getElementById('some-uid-85');
userNamFieldCandidates.style.color = 'red';
userNamFieldCandidates.style.paddingRight = '150px';
//userNamFieldCandidates[0].id = '';
""")
addUserUsername = driver.find_element_by_id('some-uid-85')
addUserUsername.send_keys('testUserSelenium')
time.sleep(2)
addUserFirstName = driver.find_element_by_id('some-uid-87')
addUserFirstName.send_keys('FirstNameSelenium')
time.sleep(2)
addUserLastName = driver.find_element_by_id('some-uid-89')
addUserLastName.send_keys('LastNameSelenium')
time.sleep(2)
addUserPassword = driver.find_element_by_id('some-uid-91')
addUserPassword.send_keys('password1')
addUserUserTagId = driver.find_element_by_id('some-uid-93')
addUserUserTagId.send_keys('12345')
driver.execute_script("""
userGroupSelectBlockCandidates = document.getElementsByClassName('v-select-select');
userGroupSelectBlockCandidates[0].style.color = 'red';
userGroupSelectBlockCandidates[0].style.paddingRight = '150px';
userGroupSelectOptions = userGroupSelectBlockCandidates[0].children;
userGroupSelectOptions[1].style.color = 'blue';
userGroupSelectOptions[1].id = 'userGroupSelectOptionAdminId';
""")
time.sleep(2)
selectUserGroupAdmin = driver.find_element_by_id('userGroupSelectOptionAdminId')
selectUserGroupAdmin.click()
#similar code exists - need to replace with a function if possible
driver.execute_script("""
saveButtonCandidates = document.getElementsByClassName('v-button');
saveButtonCandidates[4].style.backgroundColor = 'green';
saveButtonCandidates[4].style.color = 'red';
saveButtonCandidates[4].style.margin = '150px';
saveButtonCandidates[4].style.padding = '150px';
saveButtonCandidates[4].id = 'saveButtonId';
""")
time.sleep(2)
saveButton = driver.find_element_by_id('saveButtonId')
saveButton.click()
print("Tried to create new user!")
time.sleep(2)
if driver.find_elements_by_xpath("//*[contains(text(), 'Given user name is already in use')]"):
print("WARNING LOG:\n User with this name already exists \nWARNING LOG END \n ")
if driver.find_elements_by_xpath("//*[contains(text(), 'RpcInvocationException')]"):
print("ERROR LOG:\n RpcInvocationException \nERROR LOG END \n ")
#driver.close()
Импорт файлов
Если вам нужно загрузить файл с помощью Selenium - нажимать на кнопку загрузки не нужно.
Найдите элемент input (скорее всего) в котором триггерится загрузка. Выделите его и используйте .send_keys с указанием пути до файла
Допустим, что вы нашли этот элемент и его id = inputElement.
Или у него не было никакого id вообще, но вы присвоили ему этот id самостоятельно
с помощью
JavaScript
inputElement = driver.find_element_by_id(inputElementId)
inputElement.send_keys("C:\\Users\\username\\Documents\\Projects\\projectName\\products_to_import-ANSI.csv")
Пример теста без использования специальных библиотек
Основное отличие от предыдущего примера - кликов на верхнее меню теперь несколько, поэтому скрипт клика на элемент верхнего меню оформлен как функция,
которая принимает в качесте параметра название элемента меню, например Tools, и затем использует это название как ключ для внутреннего словаря -
получает порядковый номер элемента и кликает на него.
Также в этом тесте будет загрузка файла. Пока что я не пользуюсь никакими библиотеками для тестирования, поэтому вся надежда на текстовый вывод.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time
import random
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
url2 = "http://someUrl:4880/path/"
failedToConnect = False
r = 0
try:
r = requests.get(url2)
except:
print("Tried to connect to server but failed")
failedToConnect = True
#headless = True
headless = False
def testprojectName(headless) :
# driver = webdriver.Chrome()
chrome_options = Options()
if headless == True:
chrome_options.add_argument("--headless")
print("Running in headless mode")
else:
print("Running head over hills")
#chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options)
#define functions
def loginFunction(username, password):
#expects that IDs are existing so need to assign them before calling this function
usernameForm = driver.find_element_by_id('usernameId')
usernameForm.send_keys(username)
passwordForm = driver.find_element_by_id('passwordId')
passwordForm.send_keys(password)
loginButton = driver.find_element_by_id('loginButtonId')
loginButton.click()
print("Logged in successfully!")
def goToTopMenuFunction(MenuName):
topMenuDict = {
"Tools": 5,
"Graphs": 4,
"History": 3,
"Reports": 2,
"Shipments": 1,
"Home": 0,
}
if MenuName in topMenuDict:
print(f"Yes, {MenuName} is one of the keys in the topMenuDict dictionary")
else:
print(f"{MenuName} is not recognized as a top menu option")
menu_number = topMenuDict[MenuName]
print(f"{MenuName} menu is selected")
driver.execute_script(f"""
console.log('0000 --------------------------------------- Go to menu number {menu_number}');
console.log('0001 --------------------------------------- Its name is {MenuName}');
topMenuElements = document.getElementsByClassName('v-menubar-menuitem');
console.log('1111--------------------------------------- '+topMenuElements);
topMenuButton = topMenuElements[{menu_number}];
console.log('1122---------------------------------------- '+topMenuButton);
topMenuButton.style.color = 'red';
topMenuButton.id = '{MenuName}topButton';
console.log(topMenuButton.id);
""")
newButtonId = MenuName + 'topButton';
topMenuButton = driver.find_element_by_id(newButtonId)
print(topMenuButton)
topMenuButton.click()
print(f"{MenuName}menu entered!")
def checkForStackTrace():
if driver.find_elements_by_xpath("//*[contains(text(), 'Given user name is already in use')]"):
print("WARNING LOG:\n User with this name already exists \nWARNING LOG END \n ")
if driver.find_elements_by_xpath("//*[contains(text(), 'RpcInvocationException')]"):
print("ERROR LOG:\n RpcInvocationException \nERROR LOG END \n ")
def goToSubMenuOfTopMenuFunction(SubMenuName):
topSubMenuDict = {
"Server Settings": 0,
"User Profiles": 1,
"Server Log": 2,
"My Settings": 3,
"Locations": 4,
"Integration Endpoints": 5,
"Types": 6,
"Test Data": 7,
"Report fields customization": 8,
"Companies": 9,
"Product types": 10,
}
if SubMenuName in topSubMenuDict:
print(f"Yes, {SubMenuName} is one of the keys in the topMenuDict dictionary")
else:
print(f"{SubMenuName} is not recognized as a top menu option")
sub_menu_number = topSubMenuDict[SubMenuName]
print(f"{SubMenuName} submenu is selected")
driver.execute_script(f"""
subMenuButtonBlockOfOptions = document.getElementsByClassName('v-menubar-submenu-top-menu');
console.log('------------------------------------------ '+subMenuButtonBlockOfOptions);
subMenuButtonBlockOfOptions[0].style.color = 'violet';
subMenuButtonBlockOfOptions[0].id = 'subMenuDropDownDiv';
subMenuDropDownOptions = subMenuButtonBlockOfOptions[0].children;
console.log('-----------------------------------------2 '+subMenuDropDownOptions[0]);
subMenuDropDownOptions[{sub_menu_number}].style.color = 'orange';
subMenuDropDownOptions[{sub_menu_number}].id = '{SubMenuName}Id';
""")
time.sleep(2)
newButtonId = SubMenuName+'Id';
subMenuButton = driver.find_element_by_id(newButtonId)
subMenuButton.click()
print(f"{SubMenuName} menu entered!")
def clickVbuttonFunction(vButtonName):
vButtonDict = {
"Add New User": 2,
"Save": 4,
"Import from CSV": 3,
"Select file":4,
}
if vButtonName in vButtonDict:
print(f"Yes, {vButtonName} is one of the keys in the vButtonDict dictionary")
else:
print(f"{vButtonName} is not recognized as a v-button class member")
v_button_number = vButtonDict[vButtonName]
print(f"{vButtonName} is going to be clicked")
driver.execute_script(f"""
currentVbuttonCandidates = document.getElementsByClassName('v-button');
currentVbuttonCandidates[{v_button_number}].style.backgroundColor = 'blue';
currentVbuttonCandidates[{v_button_number}].style.color = 'red';
currentVbuttonCandidates[{v_button_number}].id = '{vButtonName}Id';
""")
time.sleep(3)
newVbuttonId = vButtonName+'Id'
currentVbutton = driver.find_element_by_id(newVbuttonId)
currentVbutton.click()
print(f"{vButtonName} was clicked")
def import_gwtFileUploadFunction(importName):
gwtFileUploadDict = {
"Add New User": 2,
"Save": 4,
"Import from CSV": 3,
"Select file":0,
}
if importName in gwtFileUploadDict:
print(f"Yes, {importName} is one of the keys in the gwtFileUploadDict dictionary")
else:
print(f"{importName} is not recognized as a gwt-FileUpload class member")
importName_number = gwtFileUploadDict[importName]
print(f"Something is going to be imported to {importName}")
driver.execute_script(f"""
currentVbuttonCandidates = document.getElementsByClassName('gwt-FileUpload');
currentVbuttonCandidates[{importName_number}].style.backgroundColor = 'blue';
currentVbuttonCandidates[{importName_number}].style.color = 'red';
//currentVbuttonCandidates[{importName_number}].style.margin = '50px';
//currentVbuttonCandidates[{importName_number}].style.padding = '50px';
currentVbuttonCandidates[{importName_number}].id = '{importName}Id';
""")
time.sleep(3)
importElementId = importName+'Id'
importElement = driver.find_element_by_id(importElementId)
importElement.send_keys("C:\\Users\\username\\Documents\\Projects\\projectName\\products_to_import-ANSI.csv")
print(f"{importName} get some import")
# testprojectName function actual script starts here
driver.get("http://projectNamestorelinuxdev:4880/projectName/path")
driver.set_window_size(1920, 1024)
driver.find_element_by_id('projectname-900094176')
# driver.find_element_by_css_selector('.v-expand')
time.sleep(1)
driver.execute_script("""
div1 = document.getElementById('projectName-900094176');
div1.style.backgroundColor = 'red';
""")
time.sleep(1)
driver.execute_script("""
div1 = document.getElementById('projectName-900094176');
div1.style.backgroundColor = 'red';
div2 = div1.children;
div2[0].style.backgroundColor = 'green';
div3 = div2[0].children;
div3[0].style.backgroundColor = 'yellow';
table1 = document.getElementsByClassName('v-formlayout-margin-top');
array1 = document.getElementsByClassName('v-textfield');
array1[0].style.backgroundColor = 'violet';
array1[0].style.padding = '40px';
array1[0].id = 'usernameId';
array1[1].style.backgroundColor = 'pink';
array1[1].style.padding = '40px';
array1[1].id = 'passwordId';
idCandidates = document.getElementById('gwt-uid-5')
//alert(idCandidates)
//console.log(idCandidates);
div1.style.backgroundColor = 'grey';
button1 = document.getElementsByClassName('v-button');
//console.log('Login button '+button1);
//console.log(' ------------------------------------------ Login button 0'+button1[0]);
button1[0].id = 'loginButtonId';
setTimeout(function() {
console.log('timeout');
}, 2000);
console.log(div2.length);
""")
loginFunction("admin","password")
time.sleep(2)
goToTopMenuFunction("Tools")
time.sleep(2)
goToSubMenuOfTopMenuFunction("User Profiles")
time.sleep(3)
clickVbuttonFunction("Add New User")
time.sleep(2)
driver.execute_script("""
userNamFieldCandidates = document.getElementById('gwt-uid-85');
userNamFieldCandidates.style.color = 'red';
userNamFieldCandidates.style.paddingRight = '150px';
//userNamFieldCandidates[0].id = '';
""")
r1 = random.randrange(10000, 20000)
r1Str = str(r1)
testUserSelenium = 'usrSel' + r1Str
print(f'Trying to create new user with username {testUserSelenium}')
addUserUsername = driver.find_element_by_id('gwt-uid-85')
addUserUsername.send_keys(testUserSelenium)
time.sleep(2)
addUserFirstName = driver.find_element_by_id('gwt-uid-87')
addUserFirstName.send_keys('FirstNameSelenium')
time.sleep(2)
addUserLastName = driver.find_element_by_id('gwt-uid-89')
addUserLastName.send_keys('LastNameSelenium')
time.sleep(2)
addUserPassword = driver.find_element_by_id('gwt-uid-91')
addUserPassword.send_keys('password')
addUserUserTagId = driver.find_element_by_id('gwt-uid-93')
addUserUserTagId.send_keys(r1)
driver.execute_script("""
userGroupSelectBlockCandidates = document.getElementsByClassName('v-select-select');
userGroupSelectBlockCandidates[0].style.color = 'red';
userGroupSelectBlockCandidates[0].style.paddingRight = '150px';
userGroupSelectOptions = userGroupSelectBlockCandidates[0].children;
userGroupSelectOptions[1].style.color = 'blue';
userGroupSelectOptions[1].id = 'userGroupSelectOptionAdminId';
""")
time.sleep(2)
selectUserGroupAdmin = driver.find_element_by_id('userGroupSelectOptionAdminId')
selectUserGroupAdmin.click()
# similar code exists - need to replace with a function if possible
clickVbuttonFunction("Save")
print("Tried to create new user!")
time.sleep(2)
checkForStackTrace()
goToTopMenuFunction("Tools")
time.sleep(1)
goToSubMenuOfTopMenuFunction("Product types")
time.sleep(2)
clickVbuttonFunction("Import from CSV")
time.sleep(2)
import_gwtFileUploadFunction("Select file")
time.sleep(30)
# driver.close()
if (failedToConnect == False):
print('Starting Selenium Test')
testprojectName(headless)
Selenium + unittest
Как вы уже скорее всего знаете, в Selenium Webdriver нет никаких средств для написания тестов. Обычно вместе с Webdriver используют
библиотеку того языка программирования, на котором работает программист-тестировщик.
В этой статье я пользуюсь Python 3 поэтому в качестве библитеки для тестирования могу выбрать unittest, nose или pytest.
В качестве альтернативы Python 3 можно использовать Java, C#, Javascript, Ruby или Kotlin
Начнём с unittest
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
# using time should be probably replaced by some advanced method
import time
chrome_options = Options()
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--incognito")
# website to be tested url
url = "http://somewebsite.com"
# url = "http://www.google.com/"
# if you need browser to be opened change headless to False
headless = True
#headless = False
# company_specific_div_id
# это какой-то id у div , который мы точно ожидаем найти перейдя на сайт
# чтобы проверить попали мы куда надо или нет
company_specific_div_id = "someId-12345"
# main page text - to use for successful login assertion
# этот текст появляется на главной странице после успешного логина.
# будем использовать его, что проверить залогинились мы или нет
main_page_text = "You have logged in to somewebsite.com"
class TestSomeWebsite(unittest.TestCase):
@classmethod
def setUpClass(inst):
# create a new Chrome session
inst.headless = headless
chrome_options = Options()
if headless == True:
chrome_options.add_argument("--headless")
chrome_options.add_argument("--kiosk")
print("Running in headless mode")
else:
print("Running head over hills")
inst.driver = webdriver.Chrome(options=chrome_options)
inst.driver.implicitly_wait(30)
inst.driver.maximize_window()
# navigate to the application home page
inst.driver.get(url)
inst.driver.title
def test_company_div_exists(self):
self.company_div_to_test = company_specific_div_id
def check_that_div_exists(self,company_div):
self.company_div = company_div
try:
self.driver.find_element_by_id(company_div)
except:
print("\nelement not found")
return False
return True
self.assertTrue(check_that_div_exists(self, self.company_div_to_test))
def test_login(self):
array = self.driver.find_elements_by_class_name("v-textfield")
print(array[0])
array[0].send_keys("userName")
array[1].send_keys("password")
buttons = self.driver.find_elements_by_class_name("v-button")
print(buttons[0])
lbutton = buttons[0]
print(lbutton)
lbutton.click()
def check_that_driver_logged_in(self,text_for_assertion):
self.text_for_assertion = text_for_assertion
try:
homePageText = self.driver.find_element_by_xpath(f"//*[text()='{text_for_assertion}']")
except:
print("\nHH check_that_driver_logged_in function ERROR: Text not found, probably login failed")
return False
return True
self.assertTrue(check_that_driver_logged_in(self,main_page_text), "HH ASSERTION ERROR COMMENT: Text not found")
@classmethod
def tearDownClass(inst):
time.sleep(1)
# close the browser window
inst.driver.quit()
if __name__ == '__main__':
unittest.main()
# Fast select # from selenium.webdriver.support.ui import Select # def fast_multiselect(driver, element_id, labels): # select = Select(driver.find_element_by_id(element_id)) # for label in labels: # select.select_by_visible_text(label)
Selenium | |
Selenium Python | |
Несколько драйверов одновременно | |
Добавить Selenium в PyCharm | |
Тестирование ПО | |
Учебник по тестированию | |
Тестирование API | |
Тестирование с помощью Python | |
Robot Framework |