Selenium + Java
Введение
В этой статье вы можете познакомиться с базовыми возможностями связки
Selenium + Java
Там где приведён код я часто делаю лишние переносы строк, чтобы он влезал в экран.
Если код слишком длинный - пользуйтесь полосой прокрутки снизу.
Подключить Selenium к проекту IntelliJ
Зайдите на
www.selenium.dev/downloads/
Найдите среди доступных языков
Java
и кликните на
Download
Распакуйте архив. Содержимое будет примерно таким
Откройте ваш проект в IntelliJ и нажмите File → Project Structure
Выберите Modules, затем нажмите на плюс справа и выберите 1. JARs or directories…
Перейдите в папку, в которую вы только что распаковали архив и выделите все .jar файлы из корня
и из подпапки libs
Нажмите OK
Переходите к следующей главе
Подключить драйвер браузера
На каком бы языке программирования вы ни писали код операция
по подключению драйвера браузера примерно одинакова.
Прочитать об этом вы можете в статье
«Подключение драйвера браузера в 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/qa/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/qa/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/qa/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/qa/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/qa/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/qa/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/qa/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/qa/ui/basic_test/");
WebElement checkbox =
driver.findElement(By.id("cerseiId"));
checkbox.click();
}
}
Выпадающие списки
Нужно найти на странице
www.urn.su/qa/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/qa/ui/basic_test/");
WebElement selectElement =
driver.findElement(By.id("swords"));
Select select = new Select(selectElement);
select.selectByVisibleText("Dawn");
}
}
Таблицы
Нужно найти на странице
www.urn.su/qa/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/qa/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 |