---
title: Автоматизация тестирования с Selenium
seo:
  title: Автоматизация тестирования с Selenium — QA
  description: Тема «Автоматизация тестирования с Selenium» для собеседования QA. Как написать метод isElementPresent? Как вычитать данные из динамической веб-таблицы?
---

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

## <strong>Как написать метод</strong> <code>isElementPresent</code><strong>?</strong> [#q-14bee738d69b81439ea4c54a665034d9]

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

```java
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;

public class WebElementChecker {

    private WebDriver driver;

    public WebElementChecker(WebDriver driver) {
        this.driver = driver;
    }

    // Метод для проверки существования элемента по локатору
    public boolean isElementPresent(By locator) {
        try {
            driver.findElement(locator);
            return true;  // Элемент найден
        } catch (NoSuchElementException e) {
            return false; // Элемент не найден
        }
    }
}
```

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

```java
WebDriver driver = new ChromeDriver();
WebElementChecker checker = new WebElementChecker(driver);

// Проверка присутствия элемента
boolean isPresent = checker.isElementPresent(By.id("some-element-id"));
System.out.println("Элемент присутствует: " + isPresent);
```

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

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

1. [isElementPresent в Selenium 2.0](https://stackoverflow.com/questions/5922930/iselementpresent-in-selenium-2-0)
   :::

---

## <strong>Как вычитать данные из динамической веб-таблицы?</strong> [#q-14bee738d69b81d89d45e328a09e4ca4]

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

{/* prettier-ignore */}
1. <strong>Определите</strong> <code>XPath</code> <strong>или</strong> <code>CSS Selector</code> <strong>таблицы</strong>&#58;

    - Определите уникальный селектор, который позволит вам получить доступ к таблице и её строкам.

1. <strong>Получите список строк таблицы</strong>&#58;

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

1. <strong>Итерация по строкам</strong>&#58;

    - Пройдитесь по каждой строке и извлеките данные из ячеек.

1. <strong>Чтение данных из каждой ячейки</strong>&#58;

    - Для каждой строки получите список ячеек и затем извлеките текст или другие данные из каждой ячейки.

Пример кода на Java с использованием WebDriver&#58;

```java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.List;

public class TableReader {
    private WebDriver driver;

    public TableReader(WebDriver driver) {
        this.driver = driver;
    }

    public void readTableData(By tableLocator) {
        // Находим таблицу
        WebElement table = driver.findElement(tableLocator);

        // Получаем строки таблицы
        List<WebElement> rows = table.findElements(By.tagName("tr"));

        // Перебираем строки
        for (WebElement row : rows) {
            List<WebElement> cells = row.findElements(By.tagName("td")); // Получаем ячейки для текущей строки

            // Считываем данные из каждой ячейки
            for (WebElement cell : cells) {
                System.out.print(cell.getText() + " ");
            }
            System.out.println();
        }
    }
}
```

Использование&#58;

```java
WebDriver driver = new ChromeDriver();
TableReader reader = new TableReader(driver);
reader.readTableData(By.id("your-table-id"));
```

<strong>Рекомендации</strong>&#58;

- Убедитесь, что таблица полностью загружена, прежде чем пытаться извлекать из неё данные. Можно использовать явные ожидания для удостоверения в том, что таблица готова к чтению.

- Обработайте исключения, такие как <code>NoSuchElementException</code>, если элементы изменяются или исчезают в процессе загрузки страницы.

- Если таблица содержит пагинацию, убедитесь, что учитываете переходы по страницам при чтении данных.

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

1. [Вычитание данных из динамической веб-таблицы](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kak-vychitat-dannye-iz-dinamicheskoi-veb-tablicy)
   :::

---

## <strong>Можете ли вы назвать 10 интерфейсов в Selenium?</strong> [#q-14bee738d69b81089d88ecb879167c32]

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

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

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

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

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

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

    - Суперинтерфейс для WebDriver и WebElement, обеспечивает функционал поиска элементов на странице.

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

    - Позволяет выполнение JavaScript кода в текущем окне или фрейме.

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

    - Интерфейс для создания скриншотов текущего окна.

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

    - Предоставляет методы для управления всплывающими окнами alert, confirm и prompt.

1. <code>WebDriver&#46;Navigation</code>&#58;

    - Позволяет навигацию по истории браузера (вперед, назад) и переход по URL.

1. <code>WebDriver&#46;Options</code>&#58;

    - Интерфейс для управления cookies, таймаутами и окном браузера. Работа с localStorage в WebDriver.Options не входит.

1. <code>WebDriver&#46;TargetLocator</code>&#58;

    - Предоставляет методы для переключения между фреймами, окнами и работе с модальными окнами.

1. <code>WebDriver&#46;Timeouts</code>&#58;

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

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

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

1. [Selenium в WebDriver](https://testengineer.ru/selenium-webdriver/)
   :::

---

## <strong>Назовите два способа, позволяющих автоматизировать капчу.</strong> [#q-14bee738d69b8153987ce78e52a5a148]

Автоматизация CAPTCHA является сложной задачей, так как CAPTCHA разработана специально для препятствия автоматизации. Однако, есть несколько способов, которые могут быть использованы для автоматизации или обхода CAPTCHA в тестировании&#58;

{/* prettier-ignore */}
1. <strong>Использование API для распознавания CAPTCHA</strong>&#58;

    - <strong>Описание</strong>&#58; Существуют сервисы, такие как <code>Anti&#45;CAPTCHA</code> или <code>DeathByCAPTCHA</code>, которые предлагают API для распознавания CAPTCHA. Эти сервисы используют машинное зрение или людские операторы для распознавания и возврата текста CAPTCHA.

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

1. <strong>Разработка тестового обхода</strong>&#58;

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

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

Оба этих способа имеют свои плюсы и минусы. Использование внешних сервисов для распознавания CAPTCHA может быть эффективным, но это увеличивает зависимость от сторонних сервисов и может нарушать политику конфиденциальности. Тестовый обход с помощью разработчиков является надежным для автоматизированных тестов, но не подходит для тестирования в производственной среде, где CAPTCHA должна выполнять свою защитную функцию.

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

1. [Автоматический ввод капчи](https://habr.com/ru/articles/153413/)
   :::

---

## <strong>Вспомните типы навигационных команд Selenium.</strong> [#q-14bee738d69b81d39a27c5fb094a3932]

В Selenium WebDriver навигационные команды позволяют управлять браузером и осуществлять навигацию в рамках веб-сессии. Вот основные типы навигационных команд&#58;

{/* prettier-ignore */}
1. <strong>Переход по URL</strong>&#58;

    - driver.get("http&#58;//example.com")&#58; открывает URL; ожидание зависит от pageLoadStrategy и не гарантирует завершения всех фоновых запросов приложения.

1. <strong>Навигация вперёд и назад</strong>&#58;

    - <code>driver&#46;navigate&#40;&#41;&#46;back&#40;&#41;</code>&#58; Возвращает пользователя на одну страницу назад в истории браузера.

    - <code>driver&#46;navigate&#40;&#41;&#46;forward&#40;&#41;</code>&#58; Перемещает пользователя на одну страницу вперёд в истории браузера.

1. <strong>Обновление страницы</strong>&#58;

    - <code>driver&#46;navigate&#40;&#41;&#46;refresh&#40;&#41;</code>&#58; Обновляет текущую страницу.

1. <strong>Переход по URL с навигационного объекта</strong>&#58;

    - driver.navigate().to("http&#58;//example.com")&#58; открывает URL через интерфейс Navigation. Методы back(), forward() и refresh() вызывают отдельно.

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

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

1. [Навигационные в WebDriver](https://translated.turbopages.org/proxy_u/en-ru.ru.eab1cad2-667fd744-d1b89261-74722d776562/https/www.geeksforgeeks.org/selenium-webdriver-navigation-commands/)
   :::

---

## <strong>Как найти поврежденные ссылки в</strong> <code>Selenium WebDriver</code><strong>?</strong> [#q-14bee738d69b81018f98ed54f33488f6]

Для нахождения поврежденных ссылок на веб-странице с использованием Selenium WebDriver можно следовать этим шагам&#58;

{/* prettier-ignore */}
1. <strong>Получение всех ссылок с страницы</strong>&#58;

    - Сначала нужно получить все элементы на странице, которые содержат тег <code>&#60;a&#62;</code> и атрибут <code>href</code>. Это можно сделать, используя <code>findElements&#40;&#41;</code> с подходящим локатором.

        ```java
        List<WebElement> links = driver.findElements(By.tagName("a"));
        ```

1. <strong>Итерация по списку ссылок</strong>&#58;

    - Затем следует перебрать все найденные элементы и получить URL каждой ссылки.

        ```java
        for (WebElement link : links) {
            String url = link.getAttribute("href");
            // проверка URL
        }
        ```

1. <strong>Проверка HTTP статуса каждой ссылки</strong>&#58;

    - Для каждой ссылки необходимо отправить HTTP запрос и проверить ответ. Это можно сделать с помощью библиотеки, такой как <code>HttpClient</code> из Apache или <code>HttpURLConnection</code> в стандартной библиотеке Java.

        ```java
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("HEAD");
        int responseCode = connection.getResponseCode();
        if (responseCode >= 400) {
            System.out.println(url + " is a broken link");
        } else {
            System.out.println(url + " is a valid link");
        }
        ```

1. <strong>Обработка исключений</strong>&#58;

    - Важно обрабатывать возможные исключения, такие как <code>MalformedURLException</code> и <code>IOException</code>, которые могут возникнуть в процессе проверки ссылок.

1. <strong>Оптимизация производительности</strong>&#58;

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

Проверяйте только HTTP(S)-ссылки, отдельно учитывайте перенаправления и авторизацию. Ответ 405 на HEAD может требовать проверки GET; 401 или 403 может означать отсутствие нужной сессии, а не повреждённую ссылку. Упрощённый пример выше не различает эти случаи.

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

1. [Поврежденные ссылки в Selenium WebDriver](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kak-naiti-povrezhdennye-ssylki-v-selenium-webdriver)
   :::

---

## Как переключиться на iframe без id и name в Selenium? [#q-14bee738d69b81808007f7a21588945d]

Если в вашем сценарии автоматизации тестирования в Selenium WebDriver необходимо взаимодействовать с элементами внутри <code>&#60;iframe&#62;</code>, но у <code>&#60;iframe&#62;</code> отсутствуют удобные атрибуты, такие как <code>id</code> или <code>name</code>, вы можете использовать другие техники для работы с фреймами&#58;

{/* prettier-ignore */}
1. <strong>Использование индекса фрейма</strong>&#58;

    - Фреймы на странице могут быть доступны по индексу. Selenium WebDriver позволяет переключаться на фреймы, используя порядковый номер фрейма на странице, начиная с 0.

    - Пример&#58;

        ```java
        driver.switchTo().frame(0); // Переключение на первый фрейм на странице
        ```

1. <strong>Использование XPath или CSS-селекторов</strong>&#58;

    - Если у фрейма нет <code>id</code> или <code>name</code>, можно использовать другие атрибуты или структуру DOM для локализации фрейма через XPath или CSS-селекторы.

    - Пример&#58;

        ```java
        WebElement frameElement = driver.findElement(By.xpath("//iframe[@some_attribute='value']"));
        driver.switchTo().frame(frameElement);
        ```

1. <strong>Поиск уникальных характеристик</strong>&#58;

    - Можно искать фреймы по любым уникальным атрибутам или даже содержимому внутри фрейма, если это возможно.

1. <strong>Перебор всех фреймов</strong>&#58;

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

        ```java
        List<WebElement> iframes = driver.findElements(By.tagName("iframe"));
        for (WebElement iframe : iframes) {
            driver.switchTo().frame(iframe);
            // Проверить наличие элемента в этом фрейме
            if (!driver.findElements(By.id("yourElementId")).isEmpty()) {
                break; // Нужный элемент найден
            }
            driver.switchTo().defaultContent(); // Вернуться к основному контенту перед следующей итерацией
        }
        ```

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

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

1. [Техника без frame id и frame name](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/kakuyu-tekhniku-sleduet-rassmotret-ispolzuya-ves-scenarii-esli-net-ni-frame-id-ni-frame-name)
   :::
