Возможно, вы уже используете Selenium WebDriver как главный инструмент для решения задач веб-автоматизации. Это действительно один из самых популярных фреймворков в области автоматизированного тестирования. В данной статье мы решили поделиться пятью способами, о которых вы, вероятно, не знали, и то как они могут быть полезны в ваших тестовых сценариях с Selenium.
Используя предоставленную далее информацию, тестировщики смогут значительно легче организовывать свои тесты, следить за их выполнением и создавать подробные отчеты. Эти приемы сделают процесс тестирования более организованным и эффективным.
Способ №1 - Запуск нескольких тестов с одинаковыми параметрами
Этот прием особенно полезен при автоматизации браузера, когда в разных тестах необходимо использовать одни и те же значения. Для этого можно воспользоваться возможностями TestNG и задать специфичные параметры для тестового набора в файле конфигурации.
Приведу пример: в коде указывается URL-адрес для метода WebDriver, чтобы выполнить набор тестов (test suite). Эти тесты реализованы в рамках фреймворка TestNG.
public class TestNGParameterExample {
@Parameters({"firstSampleParameter"})
@Test(enabled = true)
public void firstTestForOneParameter(String firstSampleParameter) {
driver.get(firstSampleParameter);
WebElement searchBar = driver.findElement(By.linkText("Mobile Device & Browser Lab"));
searchBar.click();
Assert.assertEquals(driver.findElement(By.tagName("h1")).getText(), "Mobile Device & Browser Lab");
}
@Parameters({"firstSampleParameter"})
@Test
public void secondTestForOneParameter(String firstSampleParameter) {
driver.get(firstSampleParameter);
WebElement searchBar = driver.findElement(By.linkText("Live Cross Browser Testing"));
searchBar.click();
Assert.assertEquals(driver.findElement(By.tagName("h1")).getText(), "Cross Browser Testing");
}
}
testng.xml file structure is shown below.
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<parameter name="firstSampleParameter" value="https://experitest.com/"/>
<test name="Nopackage" >
<classes>
<class name="TestNGParameterExample" />
</classes>
</test>
</suite>
Помните, что все параметризованные тесты должны быть инициированы с помощью билдера, такого как, например, Maven.
Способ №2 - Передача простых значений в тест
В данном случае целью является создание тестов, которые позволяют обрабатывать наборы данных (датасеты). Для этого используется метод DataProvider, который может возвращать двумерный массив объектов. Вы можете представить двумерный массив объектов как таблицу, где:
Первое измерение массива указывает на количество разных сценариев запуска тестов.
Второе измерение описывает, сколько различных тестовых значений или параметров применяется в каждом сценарии.
Таким образом, вы создаете план тестирования с различными вариантами тестов, где каждый вариант может включать в себя разные наборы тестовых данных или условий. Это помогает организовать и структурировать вашу работу и анализировать поведение вашего кода в разных ситуациях.
Для лучшего понимания рассмотрим пример кода ниже, который использует аннотацию @DataProvider.
@DataProvider()
public Object[][] listOfLinks() {
return new Object[][] {
{"Mobile Device & Browser Lab", "Mobile Device & Browser Lab"},
{"Live Cross Browser Testing", "Cross Browser Testing"},
{"Automated Mobile Testing", "Mobile Test Automation!"},
};
}
Нижеприведенный код ссылается на метод поставщика данных с соответствующим именем.
@Test(dataProvider = "listOfLinks")
public void firstTestWithSimpleData(String linkname, String header) {
driver.get("https://experitest.com/");
WebElement searchBar = driver.findElement(By.linkText(linkname));
searchBar.click();
Assert.assertEquals(driver.findElement(By.tagName("h1")).getText(), header);
}
Способ №3 - Обработка всплывающих окон
Распространенной проблемой веб-автоматизации Selenium является взаимодействие со всплывающими окнами. Эти окна обычно бывают трех типов:
Простой алерт: отображает сообщение
Алерт подтверждения: запрашивает у пользователя подтверждение некоторой операции
Алерт подсказки: информирует пользователя о необходимости ввода некоторых данных
Хотя WebDriver не может управлять алертами на базе Windows, он может их обрабатывать на веб-страницах. Чтобы осуществлять управление всплывающими окнами используется метод switch_to
.
<!DOCTYPE html>
<html>
<body>
<h2>
Demo for Alert</h3>
Clicking below button
<button onclick="create_alert_dialogue()" name ="submit">Alert Creation</button>
<script>
function create_alert_dialogue() {
alert("Simple alert, please click OK to accept");
}
</script>
</body>
</html>
Ниже приведен пример использования метода switch_to
. В данном случае switch_to.alert
используется для перехода к всплывающему окну алерта. После этого алерт принимается методом alert.accept()
.
from selenium import webdriver
import time
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from builtins import str
driver = webdriver.Firefox()
driver.get("file://<HTML File location>")
driver.find_element_by_name("submit").click()
sleep(5)
alert = driver.switch_to.alert
text_in_alert = alert.text
print ("The alert message is "+ text_in_alert)
sleep(10)
alert.accept()
print("Alert test is complete")
driver.close()
Способ №4 – Работа с динамическим контентом
Современные веб-сайты часто удивляют нас своей динамикой и изменчивостью. Это особенно актуально для приложений, использующих технологию AJAX.
Вспомним, например, интернет-магазины. Такие сайты часто подстраиваются под каждого пользователя, показывая товары, зависящие от местоположения или предыдущего выбора клиента. И, когда мы тестируем подобные сайты, важно удостовериться, что WebDriver продолжает свою работу, когда все элементы страницы загружены полностью.
Проблемы могут возникнуть, если элементы на динамических страницах появляются в разные моменты времени и WebDriver попытается обратиться к ним, когда они еще не существуют в структуре документа. Но здесь нам помогут команды ожидания (wait) в Selenium.
С помощью "Явного ожидания" (Explicit Wait) тестировщик может указать WebDriver, чтобы он приостановил выполнение тестов до тех пор, пока не выполнится определенное условие. И если потребуется ожидание в течение определенного периода времени, для этого мы можем использовать функцию thread.sleep()
.
Приведу ниже пример. Допустим, у нас есть два поиска на сайте https://www.browserstack.com/. Первый поиск элемента под названием home-btn
. Мы находим его с использованием атрибута CLASS_NAME
, но не более чем в течение 5 секунд.
Второй поиск выполняется для кликабельного элемента login
, и опять же, мы ждем не более 5 секунд. Если элемент появился, то над ним выполняется действие click()
.
В обоих случаях мы используем WebDriverWait вместе с ExpectedCondition.
from selenium import webdriver
from time import sleep
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get("https://www.browserstack.com/")
try:
myElem_1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'home-btn')))
#element = driver.find_element_by_partial_link_text("START TESTING")
print("Element 1 found")
myElem_2 = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'login')))
print("Element 2 found")
myElem_2.click()
sleep(10)
#except NoSuchElementException:
except TimeoutException:
print("No element found")
sleep(10)
driver.close()
Способ №5 – Работа с выпадающими меню
Давайте начнем с понимания основ этой темы.
Для работы с выпадающими меню в Selenium WebDriver используется класс Select
. Он позволяет осуществлять выбор и снимать его с опций в выпадающем меню. Чтобы создать объекты типа Select их нужно инициализировать, передавая в конструктор элемент выпадающего меню (WebElement) в качестве параметра.
Вот пример использования:
WebElement testDropDown = driver.findElement(By.id("testingDropdown"));
Select dropdown = new Select(testDropDown);
Существует три способа выбора опции из выпадающего меню:
1. selectByIndex
– позволяет выбрать опцию по индексу, начиная с 0.
dropdown.selectByIndex(5);
2. selectByValue
- используется для выбора опции на основе ее атрибута 'value' ('значение').
dropdown.selectByValue("Database");
3. selectByVisibleText
- используется для выбора опции на основе текста над ней.
dropdown.selectByVisibleText("Database Testing");
Применяйте описанные выше методы, чтобы сделать ваши тесты с Selenium более удобными, организованными и менее затратными по времени. Кроме того, здесь важно выбрать платформу на основе Selenium, которая облегчит автоматизированное тестирование. Обратите внимание на инструменты, которые позволяют проводить тестирование в облаке на реальных устройствах, такие как BrowserStack. Этот инструмент предназначен для упрощения жизни тестировщиков, предоставляя ресурсы, ориентированные на разработчиков, такие как встроенные средства разработки и интеграция с популярными языками программирования и фреймворками. Таким образом, автоматизированное тестирование с использованием Selenium становится более быстрым, плавным и комфортным, ориентированным на результат.
В заключение приглашаем всех заинтересованных на открытый урок по теме «Java Generics и их роль в автоматизации». Записаться на урок можно на странице курса "Java QA Engineer. Professional".
Комментарии (4)
Argem
17.08.2023 06:09+3Первые два вообще не относятся к Selenium. Это работа с TestNG.
Оставшиеся 3 это вообще основа основ. Какие тут советы?
Да и написано языком таким, что человек сам явно не работал с этим, а значит это рерайт.
Зато сразу 7 добавили в избранное. Явно работники Otus.
Документация по Selenium и TestNG намного полезнее этих "советов".
Замечательного качества статья, одобряю.iBljad
17.08.2023 06:09Там указано, что это перевод, но видно, что скопировал (и не поправил ошибки типа отступов в питоне) человек, не знакомый с темой
sspotanin
17.08.2023 06:09Забавно, что trick перевели как "способ", в итоге получаем 5 способов делать несвязные вещи.
levende1
sleep(10) — вы это серьёзно рекомендуете? А если элемент за эти 10 миллисекунд так и не появится? В селениуме есть и более удобные способы сделать explicit wait https://www.selenium.dev/documentation/webdriver/waits/#explicit-waits