// https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
implementation 'org.seleniumhq.selenium:selenium-java:4.2.2'
implementation 'io.github.bonigarcia:webdrivermanager:5.2.0'
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
driver = new ChromeDriver(options);
driver.quit();
EdgeOptions options = new EdgeOptions();
driver = new EdgeDriver(options);
driver.quit();
FirefoxOptions options = new FirefoxOptions();
driver = new FirefoxDriver(options);
driver.quit();
Рекомендуется использовать 32-bit версию драйвера.
InternetExplorerOptions options = new InternetExplorerOptions();
driver = new InternetExplorerDriver(options);
driver.quit();
Microsoft Edge можно использовать в режиме совместимости с IE с помощью драйвера IE.
InternetExplorerOptions options = new InternetExplorerOptions();
options.attachToEdgeChrome();
options.withEdgeExecutablePath("/path/to/edge/browser");
driver = new InternetExplorerDriver(options);
driver.quit();
Поскольку драйвер Opera не поддерживает синтаксис w3c, а основан на Chromium, рекомендуется управлять браузером Opera с помощью chromedriver.
ChromeOptions options = new ChromeOptions();
options.setBinary("/path/to/opera/browser");
driver = new ChromeDriver(options);
driver.quit();
Чтобы включить автоматизацию в Safari, выполните следующую команду из терминала:
safaridriver --enable
SafariOptions options = new SafariOptions();
driver = new SafariDriver(options);
driver.quit();
driver = new ChromeDriver();
driver.get("https://google.com");
String title = driver.getTitle();
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
WebElement searchBox = driver.findElement(By.name("q"));
WebElement searchButton = driver.findElement(By.name("btnK"));
searchBox.sendKeys("Selenium");
searchButton.click();
String value = searchBox.getAttribute("value");
Задает имя браузера который нужно запустить
Задает версию браузера. Можно не указывать.
При переходе на новую страницу через URL, по умолчанию Selenium ждет пока страница будет загружена, выполняется проверка через js: document.readyStatus
должен равняться complete
. Однако для некоторых случаев, например для одностраничных сайтов, не имеет смысла ждать пока загрузится вся страница, так как элементы подгружаются динамически. В этом случае можно изменить этот параметр.
при изменении pageLoadStrategy обратите внимание, что стратегия ожидания (implicit/explicit wait) настроена, чтобы компенсировать нестабильность прогонов;
Может иметь одно из 3 значений: normal, eager, none;
Strategy | Ready State | Note |
---|---|---|
normal | complete | Используется по умолчанию; ждет пока все ресурсы страницы будут загружены |
eager | interactive | Доступ к DOM загрузился, но остальные ресурсы например картинки могут еще подгружаться |
none | Any | Не делает проверку загрузки ресурсов страницы |
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NORMAL);
WebDriver driver = new ChromeDriver(chromeOptions);
Задает имя операционной системы необходимой для запуска
Выполняется проверка сертификата безопасности сайта(TLS Certificate);
если выбрано false
- то при наличии на сайте просроченного или невалидного сертификата будет выбрасываться исключение;
если выбрано true
- все сертификаты даже небезопасные будут считаться валидными
После установки опции acceptInsecureCerts будет работать для все сессии.
Selenium устанавливает определенные интервалы в течение которого пользователь может взаимодействовать с сайтом;
Задает поведение когда открывается диалоговое окно системы Может иметь следущие значения:
По умолчанию dismiss and notify.
Эта опция указывает должна ли применяться строгая проверка видимости поля input с атрибутом type="file". Так как строгая проверка по умолчанию отключена, это может влиять на работу метода element.sendKeys при работе со скрытым элементом управления.
Прокси-сервер - это посредник для запросов между клиентом и сервером. Трафик проходит через прокси-сервер на пути к запрошенному адресу и обратно.
Proxy proxy = new Proxy();
proxy.setHttpProxy("<HOST:PORT>");
ChromeOptions options = new ChromeOptions();
options.setCapability("proxy", proxy);
WebDriver driver = new ChromeDriver(options);
Можно установить кастомный профиль с нужными настройками
FirefoxProfile profile = new FirefoxProfile();
FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile);
driver = new RemoteWebDriver(options);
В некоторых окружениях Internet Explorer может с задержкой открывать окно Загрузка Файла. IEDriver по умолчанию устанавливает timeout ожидания этого окна в 1_000мс, но с помощью опции fileUploadDialogTimeout это время можно увеличить
InternetExplorerOptions options = new InternetExplorerOptions();
options.waitForUploadDialogUpTo(Duration.ofSeconds(2));
WebDriver driver = new RemoteWebDriver(options);
Если установлено в true - то кеш, история браузера и файлы cookie будут очищены для всех экземпляров Internet Explorer(в том числе запущенных вручную). По умолчанию false. При использовании этой опции при запуске браузера, дайвер будет ждать очистки кеша.
InternetExplorerOptions options = new InternetExplorerOptions();
options.destructivelyEnsureCleanSession();
WebDriver driver = new RemoteWebDriver(options);
Драйвер InternetExplorer ожидает, что уровень масштабирования браузера будет равен 100%, иначе драйвер выдаст исключение. Это поведение по умолчанию можно отключить, установив для ignoreZoomSetting значение true.
InternetExplorerOptions options = new InternetExplorerOptions();
options.ignoreZoomSettings();
WebDriver driver = new RemoteWebDriver(options);
Если Protected Mode не включен и настройки защищенного режима не одинаковы для всех зон, драйвером будет выдано исключение.
Если установлено значение true, драйвер будет игнорировать эту настройку, но тесты могут работать нестабильно, переставать отвечать или браузеры могут зависать.
InternetExplorerOptions options = new InternetExplorerOptions();
options.introduceFlakinessByIgnoringSecurityDomains();
WebDriver driver = new RemoteWebDriver(options);
Если установлено значение true, эта опция игнорирует диагностические выходные данные IEDriverServer.
InternetExplorerOptions options = new InternetExplorerOptions();
options.setCapability("silent", true);
WebDriver driver = new InternetExplorerDriver(options);
Internet Explorer включает несколько параметров командной строки, которые позволяют устранять неполадки и настраивать браузер.
Ниже описаны несколько поддерживаемых параметров командной строки.
ForceCreateProcessApi должен быть включен для того, чтобы аргументы командной строки работали.
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
public class ieTest {
public static void main(String[] args) {
InternetExplorerOptions options = new InternetExplorerOptions();
options.useCreateProcessApiToLaunchIe();
options.addCommandSwitches("-k");
InternetExplorerDriver driver = new InternetExplorerDriver(options);
try {
driver.get("https://google.com/ncr");
Capabilities caps = driver.getCapabilities();
System.out.println(caps);
} finally {
driver.quit();
}
}
}
Принудительно запускает Internet Explorer с помощью API CreateProcess. Значение по умолчанию false. Для IE 8 и более поздних версий этот параметр требует, чтобы для параметра реестра "TabProcGrowth" было установлено значение 0.
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
public class ieTest {
public static void main(String[] args) {
InternetExplorerOptions options = new InternetExplorerOptions();
options.useCreateProcessApiToLaunchIe();
InternetExplorerDriver driver = new InternetExplorerDriver(options);
try {
driver.get("https://google.com/ncr");
Capabilities caps = driver.getCapabilities();
System.out.println(caps);
} finally {
driver.quit();
}
}
}
driver.getTitle();
driver.getCurrentUrl();
//Convenient
driver.get("https://selenium.dev");
//Longer way
driver.navigate().to("https://selenium.dev");
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
String text = alert.getText();
alert.accept();
alert.dismiss();
alert.sendKeys("Selenium");
Прежде чем выставлять куки нужно перейти на страницу сайта для которого нужно применить куки. Еслистраница долго грузится можно перейти на какую нибудь легковесную, например, страница с ошибкой 404.
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class addCookie {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
try {
driver.get("http://www.example.com");
// Adds the cookie into current browser context
driver.manage().addCookie(new Cookie("key", "value"));
} finally {
driver.quit();
}
}
}
Предназначенно для предотвращения подделки межсайтовых запросов (CSRF).
Работает только для Chrome(версия 80+) и Firefox(версия 79+) в Selenium 4 и более поздних.
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class cookieTest {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
try {
driver.get("http://www.example.com");
Cookie cookie = new Cookie.Builder("key", "value").sameSite("Strict").build();
Cookie cookie1 = new Cookie.Builder("key", "value").sameSite("Lax").build();
driver.manage().addCookie(cookie);
driver.manage().addCookie(cookie1);
System.out.println(cookie.getSameSite());
System.out.println(cookie1.getSameSite());
} finally {
driver.quit();
}
}
}
Фреймы — это устаревшее средство создания макета сайта из нескольких документов в одном домене. Вы вряд ли будете работать с ними, если вы не работаете с веб-приложением до HTML5.
Фреймы iframe позволяют вставлять документ из совершенно другого домена и до сих пор широко используются.
WebElement iframe = driver.findElement(By.cssSelector("#modal>iframe"));
//Switch to the frame
driver.switchTo().frame(iframe);
//Using the ID
driver.switchTo().frame("buttonframe");
//Or using the name instead
driver.switchTo().frame("myframe");
// Switches to the second frame
driver.switchTo().frame(1);
// Return to the top level
driver.switchTo().defaultContent();
driver.getWindowHandle();
String originalWindow = driver.getWindowHandle();
//Check we don't have other windows open already
assert driver.getWindowHandles().size() == 1;
//Click the link which opens in a new window
driver.findElement(By.linkText("new window")).click();
//Wait for the new window or tab
wait.until(numberOfWindowsToBe(2));
//Loop through until we find a new window handle
for (String windowHandle : driver.getWindowHandles()) {
if(!originalWindow.contentEquals(windowHandle)) {
driver.switchTo().window(windowHandle);
break;
}
}
//Wait for the new tab to finish loading content
wait.until(titleIs("Selenium documentation"));
// Opens a new tab and switches to new tab
driver.switchTo().newWindow(WindowType.TAB);
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
//Close the tab or window
driver.close();
//Switch back to the old tab or window
driver.switchTo().window(originalWindow);
driver.quit();
Выдает размер в пикселях
//Access each dimension individually
int width = driver.manage().window().getSize().getWidth();
int height = driver.manage().window().getSize().getHeight();
//Or store the dimensions and query them later
Dimension size = driver.manage().window().getSize();
int width1 = size.getWidth();
int height1 = size.getHeight();
driver.manage().window().setSize(new Dimension(1024, 768));
// Access each dimension individually
int x = driver.manage().window().getPosition().getX();
int y = driver.manage().window().getPosition().getY();
// Or store the dimensions and query them later
Point position = driver.manage().window().getPosition();
int x1 = position.getX();
int y1 = position.getY();
// Move the window to the top left of the primary monitor
driver.manage().window().setPosition(new Point(0, 0));
driver.manage().window().maximize();
driver.manage().window().minimize();
driver.manage().window().fullscreen();
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.*;
import org.openqa.selenium.*;
public class SeleniumTakeScreenshot {
public static void main(String args[]) throws IOException {
WebDriver driver = new ChromeDriver();
driver.get("http://www.example.com");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("./image.png"));
driver.quit();
}
}
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.IOException;
public class SeleniumelementTakeScreenshot {
public static void main(String args[]) throws IOException {
WebDriver driver = new ChromeDriver();
driver.get("https://www.example.com");
WebElement element = driver.findElement(By.cssSelector("h1"));
File scrFile = element.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("./image.png"));
driver.quit();
}
}
//Creating the JavascriptExecutor interface object by Type casting
JavascriptExecutor js = (JavascriptExecutor)driver;
//Button Element
WebElement button =driver.findElement(By.name("btnLogin"));
//Executing JavaScript to click on element
js.executeScript("arguments[0].click();", button);
//Get return value from script
String text = (String) js.executeScript("return arguments[0].innerText", button);
//Executing JavaScript directly
js.executeScript("console.log('hello world')");
Необходимо чтобы Chromium браузер был в режиме headless
import org.openqa.selenium.print.PrintOptions;
driver.get("https://www.selenium.dev");
printer = (PrintsPage) driver;
PrintOptions printOptions = new PrintOptions();
printOptions.setPageRanges("1-2");
Pdf pdf = printer.print(printOptions);
String content = pdf.getContent();
## Элементы
### Локаторы
#### Относительные локаторы (Selenium 4)
##### Above
```java
By emailLocator = RelativeLocator.with(By.tagName("input")).above(By.id("password"));
By passwordLocator = RelativeLocator.with(By.tagName("input")).below(By.id("email"));
By cancelLocator = RelativeLocator.with(By.tagName("button")).toLeftOf(By.id("submit"));
By submitLocator = RelativeLocator.with(By.tagName("button")).toRightOf(By.id("cancel"));
By emailLocator = RelativeLocator.with(By.tagName("input")).near(By.id("lbl-email"));
WebElement vegetable = driver.findElement(By.className("tomatoes"));
// не оптимальный способ
WebElement fruits = driver.findElement(By.id("fruits"));
WebElement fruit = fruits.findElement(By.id("tomatoes"));
// так лучше
WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes"));
List<WebElement> plants = driver.findElements(By.tagName("li"));
Активный элемент - на котором фокус.
driver.switchTo().activeElement()
driver.findElement(By.name("button")).click();
driver.findElement(By.name("q")).sendKeys("q" + Keys.ENTER);
WebElement searchInput = driver.findElement(By.name("q"));
searchInput.sendKeys("selenium");
// Clears the entered text
searchInput.clear();
boolean isButtonVisible = driver.findElement(By.css("[name='login']")).isDisplayed();
boolean value = driver.findElement(By.name("btnK")).isEnabled();
boolean value = driver.findElement(By.cssSelector("input[type='checkbox']:first-of-type")).isSelected();
String value = driver.findElement(By.cssSelector("h1")).getTagName();
Rectangle res = driver.findElement(By.cssSelector("h1")).getRect();
// Rectangle class provides getX,getY, getWidth, getHeight methods
System.out.println(res.getX());
String cssValue = driver.findElement(By.linkText("More information...")).getCssValue("color");
String text = driver.findElement(By.cssSelector("h1")).getText();
import org.openqa.selenium.support.ui.Select;
WebElement selectElement = driver.findElement(By.id("selectElementID"));
Select selectObject = new Select(selectElement);
// Select an <option> based upon the <select> element's internal index
selectObject.selectByIndex(1);
// Select an <option> based upon its value attribute
selectObject.selectByValue("value1");
// Select an <option> based upon its text
selectObject.selectByVisibleText("Bread");
// Return a List<WebElement> of options that have been selected
List<WebElement> allSelectedOptions = selectObject.getAllSelectedOptions();
// Return a WebElement referencing the first selection option found by walking down the DOM
WebElement firstSelectedOption = selectObject.getFirstSelectedOption();
// Return a List<WebElement> of options that the <select> element contains
List<WebElement> allAvailableOptions = selectObject.getOptions();
// Deselect an <option> based upon the <select> element's internal index
selectObject.deselectByIndex(1);
// Deselect an <option> based upon its value attribute
selectObject.deselectByValue("value1");
// Deselect an <option> based upon its text
selectObject.deselectByVisibleText("Bread");
// Deselect all selected <option> elements
selectObject.deselectAll();
Boolean doesThisAllowMultipleSelections = selectObject.isMultiple();
FirefoxOptions firefoxOptions = new FirefoxOptions();
WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
driver.get("http://www.google.com");
driver.quit();
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability("browserVersion", "67");
chromeOptions.setCapability("platformName", "Windows XP");
WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
driver.get("http://www.google.com");
driver.quit();
Позволяет загружать файл с клиентской машины на удаленную. Нужно для загрузки файлов на сайт.
driver.setFileDetector(new LocalFileDetector());
driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
WebElement upload = driver.findElement(By.id("myfile"));
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");