Справочник Selenium Java
Я пишу эту статью, чтобы поделиться общими фрагментами кода автоматизации Selenium. Надеюсь, что этот источник станет служить вам справочником, на который можно ссылаться, когда вы добавляете несколько новых скриптов в свою существующую среду автоматизации или готовитесь к собеседованию.
1. Декларация WebDriver
System.setProperty(“webdriver.chrome.driver”, “/Users/username/Downloads”);
WebDriver driver = new ChromeDriver();
Вы можете узнать здесь, зачем нам нужен вышеуказанный код. Делюсь несколькими скриншотами ниже для лучшего понимания.
2. Поиск элементов
Ниже приведён HTML-код для одного текстового поля ввода:
<input type="text" id="first_name" name="first_name" class="first_name input mb1" placeholder="First Name">
a. Поиск по ID:
driver.findElement(By.Id("first-name"));
b. Поиск по Xpath:
driver.findElement(By.xpath("//input[@name='first_name']"));
c. Поиск по CSS-селекторам:
driver.findElement(By.cssSelector("input.first_name"));
d. Поиск по классу:
driver.findElement(By.className(".first_name"));
e. Поиск по тегу:
driver.findElement(By.tagName("input"));
f. Поиск по Name:
driver.findElement(By.name("first_name"));
g. Поиск гиперссылок:
Пожалуйста, найдите HTML-элемент ниже:
<a class="jfHeader-menuListLink" href="https://phptravels.com/demo" xpath="1">Demo Here</a>
i. Текст ссылки
driver.findElement(By.linkText("Demo Here"));
ii. Частичный текст ссылки
driver.findElement(By.partialLinkText("Demo"));
3. Выпадающий список, флажки и переключатели
a. Выпадающий список статического одиночного выбора
Пожалуйста, найдите HTML-код для статического выпадающего списка ниже:
<h3>Dropdown List</h3>
<select id="dropdown">
<option value="" disabled="disabled" selected="selected">
Please select an option </option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</select>
Ознакомьтесь с фрагментом кода Selenium ниже:
import org.openqa.selenium.support.ui.Select;
Select option = new Select(driver.findElement(By.id("dropdown")));
option.selectByIndex(1);
b.Статический выпадающий список с несколькими вариантами выбора
Пожалуйста, найдите HTML-код для статического выпадающего списка с несколькими вариантами выбора ниже:
<h3>Dropdown List</h3>
<select multiple="" id="options">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
</select>
Пожалуйста, ознакомьтесь с фрагментом кода Selenium ниже:
import org.openqa.selenium.support.ui.Select;
Select options = new Select(driver.findElement(By.id("options")));
options.selectByVisibleText("Option 1");
options.selectByIndex(1);
Существует несколько способов выбора статического выпадающего списка с одним или несколькими вариантами выбора, которые приведены ниже:
- selectByIndex(int IndexOfElement)
- selectByValue(String Value)
- selectByVisibleText(String Text)
Существует несколько способов отменить выбор статического выпадающего списка с одним или несколькими вариантами выбора, которые приведены ниже:
- deselectByIndex(int IndexOfElement)
- deselectByValue(String Value)
- deselectByVisibleText(String Text)
e. Флажки
Пожалуйста, найдите HTML-код для флажков ниже:
<h2 style="text-align: left;">
Check Boxes</h2>
My favourite colors are:<br />
<input name="color" type="checkbox" value="red" />
Red<br />
<input name="color" type="checkbox" value="yellow" />
Yellow<br />
<input name="color" type="checkbox" value="blue" />
Blue<br />
<input name="color" type="checkbox" value="orange" />
Orange<br />
<input name="color" type="checkbox" value="green" />
Green<br />
<input name="color" type="checkbox" value="purple" />
Purple<br />
Пожалуйста, найдите фрагмент кода Selenium для флажков ниже:
WebElement redColor = driver.findElement(By.xpath("//input[@value='red']"));
redColor.click();
f. Кнопка переключения
Пожалуйста, ознакомьтесь с HTML-кодом ниже:
<h2 style="text-align: left;">
Radio Buttons</h2>
<div>
Your current web browser is:<br />
<input checked="" name="browser" type="radio" value="IE" />
Internet Explorer<br />
<input name="browser" type="radio" value="Mozilla" />
Mozilla<br />
<input name="browser" type="radio" value="Opera" />
Opera<br />
<br /></div>
Пожалуйста, ознакомьтесь с фрагментом кода Selenium для переключателей ниже:
driver.findElement(By.xpath("//input[@value='Mozilla']")).click();
4. Ожидание
a. Неявное ожидание
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
b. Явное ожидание
WebDriver driver = new ChromeDriver();
driver.get("https://google.com/ncr");
driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
// Initialize and wait till element(link) became clickable - timeout in 10 seconds
WebElement firstResult = new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath("//a/h3")));
// Print the first result
System.out.println(firstResult.getText());
Пожалуйста, обратите внимание, что не следует смешивать неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к возникновению тайм-аута через 20 секунд.
c. Свободное ожидание
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(driver -> {
return driver.findElement(By.id("foo"));
});
5. Работа с различными окнами
- Чтобы получить дескриптор текущего окна — driver.getWindowHandle()
- Чтобы получить все дескрипторы окна — driver.getWindowHandles()
6. Класс действий
a. Действие мыши
- click() — Щёлкает по текущему местоположению курсора
- DoubleClick() — Двойной щелчок по текущему местоположению курсора
- contextClick() — Щелчок правой кнопкой мыши по текущему местоположению курсора
- DragAndDrop(источник WebElement, цель WebElement) — Перетаскивает элемент из одного местоположения в другое
- moveToElement(цель WebElement) — Перемещает элемент
b. Действие с клавиатуры
- keyUp(WebElement target, java.lang.CharSequence key) — освобождает ключ после фокусировки на целевом элементе
- keyDown(WebElement target, java.lang.CharSequence key) — выполняет нажатие клавиши после фокусировки на целевом элементе
- SendKeys(WebElement target, java.lang.CharSequence… keys) — вводит последовательность клавиш
Фрагмент кода Selenium:
i. Пример сочетания действий
Actions builder = new Actions(driver);
Action seriesOfActions = builder
.moveToElement(textField)
.click()
.keyDown(txtUsername, Keys.SHIFT)
.sendKeys(txtUsername, "testingbot")
.keyUp(txtUsername, Keys.SHIFT)
.doubleClick(txtUsername)
.contextClick()
.build();
seriesOfActions.perform();
ii. Пример перетаскивания
Actions action = new Actions(driver);
action.dragAndDrop(Sourcelocator, Destinationlocator).build().perform();
7. Теневой корневой элемент
Пожалуйста, найдите изображение HTML-кода для теневого корня ниже:
Пожалуйста, найдите приведённый ниже код, с помощью которого мы можем проверить в консоли, правильна ли наша стратегия поиска или нет:
document.querySelector('#container').shadowRoot.querySelector('h1#inside')
Пожалуйста, найдите фрагмент кода Selenium для теневого корневого селектора:
public WebElement getRootElement(WebElement element) {
WebElement shadowRootElement = (WebElement) ((JavascriptExecutor) driver)
.executeScript("return arguments[0].shadowRoot",element);
return shadowRootElement;
}
WebElement shadowRoot1 = getRootElement(driver.findElement(By.id("container")));
WebElement mainElement = shadowRoot1.findElement(By.id("inside"));
8. Захват скриншота
Пожалуйста, найдите фрагмент кода selenium ниже, чтобы сделать снимок экрана и скопировать его по определённому пути
import java.io.File;
import org.apache.commons.io.FileUtils;
TakesScreenshot scrShot =((TakesScreenshot)webdriver);
File SrcFile=scrShot.getScreenshotAs(OutputType.FILE);
//Move image file to new destination
File DestFile=new File(fileWithPath);
//Copy file at destination
FileUtils.copyFile(SrcFile, DestFile);
9. Загрузка файла
Пожалуйста, ознакомьтесь с фрагментом кода selenium для загрузки файла ниже:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
class fileUploadDoc{
public static void main(String[] args) {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://the-internet.herokuapp.com/upload");
//We want to import selenium-snapshot file.
driver.findElement(By.id("file-upload")).sendKeys("selenium-snapshot.jpg");
driver.findElement(By.id("file-submit")).submit();
if(driver.getPageSource().contains("File Uploaded!")) {
System.out.println("file uploaded");
}
else{
System.out.println("file not uploaded");
}
driver.quit();
}
}
10. Действия с клавиатуры
a. Использование класса действий
Keys cmdCtrl = Platform.getCurrent().is(Platform.MAC) ? Keys.COMMAND : Keys.CONTROL;
WebElement textField = driver.findElement(By.id("textInput"));
new Actions(driver)
.sendKeys(textField, "Selenium!")
.sendKeys(Keys.ARROW_LEFT)
.keyDown(Keys.SHIFT)
.sendKeys(Keys.ARROW_UP)
.keyUp(Keys.SHIFT)
.keyDown(cmdCtrl)
.sendKeys("xvv")
.keyUp(cmdCtrl)
.perform();
Assertions.assertEquals("SeleniumSelenium!", textField.getAttribute("value"));
Также существует нечто, называемое классом Robot. Оно хорошо подходит для обработки собственных всплывающих окон, таких как загрузка файла. Вы можете обратиться к этой статье для получения дополнительной информации.
11. Таблицы
Таблица в основном состоит из заголовка, строк и табличных данных.
Пожалуйста, обратитесь к этому веб-сайту для получения примера таблицы.
a. Чтобы получить все заголовки таблиц
//By this we will get an idea of column numbers as well
driver.findElements(By.cssSelector("table>thead>tr>th"));
b. Чтобы получить отдельный элемент строки
//We will have to change the nth-child(row_number) accordingly
driver.findElement(By.cssSelector("tbody>tr:nth-child(2)"));
c. Чтобы получить все элементы строки
//By this we will get all the row elements
driver.findElements(By.cssSelector("tbody>tr"));
d. Для получения значений отдельных табличных данных
//By this we will get all the table data elements of the first row
driver.findElements(By.cssSelector("table>tbody>tr:nth-child(1)>td"));
Чтобы получить значения отдельных ячеек, нам придётся выполнить итерацию по элементам строки, а затем получить доступ к отдельным элементам данных таблицы и сохранить их в хэш-карте.
12. Некоторые общие операции с использованием Selenium
a. Режим “В полный экран”
driver.manage().window().maximize();
b. Сворачивание окна
driver.manage().window().minimize();
Ниже приведены различные методы, доступные в “окне”:
c. Использование файлов cookie
i. Добавление файла cookie
driver.manage().addCookie(new Cookie("session-id", "1234-5678"));
ii. Получение всех файлов cookie
driver.manage().getCookies();
iii. Получение файла cookie с именем ‘session-id’
driver.manage().getCookieNamed("session-id");
iv. Удаление файла cookie с именем ‘session-id’
driver.manage().deleteCookieNamed("session-id");
v. Удаление всех файлов cookie
driver.manage().deleteAllCookies();
d. Чтобы выйти/закрыть браузер
i. driver.close() — закрывает текущее окно браузера, в котором выполняются автоматические скрипты
ii. driver.quit() — закрывает все окно браузера
13. Обработка фреймов
Пожалуйста, ознакомьтесь с HTML-кодом ниже:
<div id="modal">
<iframe id="buttonframe" name="myframe" src="https://seleniumhq.github.io">
<button>Click here</button>
</iframe>
</div>
a. driver.switchTo.frame(int frameNumber) — указав номер индекса фрейма, драйвер переключится на него
// Switches to the second frame
driver.switchTo().frame(1);
b. driver.switchTo.frame(строка frameNameOrID) — при упоминании элемента фрейма или идентификатора драйвер переключится на этот конкретный фрейм
//Using the ID
driver.switchTo().frame("buttonframe");
//Or using the name instead
driver.switchTo().frame("myframe");
//Now we can click the button
driver.findElement(By.tagName("button")).click();
c. driver.switchTo.frame(WebElement frameElement) — при упоминании веб-элемента фрейма драйвер переключится на этот конкретный фрейм
//Store the web element
WebElement iframe = driver.findElement(By.cssSelector("#modal>iframe"));
//Switch to the frame
driver.switchTo().frame(iframe);
//Now we can click the button
driver.findElement(By.tagName("button")).click();
d. driver.switchTo().defaultContent() — возврат к главному окну
// Return to the top level
driver.switchTo().defaultContent();
14. Обработка оповещений
a. Для обработки простых оповещений нажмите кнопку “OK”
//Click the link to activate the alert
driver.findElement(By.linkText("See an example alert")).click();
//Wait for the alert to be displayed and store it in a variable
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
//Store the alert text in a variable
String text = alert.getText();
//Press the OK button
alert.accept();
б. Обработка оповещений с помощью кнопок ‘OK’ и ‘Cancel’
//Click the link to activate the alert
driver.findElement(By.linkText("See a sample confirm")).click();
//Wait for the alert to be displayed
wait.until(ExpectedConditions.alertIsPresent());
//Store the alert in a variable
Alert alert = driver.switchTo().alert();
//Store the alert in a variable for reuse
String text = alert.getText();
//Press the Cancel button
alert.dismiss();
c. Для отправки символов во всплывающее окно с предупреждением
//Click the link to activate the alert
driver.findElement(By.linkText("See a sample prompt")).click();
//Wait for the alert to be displayed and store it in a variable
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
//Type your message
alert.sendKeys("Selenium");
//Press the OK button
alert.accept();
Вы можете ознакомиться с подсказками на этой странице.
15. Разные фрагменты Selenium
a. Обработка ненадёжных сертификатов
//Create instance of ChromeOptions Class
ChromeOptions handlingSSL = new ChromeOptions();
//Using the setAcceptInsecureCerts method with true as parameter to accept the untrusted certificate
handlingSSL.setAcceptInsecureCerts(true);
//Creating instance of Chrome driver by passing the desied reference of ChromeOptions object
WebDriver driver = new ChromeDriver(handlingSSL);
b. Желаемые возможности
FirefoxOptions browserOptions = new FirefoxOptions();
browserOptions.setPlatformName("Windows 10");
browserOptions.setBrowserVersion("92");
Map<String, Object> cloudOptions = new HashMap<>();
cloudOptions.put("build", myTestBuild);
cloudOptions.put("name", myTestName);
browserOptions.setCapability("cloud:options", cloudOptions);
WebDriver driver = new RemoteWebDriver(new URL(cloudUrl), browserOptions);
Ссылки на рекомендуемые источники:
ii. https://www.lambdatest.com/