Compare commits
No commits in common. "ui-master" and "main" have entirely different histories.
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,4 +0,0 @@
|
|||||||
/.idea/
|
|
||||||
/out/
|
|
||||||
/target/
|
|
||||||
*.iml
|
|
||||||
42
pom.xml
42
pom.xml
@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<groupId>org.example</groupId>
|
|
||||||
<artifactId>HelpdeskUITest</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<source>8</source>
|
|
||||||
<target>8</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.seleniumhq.selenium</groupId>
|
|
||||||
<artifactId>selenium-java</artifactId>
|
|
||||||
<version>3.141.59</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.testng</groupId>
|
|
||||||
<artifactId>testng</artifactId>
|
|
||||||
<version>6.9.6</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>io.qameta.allure</groupId>
|
|
||||||
<artifactId>allure-testng</artifactId>
|
|
||||||
<version>2.13.8</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
package elements;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.WebDriver;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
import org.openqa.selenium.support.FindBy;
|
|
||||||
import org.openqa.selenium.support.PageFactory;
|
|
||||||
|
|
||||||
/** Главное меню (блок элементов) */
|
|
||||||
public class MainMenu {
|
|
||||||
|
|
||||||
// Способ объявления элементов страницы, через аннотацию @FindBy (с последующей инициализацией)
|
|
||||||
|
|
||||||
@FindBy(xpath = "//span[contains(text(),'New Ticket')]")
|
|
||||||
private WebElement newTicketButton;
|
|
||||||
|
|
||||||
@FindBy(id = "userDropdown")
|
|
||||||
private WebElement logInButton;
|
|
||||||
|
|
||||||
@FindBy(xpath = "//input[@id='search_query']")
|
|
||||||
private WebElement inputSearch;
|
|
||||||
|
|
||||||
@FindBy(xpath = "//nav//button[@type='submit']")
|
|
||||||
private WebElement goButton;
|
|
||||||
|
|
||||||
public MainMenu(WebDriver driver) {
|
|
||||||
/* Необходимо инициализировать элементы класса, аннотированные @FindBy.
|
|
||||||
Лучше всего это делать в конструкторе. */
|
|
||||||
PageFactory.initElements(driver, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Нажать кнопку создания новго тикета")
|
|
||||||
public void clickOnNewTicketButton() {
|
|
||||||
newTicketButton.click();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Нажать кнопку логина")
|
|
||||||
public void clickOnLogInButton() {
|
|
||||||
logInButton.click();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Найти тикет с помощью поиска")
|
|
||||||
public void searchTicket(Ticket ticket) {
|
|
||||||
setInputSearch(ticket.getTitle())
|
|
||||||
.clickOnGoButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Если после вызова void метода, может потребоваться вызов другого метода этого же класса,
|
|
||||||
то можно вернуть сам класс и вызвать следующий метод через точку. */
|
|
||||||
@Step("Ввести в поле поиска значение {text}")
|
|
||||||
public MainMenu setInputSearch(String text) {
|
|
||||||
inputSearch.sendKeys(text);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Нажать кнопку поиска")
|
|
||||||
public void clickOnGoButton() {
|
|
||||||
goButton.click();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Получить логин пользователя")
|
|
||||||
public String loginedUser() {
|
|
||||||
return logInButton.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
package models;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
/** Словари */
|
|
||||||
public class Dictionaries {
|
|
||||||
|
|
||||||
private static final HashMap<Integer, String> priorities = new HashMap<>();
|
|
||||||
private static final HashMap<Integer, String> queues = new HashMap<>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
priorities.put(1, "1. Critical");
|
|
||||||
priorities.put(2, "2. High");
|
|
||||||
priorities.put(3, "3. Normal");
|
|
||||||
priorities.put(4, "4. Low");
|
|
||||||
priorities.put(5, "5. Very Low");
|
|
||||||
|
|
||||||
queues.put(1, "Django Helpdesk");
|
|
||||||
queues.put(2, "Some Product");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getPriority(int priority) {
|
|
||||||
return priorities.get(priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getQueue(int queue) {
|
|
||||||
return queues.get(queue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
package models;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
|
|
||||||
public class Ticket {
|
|
||||||
|
|
||||||
/* Класс Ticket пакета models реализуем по аналогии c домашним заданием по тестированию API.
|
|
||||||
Класс должен содержать набор полей, необходимый для заполнения формы создания тикета.
|
|
||||||
Тип данных для каждого поля должен соответствовать документации swagger (см. раздел Models в документации). */
|
|
||||||
|
|
||||||
// todo: остальные поля класса
|
|
||||||
private String title;
|
|
||||||
private String due_date;
|
|
||||||
private File file;
|
|
||||||
|
|
||||||
// todo: остальные геттеры и сеттеры
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDue_date() {
|
|
||||||
return due_date;
|
|
||||||
}
|
|
||||||
|
|
||||||
// обычный сеттер
|
|
||||||
public void setDue_date(String due_date) {
|
|
||||||
this.due_date = due_date;
|
|
||||||
}
|
|
||||||
|
|
||||||
// перегруженный сеттер, который принимает дату и форматирует её в строку по шаблону
|
|
||||||
public void setDue_date(LocalDateTime due_date) {
|
|
||||||
this.due_date = due_date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public File getFile() {
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFile(File file) {
|
|
||||||
this.file = file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import org.openqa.selenium.WebDriver;
|
|
||||||
|
|
||||||
/** Элементы общие для всех страниц */
|
|
||||||
public abstract class AbstractPage {
|
|
||||||
|
|
||||||
protected static WebDriver driver;
|
|
||||||
|
|
||||||
public static void setDriver(WebDriver webDriver) {
|
|
||||||
driver = webDriver;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
|
|
||||||
/** Страница создания тикета */
|
|
||||||
public class CreateTicketPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
// todo: добавить элементам локтаоры через @FindBy
|
|
||||||
|
|
||||||
private WebElement selectQueue;
|
|
||||||
|
|
||||||
private WebElement inputProblem;
|
|
||||||
|
|
||||||
// todo: добавить остальные поля формы
|
|
||||||
|
|
||||||
private WebElement submitTicketButton;
|
|
||||||
|
|
||||||
// todo: проинициализировать элементы
|
|
||||||
|
|
||||||
@Step("Создать тикет")
|
|
||||||
public CreateTicketPage createTicket(Ticket ticket) {
|
|
||||||
setInputProblem(ticket.getTitle());
|
|
||||||
// todo: заполнить остальные поля формы
|
|
||||||
clickOnSubmitButton();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Ввести имя проблемы: {text}")
|
|
||||||
public void setInputProblem(String text) {
|
|
||||||
inputProblem.sendKeys(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Нажать на кнопку создания тикета")
|
|
||||||
public void clickOnSubmitButton() {
|
|
||||||
submitTicketButton.click();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import elements.MainMenu;
|
|
||||||
|
|
||||||
/** Элементы общие для системы Helpdesk */
|
|
||||||
public class HelpdeskBasePage extends AbstractPage {
|
|
||||||
|
|
||||||
/** Доступ к элементам главного меню */
|
|
||||||
public MainMenu mainMenu() {
|
|
||||||
return new MainMenu(driver);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
import org.openqa.selenium.support.FindBy;
|
|
||||||
import org.openqa.selenium.support.PageFactory;
|
|
||||||
|
|
||||||
/** Страница логина */
|
|
||||||
public class LoginPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
// поиск элемента через xpath
|
|
||||||
@FindBy(xpath = "//*[id='username']")
|
|
||||||
private WebElement user;
|
|
||||||
|
|
||||||
// поиск элемента по id
|
|
||||||
@FindBy(id = "password")
|
|
||||||
private WebElement password;
|
|
||||||
|
|
||||||
// поиск элемента через css
|
|
||||||
@FindBy(css = "[type='submit']")
|
|
||||||
private WebElement loginButton;
|
|
||||||
|
|
||||||
public LoginPage() {
|
|
||||||
PageFactory.initElements(driver, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Авторизация пользователя
|
|
||||||
*
|
|
||||||
* @param user логин пользователя
|
|
||||||
* @param password пароль пользователя
|
|
||||||
*/
|
|
||||||
@Step("Авторизация пользователя")
|
|
||||||
public LoginPage login(String user, String password) {
|
|
||||||
setUser(user);
|
|
||||||
setPassword(password);
|
|
||||||
clickOnLoginButton();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Ввести логин {user}")
|
|
||||||
private void setUser(String user) {
|
|
||||||
this.user.sendKeys(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Ввести пароль")
|
|
||||||
private void setPassword(String password) {
|
|
||||||
this.password.sendKeys(password);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Нажать кнопку авторизации")
|
|
||||||
private void clickOnLoginButton() {
|
|
||||||
this.loginButton.click();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import org.openqa.selenium.support.PageFactory;
|
|
||||||
|
|
||||||
/** Главная страница */
|
|
||||||
public class MainPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
public MainPage() {
|
|
||||||
PageFactory.initElements(driver, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.By;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
|
|
||||||
/** Страница отдельного тикета (авторизированный пользователь) */
|
|
||||||
public class TicketPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
/* Верстка страницы может измениться, поэтому для таблиц вместо индексов строк и столбцов лучше использовать
|
|
||||||
более универсальные локаторы, например поиск по тексту + parent, following-sibling и другие.
|
|
||||||
|
|
||||||
Текст тоже может измениться, но в этом случае элемент не будет найден и тест упадет,
|
|
||||||
а ошибку можно будет легко локализовать и исправить.
|
|
||||||
В случае изменений ячеек таблицы, локатор будет продолжать работать, но будет указывать на другой элемент,
|
|
||||||
поведение теста при этом изменится непредсказуемым образом и ошибку будет сложно найти. */
|
|
||||||
private WebElement dueDate = driver.findElement(By.xpath("//th[text()='Due Date']/following-sibling::td[1]"));
|
|
||||||
|
|
||||||
// todo: проинициализировать элементы через driver.findElement
|
|
||||||
private WebElement title;
|
|
||||||
private WebElement queue;
|
|
||||||
private WebElement email;
|
|
||||||
private WebElement priority;
|
|
||||||
private WebElement description;
|
|
||||||
|
|
||||||
@Step("Проверить значение полей на странице тикета")
|
|
||||||
public void checkTicket(Ticket ticket) {
|
|
||||||
// todo: добавить реализацию метода
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
import org.openqa.selenium.support.FindBy;
|
|
||||||
import org.openqa.selenium.support.PageFactory;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/** Страница с таблицей тикетов и фильтрами */
|
|
||||||
public class TicketsPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
// пример коллекции веб-элементов
|
|
||||||
@FindBy(xpath = "//div[@class='tickettitle']/a")
|
|
||||||
private List<WebElement> ticketsHref;
|
|
||||||
|
|
||||||
public TicketsPage() {
|
|
||||||
PageFactory.initElements(driver, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ищем строку с и тикетом и нажимаем на нее
|
|
||||||
*
|
|
||||||
* @param ticket
|
|
||||||
*/
|
|
||||||
@Step("Открыть тикет с id {ticket.id}")
|
|
||||||
public void openTicket(Ticket ticket) {
|
|
||||||
String id = String.valueOf(ticket.getId());
|
|
||||||
ticketsHref.stream()
|
|
||||||
.filter(WebElement::isDisplayed)
|
|
||||||
.filter(ticketHref -> ticketHref.getText().startsWith(id))
|
|
||||||
.findFirst()
|
|
||||||
.orElseThrow(() -> new AssertionError("Не найден тикет с id " + id))
|
|
||||||
.click();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
package pages;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.By;
|
|
||||||
import org.openqa.selenium.WebElement;
|
|
||||||
import org.openqa.selenium.support.ui.ExpectedCondition;
|
|
||||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
|
||||||
import org.openqa.selenium.support.ui.WebDriverWait;
|
|
||||||
import org.testng.Assert;
|
|
||||||
|
|
||||||
/** Страница просмотра карточки тикета (неавторизированный пользователь) */
|
|
||||||
public class ViewPage extends HelpdeskBasePage {
|
|
||||||
|
|
||||||
// Способ объявления и инициализации элементов страницы через driver.findElement(locator)
|
|
||||||
|
|
||||||
/* Инициализация сразу при объявлении элемента.
|
|
||||||
Элемент должен присутствовать на странице браузера в момент создания объекта страницы new ViewPage() */
|
|
||||||
private WebElement queue = driver.findElement(By.xpath("//th[contains(text(), 'Queue:')]"));
|
|
||||||
private WebElement email = driver.findElement(By.xpath("//th[text()='Submitter E-Mail']/following-sibling::td[1]"));
|
|
||||||
private WebElement priority = driver.findElement(By.xpath("//th[text()='Priority']/following-sibling::td[1]"));
|
|
||||||
|
|
||||||
// Пример поиска description, используя промежуточный элемент descriptionLabel
|
|
||||||
private WebElement descriptionLabel = driver.findElement(By.xpath("//th[text()='Description']"));
|
|
||||||
// Поиск элемента можно выполнять не только относительно driver, но и относительно другого элемента
|
|
||||||
private WebElement description = descriptionLabel.findElement(By.xpath("./parent::*/following-sibling::tr[1]"));
|
|
||||||
|
|
||||||
/* Поиск элемента по локатору.
|
|
||||||
Используется для элементов, которых нет на странице браузера в момент создания объекта страницы,
|
|
||||||
так как локатор может быть объявлен и проинициализирован до появления элемнета на странице. */
|
|
||||||
private By captionLocator = By.xpath("//table/caption");
|
|
||||||
private WebElement caption;
|
|
||||||
|
|
||||||
|
|
||||||
public ViewPage() {
|
|
||||||
// В данном случае инициализация через PageFactory не нужна,
|
|
||||||
// но можем проинициализировать элементы по локаторам (если элементы отображаются)
|
|
||||||
caption = driver.findElement(captionLocator);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Проверить значение полей на карточке тикета")
|
|
||||||
public ViewPage checkTicket(Ticket ticket) {
|
|
||||||
Assert.assertTrue(getTicketTitle().contains(ticket.getTitle()), "Имя тикета не соответствует");
|
|
||||||
// todo: добавить проверки
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Получить заголовок тикета")
|
|
||||||
public String getTicketTitle() {
|
|
||||||
// Если элемент появляется не сразу, можно выполнить ожидание по условию
|
|
||||||
|
|
||||||
// условие видимости при поиске по локатору
|
|
||||||
ExpectedCondition<WebElement> condition = ExpectedConditions.visibilityOfElementLocated(captionLocator);
|
|
||||||
|
|
||||||
// поиск с ожиданием по условию
|
|
||||||
WebElement ticketTitle = new WebDriverWait(driver, 5).until(condition);
|
|
||||||
|
|
||||||
return ticketTitle.getText();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Сохранить id тикета в объект")
|
|
||||||
public void saveId(Ticket ticket) {
|
|
||||||
String captionText = caption.getText();
|
|
||||||
String id = captionText.substring(captionText.indexOf("-") + 1, captionText.indexOf("]"));
|
|
||||||
ticket.setId(Integer.parseInt(id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
site.url=
|
|
||||||
webdriver.chrome.driver=
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
user=
|
|
||||||
password=
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
package web;
|
|
||||||
|
|
||||||
import io.qameta.allure.Step;
|
|
||||||
import models.Ticket;
|
|
||||||
import org.openqa.selenium.WebDriver;
|
|
||||||
import org.openqa.selenium.chrome.ChromeDriver;
|
|
||||||
import org.testng.annotations.AfterTest;
|
|
||||||
import org.testng.annotations.BeforeClass;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
import pages.AbstractPage;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
public class HelpdeskUITest {
|
|
||||||
|
|
||||||
private WebDriver driver;
|
|
||||||
private Ticket ticket;
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public void setup() throws IOException {
|
|
||||||
loadProperties();
|
|
||||||
setupDriver();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Загрузить конфигурацилнные файлы")
|
|
||||||
private void loadProperties() throws IOException {
|
|
||||||
// Читаем конфигурационные файлы в System.properties
|
|
||||||
System.getProperties().load(ClassLoader.getSystemResourceAsStream("config.properties"));
|
|
||||||
System.getProperties().load(ClassLoader.getSystemResourceAsStream("user.properties"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Step("Создать экземпляр драйвера")
|
|
||||||
private void setupDriver() {
|
|
||||||
// Создание экземпляра драйвера
|
|
||||||
driver = new ChromeDriver();
|
|
||||||
// Устанавливаем размер окна браузера, как максимально возможный
|
|
||||||
driver.manage().window().maximize();
|
|
||||||
// Установим время ожидания для поиска элементов
|
|
||||||
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
|
|
||||||
// Установить созданный драйвер для поиска в веб-страницах
|
|
||||||
AbstractPage.setDriver(driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void createTicketTest() {
|
|
||||||
// todo: шаги тест-кейса
|
|
||||||
|
|
||||||
// ...
|
|
||||||
ticket = buildNewTicket();
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
private Ticket buildNewTicket() {
|
|
||||||
Ticket ticket = new Ticket();
|
|
||||||
// todo: заполнить поля тикета
|
|
||||||
return ticket;
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterTest
|
|
||||||
public void close() {
|
|
||||||
if (driver != null) {
|
|
||||||
// Закрываем одно текущее окно браузера
|
|
||||||
driver.close();
|
|
||||||
// Закрываем все открытые окна браузера, завершаем работу браузера, освобождаем ресурсы
|
|
||||||
driver.quit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user