- Как установить selenium python windows
- Что пишут в блогах
- Онлайн-тренинги
- Конференции
- Что пишут в блогах (EN)
- Разделы портала
- Про инструменты
- Selenium + Python
- Введение
- Установка
- Выбор драйвера
- Поиск элеменотов
- Простой тест
- headless
- Как нажать на кнопку
- Поиск по тексту
- Дождаться загрузки элемента
- Автозаполнение формы
- Пример реального теста на создание пользователя
- Импорт файлов
- Пример теста без использования специальных библиотек
- Selenium + unittest
Как установить selenium python windows
Что пишут в блогах
В этом выпуске говорили о новостях мира тестирования за март 2021: книги, полезные материалы и новые релизы инструментов, которые будут полезны для тестировщиков разного уровня.
Онлайн-тренинги
Конференции
Что пишут в блогах (EN)
Разделы портала
Про инструменты
Автор: Энди Найт (Andy Knight)
Оригинал статьи
Перевод : Ольга Алифанова
Теперь, когда наш тест-проект создан, напишем несколько Web UI-тестов при помощи Selenium WebDriver!
Что такое WebDriver?
WebDriver – это программируемый интерфейс для взаимодействия с живыми веб-браузерами. Он позволяет тест-автоматизации открывать браузер, передавать клики, вводить символы, удалять текст, и чисто завершать работу с браузером. Интерфейс WebDriver рекомендован W3C. Самый популярный вариант реализации стандартов WebDriver – это Selenium WebDriver, бесплатный инструмент с открытым исходным кодом.
У WebDriver несколько компонентов:
- Языковые комплекты. Программные пакеты вроде Selenium WebDriver предоставляют комплекты языков программирования для взаимодействия с браузером. Selenium поддерживает основные языки вроде C#, Java, JavaScript, Ruby и Python.
- Код автоматизации. Программисты используют языковые комплекты для автоматизации взаимодействий с браузером. Распространенные взаимодействия – это, например, поиск элементов, клик по ним, и очищение текста. Обычно это пишется при помощи фреймворка тест-автоматизации.
- ПротоколJSONWire. Языковые комплекты кодируют любые взаимодействия, используя JSON, и отправляют их как запросы REST API к драйверу браузера. Протокол JSON Wire независим от языка и платформы.
- Драйвер браузера. Драйвер – это самостоятельный исполняемый модуль на тест-машине. Он работает как прокси между функцией, вызывающей взаимодействие, и браузером. Он получает запросы JSON для взаимодействий и отправляет их в браузер через HTTP.
- Браузер. Браузер обрабатывает тестируемые веб-страницы. Он в основном контролируется драйвером. Все основные браузеры поддерживают WebDriver, но каждому также нужен свой собственный тип драйвера, установленный на той же машине, что и браузер, и доступный по системному пути. К примеру, Google Chrome требует ChromeDriver.
Установка Selenium WebDriver
Для нашего тест-проекта мы будем использовать Python-комплекты Selenium WebDriver, а также Google Chrome и ChromeDriver. Можно пользоваться любым браузером, но давайте возьмем Chrome – у него, во-первых, очень высокая доля рынка, а во-вторых, есть инструменты разработчика, которые пригодятся позднее.
Убедитесь, что на вашей машине установлена самая свежая версия Chrome (для проверки и обновления Chrome перейдите в меню и выберите Help > About Google Chrome. Другой вариант – загрузите и установите его отсюда). Затем скачайте подходящую версию ChromeDriver тут и добавьте его в ваши системные пути.
Убедитесь, что СhromeDriver работает из командной строки:
- $ chromedriver
- Starting ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72) on port 9515
- Only local connections are allowed.
- Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Затем установите пакет Selenium Python в наше окружение:
- $ pipenv install selenium —dev
Теперь машина готова для веб-тестирования!
Новые тесты
Создайте новый модуль Python в директории tests/ по имени test_web.py. Этот новый модуль будет содержать наши Web UI-тесты. Теперь добавьте следующие импорты:
- import pytest
- from selenium.webdriver import Chrome
- from selenium.webdriver.common.keys import Keys
Зачем они нам нужны?
- pytest будет использоваться для фикстур
- Chrome предоставляет комплект ChromeDriver.
- Keys содержат специальные нажатия клавиш для браузерных взаимодействий.
Настройка и очистка WebDriver
Хорошая практика – когда каждый тест-кейс использует собственную копию WebDriver. Настройка и очистка добавляют несколько секунд к каждому тесту, однако отдельная копия для каждого теста сохраняет их простоту, безопасность и независимость. Если один тест наткнется на проблему, это не затронет другие тесты. К тому же использование отдельной копии WebDriver для каждого теста позволяет запускать их параллельно.
Лучше всего настраивать WebDriver при помощи фикстуры pytest. Фикстуры – это модные функции pytest для настройки и очистки, а еще они умеют внедрять зависимости. Любой тест, требующий копии WebDriver, может просто вызвать фикстуру для его получения.
Код
Добавьте вот такой код в tests/test_web.py:
- @pytest.fixture
- def browser():
- driver = Chrome()
- driver.implicitly_wait(10)
- yield driver
- driver.quit()
browser – это фикстурная функция pytest, как указано в декораторе @pytest.fixture. Давайте рассмотрим каждую строчку, чтобы понимать, что делает эта новая фикстура.
Строки
Chrome() инициализирует копию ChromeDriver на локальной машине, используя настройки по умолчанию. Возвращенный объект драйвера привязан к копии ChromeDriver. Все вызовы WebDriver будут выполняться через него.
Самая болезненная часть тест-автоматизации Web UI – это ожидание загрузки или изменения страницы после инициации взаимодействия. Странице нужно время на обработку новых элементов, и если автотест попытается получить доступ к новым элементам до того, как они начнут существовать, WebDriver выдаст исключение NoSuchElementException. Неправильное ожидание – богатый источник «нестабильности» Web UI-тестов.
Метод implicitly_wait говорит драйверу подождать существования элементов не более 10 секунд, прежде чем пытаться их найти. Механизм ожидания довольно умен – вместо того, чтобы спать полные 10 секунд, он прекратит ожидание сразу после появления элемента. Неявные ожидания декларируются один раз, и затем автоматически используются для всех элементов. В отличие от них, явные ожидания могут быть заданы отдельно для каждого взаимодействия – ценой необходимости явных вызовов ожидания. Хорошая практика – использовать один стиль ожидания эксклюзивно для тест-автоматизации. Смешивание явных и неявных ожиданий может иметь мерзкие и неожиданные побочные эффекты. Для нашего проекта неявное 10-секундное ожидание должно быть достаточным (если у вас медленное Интернет-соединение, повысьте этот таймаут для компенсации).
Фикстура pytest должна возвращать значение, сообщающее, что именно настраивалось. Наша фикстура возвращает ссылку на инициализированный WebDriver. Однако вместо выражения return она использует yield, что означает, что фикстура – генератор. Первая итерация фикстуры – в нашем случае, инициализация WebDriver – это фаза «настройки», которая вызывается до того, как начался тест. Вторая итерация – вызов выхода – это фаза очистки, вызывающаяся после завершения теста. Запись фикстур как генераторов объединяет в одно целое связанные операции настройки и очистки.
Всегда выходите из копии WebDriver в конце теста, что бы ни случилось. Процессы драйвера на тест-машине не всегда умирают после окончания автоматизации. Отсутствие явного выхода из копии драйвера может оставить его запущенным как зомби-процесс – а это может привести к потреблению и даже блокировке системных ресурсов.
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
Затем нужно убедиться что установлен pip
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() driver.get(«https://www.heihei.ru/») 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 и нажмём на него.
Можно искать по id
Также допустимо сперва присвоить переменной результат поиска и потом вызвать 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 это либо пока элемент не нашёлся, либо пока лимит времени не истёк. Лимит вы устанавливаете сами для каждого случая отдельно.
Автозаполнение формы
Пример автозаполнения формы на сайте. Может пригодиться, если вы сделали форму и хотите время от времени проверять всё ли на ней работает.
Сперва убедимся, что в названии страницы присутствует «Коста-дель-Соль» затем автоматически заполним форму.
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select driver = webdriver.Chrome() driver.get(«https://www.heihei.ru/Spain/renovation/costa_del_sol/») 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 \n WARNING LOG END \n «) if driver.find_elements_by_xpath(«//*[contains(text(), ‘RpcInvocationException’)]»): print («ERROR LOG: \n RpcInvocationException \n ERROR LOG END \n «) #driver.close()
Импорт файлов
Если вам нужно загрузить файл с помощью Selenium — нажимать на кнопку загрузки не нужно.
Найдите элемент input (скорее всего) в котором триггерится загрузка. Выделите его и используйте .send_keys с указанием пути до файла
Допустим, что вы нашли этот элемент и его Или у него не было никакого 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,
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()=’
# 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)
Если остались вопросы — смело задавайте их в Telegram группе — aofeedchat либо воспользуйтесь поиском по сайту
Чтобы следить за выходом новых статей — подписывайтесь на Telegram канал aofeed