Selenium + Java

Contents
Introduction
Подключить Selenium к проекту IntelliJ
Подключить драйвер браузера
Поиск элементов. Пример
Переключатели
Флажки
Выпадающие списки
Таблицы
Дождаться загрузки элемента
Errors
Подключить JUnit к проекту IntelliJ IDEA

Introduction

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

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

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

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

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

Добавление Selenium в проект IntelliJ image from website www.aredel.com

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

Добавление Selenium в проект IntelliJ image from website www.aredel.com

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

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

Добавление Selenium в проект IntelliJ image from website www.aredel.com

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

Нажмите OK

Добавление Selenium в проект IntelliJ image from website www.aredel.com

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

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

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

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

Простой тест

To убедиться, что 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;

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

import org.openqa.selenium.WebElement;

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

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

Изучите страницу www.eth1.ru/selenium/basic_test/ or www.eth1.ru/selenium/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.eth1.ru/selenium/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.eth1.ru/selenium/basic_test/"); WebElement renovationLink = driver.findElements(By.linkText("Renovation")).get(0); renovationLink.click();

Будем искать ссылку, то есть 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.eth1.ru/selenium/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.eth1.ru/selenium/basic_test/"); WebElement imageLink = driver.findElements(By.tagName("img")).get(1); imageLink.click(); } }

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

Нужно найти на странице www.eth1.ru/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.eth1.ru/selenium/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.eth1.ru/selenium/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.eth1.ru/selenium/basic_test/"); WebElement checkbox = driver.findElement(By.id("cerseiId")); checkbox.click(); } }

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

Нужно найти на странице www.eth1.ru/selenium/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.eth1.ru/selenium/basic_test/"); WebElement selectElement = driver.findElement(By.id("swords")); Select select = new Select(selectElement); select.selectByVisibleText("Dawn"); } }

Таблицы

Нужно найти на странице www.eth1.ru/selenium/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.eth1.ru/selenium/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()); } }

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

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

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

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.eth1.ru/search.php"); try { WebElement yandexField = wait.until(presenceOfElementLocated(By.name("text"))); yandexField.sendKeys("python"); } 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

Статьи о Java
JUnit
Share in social media: