---
title: Основные понятия · часть 1
seo:
  title: Основные понятия · часть 1 — QA
  description: Тема «Основные понятия · часть 1» для собеседования QA. Что такое Selenium и зачем его используют? Что такое драйвер браузера?
---

[Все темы QA](/qa)

## <strong>Что такое Selenium и зачем его используют?</strong> [#q-14bee738d69b81679db4fb85a70336a9]

<strong>Selenium</strong> — это мощный инструмент для автоматизации тестирования
веб-приложений. Он позволяет автоматизировать действия в веб-браузере, имитируя
взаимодействия пользователя с веб-сайтом. Вот основные аспекты Selenium&#58;

{/* prettier-ignore */}
1. <strong>Многофункциональность</strong>&#58; Selenium поддерживает все основные веб-браузеры, такие как Chrome, Firefox, Safari и Internet Explorer, что позволяет выполнять кросс-браузерное тестирование.

1. <strong>Языковая поддержка</strong>&#58; Selenium поддерживает множество языков программирования, включая Java, C#, Python, Ruby и JavaScript, благодаря чему разработчики и тестировщики могут использовать те языки, с которыми они наиболее комфортно работают.

1. <code>Selenium WebDriver</code>&#58; Это часть Selenium, которая предоставляет API для управления браузерами на низком уровне. WebDriver позволяет отправлять команды непосредственно в браузер и получать результаты.

1. <code>Selenium Grid</code>&#58; Используется для распределённого тестирования, позволяя выполнять тесты параллельно на различных машинах и браузерах, что значительно ускоряет процесс тестирования.

1. <strong>Зачем используют</strong>&#58;

    - <strong>Автоматизация тестирования</strong>&#58; Автоматизировать рутинные и повторяющиеся задачи тестирования, снижая вероятность ошибок.

    - <strong>Увеличение охвата тестирования</strong>&#58; Проверить более широкий набор функциональностей в более короткие сроки.

    - <strong>Повышение качества продукта</strong>&#58; Выявить дефекты до того, как они станут серьезными проблемами.

    - <strong>Экономия времени и ресурсов</strong>&#58; Сократить время, необходимое на ручное тестирование, и ресурсы, затрачиваемые на этот процесс.

Selenium широко используется в индустрии благодаря своей гибкости, поддержке различных браузеров и языков программирования, а также возможности интеграции с другими инструментами тестирования и CI/CD системами.

:::note[Ссылки для изучения]

1. [Что такое Selenium и как он используется в тестировании](https://blog.skillfactory.ru/glossary/selenium/)
   :::

---

## <strong>Что такое драйвер браузера?</strong> [#q-14bee738d69b81a7b97ad03c1dc6e050]

<strong>Драйвер браузера</strong> — это компонент, который используется в
автоматизации тестирования веб-приложений для управления браузером. Он является
частью архитектуры <code>Selenium WebDriver</code> и обеспечивает взаимодействие
между вашим кодом и браузером. Вот основные моменты, касающиеся драйвера
браузера&#58;

1. <strong>Связующее звено</strong>&#58; Драйвер браузера действует как
   посредник между тестовым скриптом и браузером, переводя команды, написанные
   на поддерживаемом языке программирования (например, Java, Python), в команды,
   понятные браузеру.

1. <strong>Специфичность для браузера</strong>&#58; Для каждого типа браузера
   существует свой специфический драйвер. Например, Chrome использует
   ChromeDriver, Firefox — GeckoDriver, Internet Explorer — IEDriver и так
   далее.

1. <strong>Взаимодействие с браузером</strong>&#58; Драйверы браузера
   обеспечивают выполнение различных операций, таких как открытие страниц, клики
   по элементам, ввод текста, выполнение JavaScript и получение информации о
   состоянии элементов на веб-странице.

1. <strong>Установка и обновление</strong>&#58; Драйверы браузера нуждаются в
   регулярном обновлении, чтобы соответствовать последним версиям браузеров для
   обеспечения стабильной работы автоматизированных тестов.

Использование драйверов браузера позволяет реализовать автоматизированное управление браузером в тестовых скриптах, делая процесс тестирования веб-приложений более эффективным и точным.

:::note[Ссылки для изучения]

1. [Что такое Selenium Webdriver](https://blog.skillfactory.ru/glossary/selenium-webdriver/)
   :::

---

## <strong>Какие виды локаторов страницы существуют? Каковы их преимущества и недостатки?</strong> [#q-14bee738d69b812f9c8fc4908a629b93]

Локаторы страницы используются в автоматизации тестирования веб-приложений для идентификации элементов на веб-странице. Вот основные виды локаторов и их преимущества и недостатки&#58;

{/* prettier-ignore */}
1. <code>ID</code>&#58;

    - <strong>Преимущества</strong>&#58; Самый быстрый и надежный способ нахождения элементов, если ID уникален.

    - <strong>Недостатки</strong>&#58; Зависит от стабильности ID. Если ID изменяется, локатор перестает работать.

1. <code>Class Name</code>&#58;

    - <strong>Преимущества</strong>&#58; Хорошо работает для элементов, имеющих уникальные и стабильные классы.

    - <strong>Недостатки</strong>&#58; Может возвращать несколько элементов, если класс используется повторно на странице.

1. <code>Name</code>&#58;

    - <strong>Преимущества</strong>&#58; Удобен для элементов с уникальными именами.

    - <strong>Недостатки</strong>&#58; Не всегда доступен и может быть не уникальным.

1. <code>Tag Name</code>&#58;

    - <strong>Преимущества</strong>&#58; Подходит для получения списка всех элементов определенного типа.

    - <strong>Недостатки</strong>&#58; Возвращает все элементы с данным тегом, что может быть неэффективным для конкретных элементов.

1. <code>Link Text</code> <strong>и</strong> <code>Partial Link Text</code> (для ссылок)&#58;

    - <strong>Преимущества</strong>&#58; Прост в использовании для текстовых ссылок.

    - <strong>Недостатки</strong>&#58; Зависит от точного текста ссылки, изменения текста могут сломать локатор.

1. <code>CSS Selector</code>&#58;

    - Преимущества&#58; поиск по тегам, атрибутам, классам и отношениям элементов с помощью CSS-селекторов. Псевдоэлементы вроде &#58;&#58;before не являются DOM-элементами и не возвращаются как WebElement.

    - <strong>Недостатки</strong>&#58; Может быть сложным в создании и поддержке, особенно для сложных селекторов.

1. <code>XPath</code>&#58;

    - <strong>Преимущества</strong>&#58; Самый гибкий способ нахождения элементов, позволяет выполнять поиск по тексту, атрибутам, структуре документа и т.д.

    - <strong>Недостатки</strong>&#58; Медленнее других локаторов и может быть сложным в составлении. Неправильно написанные XPath-выражения могут сильно замедлить тесты.

В зависимости от задачи и структуры веб-страницы, разработчики выбирают наиболее подходящий тип локатора, который обеспечивает наилучший баланс между скоростью, надежностью и удобством поддержки.

:::note[Ссылки для изучения]

1. [Виды локаторов страницы](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/obshie-voprosy/kakie-vidy-lokatorov-stranicy-sushestvuyut-kakovy-ikh-preimushestva-i-nedostatki)
   :::

---

## <strong>Что такое</strong> <code>Selenium Waits</code><strong>? Какие есть и чем отличаются?</strong> [#q-14bee738d69b81778a92ff3c421afb47]

<code>Selenium Waits</code> используются для управления временем ожидания во
время автоматизированных тестов, чтобы дождаться определенных условий на
веб-странице перед продолжением исполнения теста. Они критически важны для
обработки асинхронного поведения веб-приложений, например, при загрузке данных.
В Selenium существуют два основных типа ожиданий&#58; явные (Explicit Waits) и
неявные (Implicit Waits).

{/* prettier-ignore */}
1. <strong>Неявные ожидания (</strong><code>Implicit Waits</code><strong>)</strong>&#58;

    - Определение&#58; Устанавливают глобальный максимальный интервал времени, в течение которого WebDriver будет пытаться найти элементы, если они не доступны сразу.

    - <strong>Преимущества</strong>&#58; Простота использования; устанавливаются один раз и применяются ко всем операциям поиска элемента.

    - Неявное ожидание завершается, как только поиск успешен; это не фиксированная пауза. Оно ожидает наличие элемента, но не его видимость, кликабельность или исчезновение.

    - <strong>Пример использования</strong>&#58;

        ```java
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        ```

1. <strong>Явные ожидания (</strong><code>Explicit Waits</code><strong>)</strong>&#58;

    - Определение&#58; Позволяют задать условие, которое WebDriver должен ожидать, и время ожидания для конкретного элемента или состояния.

    - <strong>Преимущества</strong>&#58; Гибкость и возможность применения различных условий ожидания; ожидания применяются только к нужным элементам, не задерживая весь тест.

    - <strong>Недостатки</strong>&#58; Требуют больше кода и сложнее в реализации по сравнению с неявными ожиданиями.

    - <strong>Пример использования</strong>&#58;

        ```java
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
        ```

<strong>
  Явные и неявные ожидания не рекомендуется использовать одновременно
</strong>
, так как это может привести к непредсказуемому времени ожидания, особенно если
они конфликтуют друг с другом. Явные ожидания предпочтительнее из-за их гибкости
и эффективности в сценариях, когда элементы могут появляться на странице
асинхронно.

:::note[Ссылки для изучения]

1. [Что такое Selenium Waits](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/chto-takoe-selenium-waits-kakie-est-i-chem-otlichayutsya)
   :::

---

## <strong>Какие</strong> <code>exceptions</code> <strong>может бросить Selenium? Что они означают и как их обрабатывать?</strong> [#q-14bee738d69b8188a3ddc42079ed9b47]

Selenium может бросать различные исключения в процессе автоматизации тестирования веб-приложений. Вот некоторые из наиболее распространенных исключений и их значения&#58;

{/* prettier-ignore */}
1. <code>NoSuchElementException</code>&#58;

    - <strong>Описание</strong>&#58; Выбрасывается, когда элемент не найден на странице во время выполнения команды поиска.

    - <strong>Обработка</strong>&#58; Убедитесь, что локатор верен и элемент доступен в момент выполнения поиска. Проверьте, не нужно ли добавить ожидание видимости элемента.

1. <code>TimeoutException</code>&#58;

    - <strong>Описание</strong>&#58; Выбрасывается, когда выполнение команды или ожидание условия превышает заданный тайм-аут.

    - <strong>Обработка</strong>&#58; Проверьте, достаточно ли времени выделяется на ожидание, и возможно ли, что элементы загружаются медленнее, чем ожидалось.

1. <code>StaleElementReferenceException</code>&#58;

    - <strong>Описание</strong>&#58; Возникает, когда ссылка на элемент устарела, например, если страница была перезагружена после получения ссылки на элемент.

    - <strong>Обработка</strong>&#58; Повторно найдите элемент или добавьте проверку, гарантирующую, что элемент все еще доступен и не был перезагружен.

1. <code>ElementNotVisibleException</code>&#58;

    - <strong>Описание</strong>&#58; Выбрасывается, когда элемент существует на DOM страницы, но не видим для пользователя.

    - <strong>Обработка</strong>&#58; Проверьте условия видимости элемента, возможно, необходимо прокрутить страницу или дождаться исчезновения модальных окон.

1. <code>InvalidSelectorException</code>&#58;

    - <strong>Описание</strong>&#58; Выбрасывается, когда синтаксис локатора неверен.

    - <strong>Обработка</strong>&#58; Проверьте и корректно сформируйте запрос вашего CSS или XPath локатора.

1. <code>WebDriverException</code>&#58;

    - <strong>Описание</strong>&#58; Общее исключение, которое может возникать по разным причинам, включая проблемы с самим драйвером браузера.

    - <strong>Обработка</strong>&#58; Проверьте логи и точную ошибку, которая была указана в исключении, чтобы определить причину.

1. <code>SessionNotCreatedException</code>&#58;

    - <strong>Описание</strong>&#58; Выбрасывается, когда сессия WebDriver не может быть создана.

    - <strong>Обработка</strong>&#58; Убедитесь, что все предварительные условия для создания сессии выполнены, включая доступность и совместимость драйвера браузера.

Для обработки исключений в Selenium рекомендуется использовать блоки try-catch в вашем тестовом коде, чтобы можно было адекватно реагировать на ошибки и, если необходимо, проводить корректировку или логирование ошибок.

:::note[Ссылки для изучения]

1. [Какие exceptions может бросить Selenium](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kakie-exceptions-mozhet-brosit-selenium-chto-oni-oznachayut-i-kak-ikh-obrabatyvat)
   :::

---

## <strong>Для чего используют</strong> <code>JavaScriptExecutor</code><strong>? Приведите примеры.</strong> [#q-14bee738d69b810db3cfdacfeb6b7e2e]

<code>JavaScriptExecutor</code> в Selenium используется для выполнения
JavaScript кода прямо в контексте текущей страницы, открытой в браузере. Это
особенно полезно в следующих ситуациях&#58;

{/* prettier-ignore */}
1. <strong>Взаимодействие с элементами, к которым сложно получить доступ через стандартные методы Selenium</strong>&#58;

    - Пример&#58; Вы можете использовать JavaScriptExecutor для скроллинга до элемента, который не видим на странице.

        ```java
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("arguments[0].scrollIntoView(true);", element);
        ```

1. <strong>Изменение значений элементов страницы</strong>&#58;

    - Пример&#58; Изменение скрытого поля формы перед отправкой.

        ```java
        js.executeScript("document.getElementById('hiddenField').value='newValue';");
        ```

1. <strong>Получение информации из браузера, которая не доступна через стандартные средства Selenium</strong>&#58;

    - Пример&#58; Получение значения, хранящегося в JavaScript переменной.

        ```java
        String scriptValue = (String) js.executeScript("return window.someJavascriptVariable;");
        ```

1. <strong>Выполнение сложных или нестандартных пользовательских действий</strong>&#58;

    - Пример&#58; Имитация сложного взаимодействия пользователя, такого как нажатие клавиш, которое не поддерживается прямо через WebDriver.

        ```java
        js.executeScript("document.getElementById('submitButton').click();");
        ```

1. <strong>Управление свойствами или стилями элементов</strong>&#58;

    - Пример&#58; Изменение стиля элемента для визуального тестирования.

        ```java
        js.executeScript("document.getElementById('content').style.display = 'none';");
        ```

Использование <code>JavaScriptExecutor</code> дает тестировщику большую гибкость в управлении веб-страницей, позволяя выполнять действия, которые могут быть недоступны через обычные методы Selenium API. Это мощный инструмент, который следует использовать с умом, так как его чрезмерное использование может сделать тесты менее надежными и трудными для поддержки.

:::note[Ссылки для изучения]

1. [Для чего нужен JavaScriptExecutor](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/dlya-chego-ispolzuyut-javascriptexecutor-privedite-primery.)
   :::

---

## <strong>Что такое</strong> <code>Selenium Grid</code><strong>?</strong> [#q-14bee738d69b8115ab31dded7c3336bb]

<code>Selenium Grid</code> — это инструмент в наборе инструментов Selenium,
который позволяет параллельно выполнять тесты на различных машинах и браузерах.
Это помогает значительно ускорить процесс тестирования и эффективно использовать
ресурсы. Вот основные аспекты работы Selenium Grid&#58;

1. <strong>Распределение тестов</strong>&#58; Selenium Grid позволяет
   распределить выполнение тестов по различным браузерам и операционным системам
   одновременно. Это делает его идеальным инструментом для кросс-браузерного и
   кросс-платформенного тестирования.

1. <strong>Управление узлами</strong>&#58; Grid состоит из одного "хаба" (Hub),
   который принимает запросы на выполнение тестов, и нескольких "узлов" (Nodes),
   которые регистрируются в хабе. Узлы могут быть сконфигурированы с различными
   браузерами и версиями браузеров.

1. <strong>Масштабируемость</strong>&#58; Selenium Grid позволяет масштабировать
   тестовую инфраструктуру, добавляя больше узлов в сеть, что обеспечивает
   увеличение параллелизма и уменьшение времени выполнения тестов.

1. <strong>Эффективность</strong>&#58; Использование Grid помогает
   оптимизировать использование ресурсов, так как тесты могут быть выполнены на
   машинах, которые физически расположены в других местах или на виртуальных
   машинах.

Ниже приведены команды Selenium Grid 3. В Grid 4 изменились имена JAR и синтаксис запуска&#58; доступны режимы standalone, hub/node и distributed.

1. <strong>Запуск хаба</strong>&#58;

   ```java
   java -jar selenium-server-standalone-<version>.jar -role hub
   ```

1. <strong>Регистрация узлов</strong>&#58;

   ```java
   java -jar selenium-server-standalone-<version>.jar -role node -hub http://<hub_ip>:4444/grid/register
   ```

Selenium Grid идеально подходит для крупных проектов и компаний, где требуется частое и масштабное тестирование веб-приложений.

:::note[Ссылки для изучения]

1. [Что такое Selenium Grid](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/chto-takoe-selenium-grid)
   :::

---

## <strong>Какие способы</strong> <code>click</code> <strong>и</strong> <code>send keys</code> <strong>Selenium?</strong> [#q-14bee738d69b81a1bdede6daa597e34e]

В <code>Selenium WebDriver</code> существуют разные способы выполнения действий, таких как клики по элементам и отправка текстовых данных. Вот основные методы для этих действий&#58;

{/* prettier-ignore */}
1. <code>Click</code>&#58;

    - <strong>Прямой клик</strong>&#58; Используется метод <code>click&#40;&#41;</code> для непосредственного взаимодействия с элементами, которые можно кликнуть, например, кнопки, ссылки, чекбоксы.

        ```java
        WebElement button = driver.findElement(By.id("submit"));
        button.click();
        ```

    - JavaScript click вызывает DOM-метод напрямую и обходит проверки пользовательской доступности. Если обычный click не работает из-за перекрытия или невидимости, сначала выясните причину; обход может скрыть настоящий дефект интерфейса.

        ```java
        JavascriptExecutor js = (JavascriptExecutor) driver;
        WebElement button = driver.findElement(By.id("submit"));
        js.executeScript("arguments[0].click();", button);
        ```

1. <code>Send Keys</code>&#58;

    - <strong>Прямая отправка</strong>&#58; Метод <code>sendKeys&#40;&#41;</code> используется для ввода текста в текстовые поля. Этот метод также может использоваться для отправки специальных клавиш, таких как Enter.

        ```java
        WebElement inputField = driver.findElement(By.id("username"));
        inputField.sendKeys("example_username");
        ```

    - <strong>С комбинациями клавиш</strong>&#58; <code>sendKeys&#40;&#41;</code> можно использовать с клавишами управления из класса <code>Keys</code> для выполнения действий типа Ctrl+C, Ctrl+V.

        ```java
        inputField.sendKeys(Keys.CONTROL + "a");
        inputField.sendKeys(Keys.CONTROL + "c");
        ```

    - Установка value через JavaScript меняет DOM напрямую, не воспроизводит клавиатурный ввод и сама по себе не вызывает input/change. Для пользовательского сценария предпочитайте sendKeys.

        ```java
        js.executeScript("arguments[0].value='example_username';", inputField);
        ```

Эти методы предоставляют гибкость при реализации различных сценариев взаимодействия с веб-страницей, позволяя обойти некоторые ограничения или проблемы доступности элементов.

:::note[Ссылки для изучения]

1. [Что такое Selenium click](https://testsigma.com/blog/selenium-click/)
   :::

---

## <strong>Как вы запускаете параллельное выполнение тестов? Что такое</strong> <code>ThreadLocal</code><strong>?</strong> [#q-14bee738d69b81a295a2fe253aa07e51]

<strong>Параллельное выполнение тестов</strong> в контексте автоматизации с
Selenium может быть реализовано несколькими способами, включая использование
Selenium Grid, фреймворков для управления тестами или программных средств для
параллелизации тестов. Вот краткие пояснения&#58;

{/* prettier-ignore */}
1. <code>Selenium Grid</code>&#58;

    - Позволяет запускать тесты параллельно на различных машинах и браузерах. Тесты диспетчеризируются на разные узлы в сети, что позволяет значительно ускорить процесс тестирования.

1. <strong>Фреймворки тестирования</strong>&#58;

    - Многие фреймворки, такие как TestNG или JUnit, поддерживают параллельное выполнение тестов через свои конфигурации. Вы можете настроить эти фреймворки для параллельного выполнения методов, классов или даже отдельных тестов.

    Пример настройки в <code>TestNG</code>&#58;

    ```xml
    <suite name="MySuite" parallel="tests" thread-count="5">
        <test name="ChromeTest">
            <parameter name="browser" value="chrome"/>
            <classes>
                <class name="com.example.tests.TestClass"/>
            </classes>
        </test>
        <test name="FirefoxTest">
            <parameter name="browser" value="firefox"/>
            <classes>
                <class name="com.example.tests.TestClass"/>
            </classes>
        </test>
    </suite>
    ```

<code>ThreadLocal</code>&#58;

- <strong>Описание</strong>&#58; <code>ThreadLocal</code> в Java предоставляет
  потоковую локализацию переменных. Каждый поток имеет собственную, независимую
  копию переменной <code>ThreadLocal</code>, которая может быть использована для
  хранения данных, специфичных для потока.

- <strong>Использование в тестировании</strong>&#58; <code>ThreadLocal</code>
  можно использовать для хранения экземпляров драйвера браузера, чтобы каждый
  тестовый поток имел свой собственный экземпляр веб-драйвера, независимый от
  других потоков. Это обеспечивает безопасное и эффективное параллельное
  выполнение тестов.

Пример использования <code>ThreadLocal</code> с WebDriver&#58;

```java
public class WebDriverFactory {
    private static ThreadLocal<WebDriver> webDriver = new ThreadLocal<>();

    public static WebDriver getDriver() {
        return webDriver.get();
    }

    public static void setWebDriver(WebDriver driver) {
        webDriver.set(driver);
    }
}
```

В этом примере <code>ThreadLocal</code> используется для хранения экземпляра WebDriver. Каждый поток может установить свой драйвер и безопасно его использовать, не мешая другим потокам.

:::note[Ссылки для изучения]

1. [Как запускается параллельное выполнение тестов](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kak-vy-zapuskaete-parallelnoe-vypolnenie-testov-chto-takoe-threadlocal)
   :::

---

## <strong>Какая разница между</strong> <code>Action</code> <strong>и</strong> <code>Actions</code><strong>?</strong> [#q-14bee738d69b818c96bafed9c507c89c]

В контексте Selenium WebDriver, <code>Action</code> и <code>Actions</code> относятся к API для управления сложными или расширенными взаимодействиями пользователя с веб-страницей.

{/* prettier-ignore */}
1. <code>Action</code>&#58;

    - Action является интерфейсом выполняемого действия с методом perform(); объект может представлять и составную последовательность. Actions является построителем такой последовательности, а build() возвращает Action.

    - <strong>Использование</strong>&#58; Обычно, <code>Action</code> используется в контексте <code>Actions</code> как часть цепочки действий, которые могут быть построены и затем выполнены.

1. <code>Actions</code>&#58;

    - <strong>Описание</strong>&#58; <code>Actions</code> — это класс в Selenium WebDriver, который предоставляет способ строить и выполнять цепочку действий или комплексные пользовательские жесты. Это помогает в симуляции взаимодействий, которые включают несколько шагов и могут требовать точной координации.

    - <strong>Использование</strong>&#58; Вы создаете экземпляр <code>Actions</code>, используя текущий экземпляр WebDriver. С помощью этого объекта можно строить последовательность различных действий, которые затем выполняются с помощью метода <code>perform&#40;&#41;</code>.

Пример использования класса <code>Actions</code>&#58;

```java
WebDriver driver = new ChromeDriver();
Actions builder = new Actions(driver);

// Построение цепочки действий
Action seriesOfActions = builder
    .moveToElement(txtUsername)
    .click()
    .keyDown(txtUsername, Keys.SHIFT)
    .sendKeys(txtUsername, "hello")
    .keyUp(txtUsername, Keys.SHIFT)
    .doubleClick(txtUsername)
    .contextClick()
    .build();

// Выполнение цепочки действий
seriesOfActions.perform();
```

Action является интерфейсом выполняемого действия с методом perform(); объект может представлять и составную последовательность. Actions является построителем такой последовательности, а build() возвращает Action.

:::note[Ссылки для изучения]

1. [Разница между Action и Actions](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kakaya-raznica-mezhdu-action-i-actions)
   :::
