Структуры данных
Что такое PageObject и PageFactory?
PageObject и PageFactory — это концепции, используемые
в автоматизации тестирования веб-приложений, особенно с использованием
фреймворка Selenium.
-
PageObject:-
Определение: Это шаблон проектирования, который используется для абстрагирования веб-страницы или её части в отдельные классы, которые называются PageObject. Каждая страница (или фрагмент страницы) имеет свой собственный класс, который содержит методы для взаимодействия с элементами на этой странице.
-
Пример: Класс
LoginPage, который содержит методы для заполнения полей логина и пароля, а также кнопки входа.
-
-
PageFactory:-
Определение: Это вспомогательный класс в Selenium, который помогает инициализировать элементы на веб-странице в PageObject. Он предоставляет аннотации для элементов на странице, которые автоматически инициализируются при вызове PageFactory.initElements(driver, this).
-
Пример: Аннотация
@FindByиспользуется для поиска элементов на странице по селектору (CSS, XPath и т. д.) и их инициализации.
-
Пример использования:
public class LoginPage {
@FindBy(id = "username")
private WebElement usernameInput;
@FindBy(id = "password")
private WebElement passwordInput;
@FindBy(id = "login-button")
private WebElement loginButton;
public LoginPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void enterUsername(String username) {
usernameInput.sendKeys(username);
}
public void enterPassword(String password) {
passwordInput.sendKeys(password);
}
public void clickLoginButton() {
loginButton.click();
}
}
Это позволяет создать чистый и модульный код для автоматизированного тестирования, упрощая поддержку и повторное использование.
Какая иерархия Collections?
Иерархия коллекций в Java представляет собой иерархию классов и интерфейсов, предназначенных для хранения и манипуляций с данными. Основные элементы иерархии включают:
-
Интерфейс
Collection:-
Наследники: List, Set, Queue.
-
Основные методы: add, remove, size, isEmpty, contains и другие для базовых операций с элементами коллекции.
-
-
Интерфейс
List:-
Наследники: ArrayList, LinkedList, Vector.
-
Основные методы: get, set, add, remove, indexOf и другие для работы с упорядоченными коллекциями с возможностью дублирования элементов.
-
-
Интерфейс
Set:-
Наследники: HashSet, TreeSet, LinkedHashSet.
-
Основные методы: add, remove, contains, size и другие для работы с коллекциями, которые не содержат дублирующихся элементов.
-
-
Интерфейс
Queue:-
Наследники: LinkedList, PriorityQueue.
-
Основные методы: add, remove, element, offer, poll и другие для реализации структур данных очереди.
-
-
Интерфейс
Map:-
Наследники: HashMap, TreeMap, LinkedHashMap.
-
Основные методы: put, get, remove, containsKey, containsValue и другие для работы с отображениями (ключ-значение).
-
Эта иерархия позволяет выбирать наиболее подходящий тип коллекции в зависимости от требований к хранению данных и типа операций, которые необходимо выполнить.
Какая разница между Thread class и Runnable interface?
В Java разница между классом Thread и интерфейсом Runnable связана с тем, как реализуются параллельные задачи:
-
Threadкласс:-
Наследование: Класс Thread сам по себе является потоком исполнения (Thread).
-
Реализация: При использовании класса Thread вы создаёте новый поток путём наследования от Thread и переопределения метода
run(). -
Ограничения: Использование Thread ограничено одиночным наследованием, так как Java поддерживает только одиночное наследование классов.
-
Пример использования:
class MyThread extends Thread {
public void run() {
// Код, выполняемый в отдельном потоке
}
}
-
Runnableинтерфейс:-
Реализация: Интерфейс Runnable предоставляет альтернативный способ создания потока, отделяя задачу исполнения от самого потока.
-
Использование: Вы можете реализовать интерфейс Runnable и передать его экземпляр в конструктор Thread или в исполнитель (Executor).
-
Преимущества: Использование интерфейса Runnable упрощает повторное использование кода и повышает гибкость, так как не требует наследования.
-
Пример использования:
class MyRunnable implements Runnable {
public void run() {
// Код, выполняемый в отдельном потоке
}
}
// Создание потока на основе Runnable
Thread thread = new Thread(new MyRunnable());
Runnable отделяет задачу от способа её выполнения. Объект можно передать Thread или Executor; сам по себе Runnable не создаёт поток. Для запуска нового Thread нужен start(), прямой вызов run() выполняется в текущем потоке.
Какая разница между String, Stringbuffer и Stringbuilder?
В Java есть три основных класса для работы с текстовыми строками: String, StringBuffer и StringBuilder. Вот их основные различия:
-
String:-
Неизменяемость: Объекты класса
Stringнеизменяемы, что означает, что после создания строки её нельзя изменить. -
Потокобезопасность: Строки являются потокобезопасными (thread-safe), так как не могут быть изменены из разных потоков.
String str = "Hello"; str += " World"; // Создаётся новая строка "Hello World" -
-
StringBuffer:-
Изменяемость:
StringBufferпредназначен для работы с изменяемыми строками. -
Потокобезопасность:
StringBufferявляется потокобезопасным (thread-safe) благодаря синхронизированным методам.
StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // Изменяет текущий объект StringBuffer -
-
StringBuilder:-
Изменяемость:
StringBuilderтакже предназначен для работы с изменяемыми строками, но не синхронизирован. -
Производительность:
StringBuilderобычно быстрее, чемStringBuffer, потому что не имеет накладных расходов на синхронизацию.
StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // Изменяет текущий объект StringBuilder -
Выбор между ними:
-
Используйте
String, когда строка не будет изменяться. -
Используйте
StringBuffer, когда потребуется многопоточный доступ к изменяемой строке. -
Используйте
StringBuilderв однопоточных приложениях, где требуется эффективная работа с изменяемыми строками.
Разница между final, finally и finalize?
В Java final, finally, и finalize выполняют разные функции:
-
final:-
Ключевое слово: Используется для объявления констант, запрета наследования классов и запрета переопределения методов.
-
Примеры использования:
-
Для переменной:
final int number = 42;— переменнаяnumberне может быть изменена после инициализации. -
Для класса:
final class MyFinalClass {}— классMyFinalClassне может быть унаследован. -
Для метода:
final void myMethod() {}— методmyMethodне может быть переопределен в подклассах.
-
-
-
finally:-
Блок кода: Часть конструкции
try-catch, который выполняется после блоковtryиcatch, независимо от того, произошло исключение или нет. -
Назначение: Обычно используется для очистки ресурсов, например, закрытия файлов или баз данных вне зависимости от успешного или ошибочного завершения кода в блоке
try. -
Пример использования:
try { // код, который может вызвать исключение } catch (Exception e) { // обработка исключения } finally { // код, который выполняется после try/catch }
-
-
finalize:-
Метод finalize() относится к устаревшему механизму финализации; начиная с Java 18 он помечен для удаления. Его выполнение и своевременность не гарантированы.
-
Назначение: Предназначен для освобождения ресурсов, которые не управляются системой сборки мусора (например, нативные ресурсы).
-
Использование: Использование метода
finalize()не рекомендуется, так как вызов метода не гарантирован и может привести к непредсказуемому поведению. Вместо него предпочтительнее использоватьtry-with-resourcesили явное закрытие ресурсов. -
Пример:
@Override protected void finalize() throws Throwable { // очистка перед уничтожением super.finalize(); }
-
Эти элементы языка выполняют различные функции и используются в соответствии с их предназначением в разных аспектах программирования на Java.