Selenium + Java

Содержание
Введение
Подключить Selenium к проекту IntelliJ
Подключить драйвер браузера
Поиск элементов. Пример
Переключатели
Флажки (checkbox)
Выпадающие списки
Таблицы
Дождаться загрузки элемента
Похожие статьи

Введение

В этой статье вы можете познакомиться с базовыми возможностями связки Selenium + Java

Там где приведён код я часто делаю лишние переносы строк, чтобы он влезал в экран. Если код слишком длинный - пользуйтесь полосой прокрутки снизу.

Подключить Selenium к проекту IntelliJ

Зайдите на www.selenium.dev/downloads/

Найдите среди доступных языков Java и кликните на Download

Добавление Selenium в проект IntelliJ изображение с сайта www.andreyolegovich.ru

Добавить в IntelliJ

Распакуйте архив. Содержимое будет примерно таким

Добавление Selenium в проект IntelliJ изображение с сайта www.andreyolegovich.ru

Содержимое архива

Откройте ваш проект в IntelliJ и нажмите FileProject Structure

Выберите Modules, затем нажмите на плюс справа и выберите 1. JARs or directories…

Добавление Selenium в проект IntelliJ изображение с сайта www.andreyolegovich.ru

Modules

Перейдите в папку, в которую вы только что распаковали архив и выделите все .jar файлы из корня и из подпапки libs

Нажмите OK

Добавление Selenium в проект IntelliJ изображение с сайта www.andreyolegovich.ru

Содержимое архива

Переходите к следующей главе

Подключить драйвер браузера

На каком бы языке программирования вы ни писали код операция по подключению драйвера браузера примерно одинакова.

Прочитать об этом вы можете в статье «Подключение драйвера браузера в Selenium»

Простой тест

Чтобы убедиться, что Selenium подключён успешно - вставьте следующий код и скомпилируйте его.

На забудьте добавить путь до драйвера в системную переменную PATH о том как это сделать можете прочитать в статье «Основы Selenium»

import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class Main { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); } }

Если Вы не хотите или не можете отредактировать переменную PATH попробуйте зарегистирировать путь до драйвера - перед строкой WebDriver driver = … вставьте

System.setProperty("webdriver.gecko.driver", "C:/webdrivers/geckodriver.exe");

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

О том как это сделать можете прочитать в статье «Основы Selenium»

Прежде всего нужно подключить By в Java это делается следующим образом:

import org.openqa.selenium.By;

Часто бывает недостаточно просто найти элемент. Чтобы совершать над найденным какие-то действия подключите WebElement

import org.openqa.selenium.WebElement;

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

Небольшой пример поиска элементов.

Изучите страницу www.urn.su/ui/basic_test/

Цели теста:

1. Заполнить форму «Сайт» и нажать на кнопку «Перейти»

2. Кликнуть на первую ссылку с текстом «Renovation»

3. Кликнуть на второй элемент с текстом «Italy»

4. Кликнуть на второе изображение

Сделать это всё разными способами

Заполенение простой формы

Воспользуемся самым надёжным методом - по id. Изучив исходный код страницы вы увидите следующий код

<input type="text" id="name1" name="url1">

Следовательно, нужный id это name1

import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class webDriverDemo1 { public class main(String[] args) { WebDriver driver = new ChromeDriver(); // 1. По id driver.get("http://www.urn.su/ui/basic_test/"); WebElement searchField = driver.findElement(By.id("name1")); searchField.sendKeys("topbicycle.ru"); searchField.submit(); } }

Клик на ссылку - поиск по тексту

С помощью linkText найдём все ссылки с текстом Renovation, выберем первую и кликнем на неё.

import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class webDriverDemo1 { public class main(String[] args) { WebDriver driver = new ChromeDriver(); // 2. По linkText driver.get("http://www.urn.su/ui/basic_test/"); WebElement renovationLink = driver.findElements(By.linkText("Renovation")).get(0); renovationLink.click(); } }

Клик на ссылку - поиск по CSS селектору

У всех ссылок в этом примере тоже одинаковый текст - Italy. Но нам нельзя пользоваться одним и тем же приёмом, поэтому изучим код страницы и выясним, что у нужной ссылки есть класс march8

Будем искать ссылку, то есть cssSelector a, с классом march8

import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class webDriverDemo1 { public class main(String[] args) { WebDriver driver = new ChromeDriver(); // 3. По cssSelector driver.get("http://www.urn.su/ui/basic_test/"); WebElement march8Link = driver.findElements(By.cssSelector("a[class=march8]")).get(0); march8Link.click(); } }

Клик на изображение

Теперь разберёмся с картинкой. Воспользуемся поиском по тэгу.

import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class webDriverDemo1 { public class main(String[] args) { WebDriver driver = new ChromeDriver(); // 4. По tagName driver.get("http://www.urn.su/ui/basic_test/"); WebElement imageLink = driver.findElements(By.tagName("img")).get(1); imageLink.click(); } }

Изображение баннера

Переключатели

Нужно найти на странице www.urn.su/IT/selenium/basic_test/ переключатель и поставить его в положение Lannister

В качестве проверки вывести в терминал содержимое.

Я пользовался списком, поэтому импортировал import java.util.List;

В этом примере пользуюсь Firefox

import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import java.util.List; public class WebDriverRadioButtons { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.urn.su/ui/basic_test/"); List<WebElement> radioButtons = driver.findElements(By.name("house")); radioButtons.get(1).click(); for (WebElement radioButton : radioButtons) { if (radioButton.isSelected()) { System.out.println(radioButton.getAttribute("value")); } } } }

Флажки

Нужно найти на странице www.urn.su/ui/basic_test/ флажки и отметить Cersei

Изучив код страницы можно понять, что у нужного элемента прописан id, поэтому найти его очень просто.

import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class WebDriverCheckboxes { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.urn.su/ui/basic_test/"); WebElement checkbox = driver.findElement(By.id("cerseiId")); checkbox.click(); } }

Выпадающие списки

Нужно найти на странице www.urn.su/ui/basic_test/ флажки и выбрать Dawn

Я буду использовать Select, поэтому нужно предварительно подлючить import org.openqa.selenium.support.ui.Select;

import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.Select; public class WebDriverSelectItems { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.urn.su/ui/basic_test/"); WebElement selectElement = driver.findElement(By.id("swords")); Select select = new Select(selectElement); select.selectByVisibleText("Dawn"); } }

Таблицы

Нужно найти на странице www.urn.su/ui/basic_test/ таблицу. Во внешнюю таблицу вложена внутренняя. Нужно добраться до элемента в третьей строке вложенной таблицы. Для проверки выведем содержимое этого элемента в терминал.

Обратите внимание на строки 14, 15 и 16. Сначала драйвер находит внешнюю таблицу, затем я уже не вызываю driver, а ищу только во внешней таблице, а затем только во внутренней таблице.

import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class WebDriverTables { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.urn.su/ui/basic_test/"); WebElement outerTable = driver.findElement(By.tagName("table")); WebElement innerTable = outerTable.findElement(By.tagName("table")); WebElement row = innerTable.findElements(By.tagName("td")).get(2); System.out.println(row.getText()); } }

Дождаться появления элемента

Элементы могут подгружаться на страницу с разной скоростью. Чтобы избавить себя от лишней головной боли нужно по максимуму использовать возможности Selenium

В следующем примере вы можете посетить страницу поиска по сайту urn.su дождаться когда подгрузится скрипт от Яндекса, вставить в поиск слово java ,исключительно для подстраховки дождаться когда подгрузится кнопка Найти и нажать на неё.

import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.WebDriverWait; import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated; public class WebDriverExplicitWait { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); // explicit wait WebDriverWait wait = new WebDriverWait(driver, 50); driver.get("http://www.urn.su/search.php"); try { WebElement yandexField = wait.until(presenceOfElementLocated(By.name("text"))); yandexField.sendKeys("java"); } catch (Exception e) { e.printStackTrace(); } try { WebElement yButton = wait.until(presenceOfElementLocated(By.className("ya-site-form__submit"))); yButton.click(); } catch (Exception e) { e.printStackTrace(); } } }

Implicit Wait

Время ожидания заданное с помощью Implicit Wait, это глобальная настройка для WebDriver. Каждый раз когда нужно найти элемент на странице WebDriver будет искать либо пока не найдёт либо пока не пройдёт это время.

Через каждые 500 мс WebDriver будет обращаться к DOM на предмет наличия нужного элемента.

Explicit Wait

Явное ожидание в Selenium используется для указания веб-драйверу дождаться определенных условий (Ожидаемые условия) или превышения максимального времени, прежде чем выдавать исключение “ElementNotVisibleException”. Это интеллектуальный вид ожидания, но он может быть применен только к указанным элементам. Это дает лучшие возможности, чем неявное ожидание, поскольку оно ожидает динамически загружаемых элементов Ajax.

Как только мы объявляем явное ожидание, мы должны использовать “ExpectedConditions” или мы можем настроить, как часто мы хотим проверять условие, используя Fluent Wait. В наши дни при реализации мы используем Thread.Sleep() как правило, не рекомендуется использовать

Похожие статьи
Selenium
Selenium Java
Ошибки
Подключить JUnit к проекту IntelliJ IDEA
Тестирование ПО
Учебник по тестированию
Тестирование API

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: