Подготовьтесь к интервью по Selenium с полным списком из более чем 100 вопросов. Эти вопросы подходят как для новичков, так и для опытных специалистов. Мы начнем с довольно простых вопросов и постепенно перейдем к более сложным, связанным с фреймворками для автоматизации на базе Selenium.
Если у вас мало времени, то ниже представлен топ-10 вопросов по Selenium на собеседовании:
- Как найти элемент, частично совпадающий по значению атрибута, используя XPath?
- Как перейти к родительскому элементу, используя XPath?
- В чем принципиальная разница между XPath и CSS-селекторами?
- Как переключаться между несколькими окнами в Selenium?
- Напишите код для двойного клика по элементу.
- Какие исключения часто встречаются в Selenium?
- Как сделать скриншот в Selenium?
- В чем разница между driver.findElement() и driver.findElements()?
- Как выполнить операцию перетаскивания в Selenium?
- Объясните строку кода Webdriver driver = new FirefoxDriver()
Вы также можете перейти по ссылкам ниже к различным разделам с более сложными вопросами.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Содержание:
- Вопросы для новичков по Selenium
- Вопросы по Selenium на Java
- Вопросы для опытных специалистов по Selenium
- Сложные вопросы по Selenium
Вопросы по Selenium для новичков
1. Что такое Selenium?
Selenium — это мощный набор инструментов для автоматизации, используемый для автоматизации веб-приложений. Он поддерживает различные браузеры, языки программирования и платформы.
2. Назовите компоненты Selenium
- Selenium WebDriver — используется для автоматизации веб-приложений путем прямого обращения к методам браузера.
- Плагин Selenium IDE — это инструмент с открытым исходным кодом, работающий по принципу записи и воспроизведения.
- Компонент Selenium RC — Selenium Remote Control (RC) официально устарел. Он использовал JavaScript для автоматизации веб-приложений.
- Selenium Grid — позволяет выполнять тесты параллельно на нескольких машинах.
3. Назовите преимущества Selenium
Преимущества Selenium:
- Бесплатный и с открытым исходным кодом, без лицензионных затрат.
- Поддерживает несколько языков, таких как Java, Ruby, Python и т.д.
- Поддерживает многобраузерное тестирование.
- Большое количество ресурсов и сообщество для поддержки.
- С помощью компонента Selenium IDE скрипты автоматизации могут писать даже те, кто не владеет программированием.
- С помощью компонента Selenium Grid можно проводить распределенное тестирование на удаленных машинах.
4. Какие ограничения у Selenium?
Ограничения Selenium:
- Невозможно тестировать десктопные приложения.
- Невозможно тестировать веб-сервисы.
- Требуются знания программирования для создания надежных скриптов в Selenium WebDriver.
- Для выполнения таких задач, как ведение логов (log4J), работа с фреймворками для тестирования (TestNG, JUnit) и чтение внешних файлов (POI для Excel), необходимы сторонние библиотеки и инструменты.
5. Какие браузеры/драйверы поддерживаются Selenium WebDriver?
Основные поддерживаемые браузеры:
- Google Chrome — ChromeDriver
- Firefox — FireFoxDriver
- Internet Explorer — InternetExplorerDriver
- Safari — SafariDriver
- HtmlUnit (безголовый браузер) — HtmlUnitDriver
- Android — Selendroid/Appium
- iOS — ios-driver/Appium
6. Что такое Selenium 4 и чем он отличается от предыдущих версий?
Selenium 4 — это последняя версия Selenium, которая соответствует стандартам W3C (World Wide Web Consortium). Это делает тесты Selenium более стабильными и снижает проблемы совместимости с различными веб-браузерами.
Пользователи предыдущих версий, таких как Selenium 3, знают, что для связи с браузерами Selenium использует протокол JSON wire. В Selenium 4 нет необходимости в кодировании и декодировании запросов API через JSON wire, что позволяет WebDriver напрямую взаимодействовать с целевым браузером.
7. Какие особенности у Selenium 4?
Особенности Selenium 4:
- Он соответствует стандартам W3C, что делает тесты для различных браузеров более стабильными.
- Введен новый Selenium 4 IDE для Chrome и Firefox.
- Тесты Selenium 4 IDE можно экспортировать в желаемые языки программирования — C#, Java, JavaScript и т. д.
- Улучшенная функция Selenium Grid с поддержкой Docker (набор продуктов для виртуализации на уровне ОС, использующих контейнеры).
- Более подробная и улучшенная документация.
8. Можем ли мы тестировать API или веб-сервисы с помощью Selenium WebDriver?
Нет, Selenium WebDriver использует методы браузера для автоматизации веб-приложений, поэтому он не поддерживает тестирование веб-сервисов.
9. Какие существуют способы локализации элемента в Selenium?
Варианты локаторов в Selenium:
- Id
- XPath
- CSS-селектор
- className
- tagName
- name
- link text
- partialLinkText
10. Как мы можем инспектировать атрибуты веб-элемента для их использования в локаторах?
Для локализации веб-элементов можно использовать инструменты разработчика и плагины, такие как Firebug.
Инструмент разработчика можно открыть, нажав F12 в браузере. Пользователь может навести курсор на любой элемент, чтобы увидеть его HTML-свойства.
11. Что такое XPath?
XPath (XML Path Language) — это язык запросов, используемый для выбора узлов из XML-документов. XPath также является одним из локаторов, поддерживаемых Selenium WebDriver.
12. Что такое абсолютный XPath?
Абсолютный XPath — это способ поиска элемента с помощью выражения XML, начиная с корневого узла, то есть узла HTML в случае веб-страниц.
Главный недостаток абсолютного XPath в том, что даже небольшое изменение в интерфейсе или элементе приводит к сбою всего XPath.
Пример: html/body/div/div[2]/div/div/div/div[1]/div/input
13. Что такое относительный XPath?
Относительный XPath — это способ поиска элемента с помощью выражения XML, начиная с любой точки в HTML-документе.
Этот способ позволяет создавать более устойчивые относительные XPaths, которые изменяются минимально или вообще не изменяются при изменениях других элементов интерфейса.
Пример: //input[@id='username']
14. В чем разница между одинарным слэшем (/) и двойным слэшем (//) в XPath?
В XPath одинарный слэш используется для создания абсолютных XPath, начиная с корневого узла, тогда как двойной слэш используется для создания относительных XPath.
15. Как найти элемент, частично совпадающий по значению атрибута, используя XPath?
С помощью метода contains()
можно найти элемент, частично совпадающий по значению атрибута. Это особенно полезно в ситуациях, когда атрибуты имеют динамические значения с определенной постоянной частью.
Пример выражения XPath: //*[contains(@name,'user')]
. Данное выражение будет находить все значения атрибута name
, содержащие слово “user”.
16. Как найти элемент по его тексту, используя XPath?
С помощью метода text()
: xPathExpression = //*[text()='username']
17. Как перейти к родительскому элементу, используя XPath?
Используя /..
после XPath выражения дочернего элемента, можно перейти к родительскому элементу.
Пример локатора: //div[@id="childId"]/..
— этот локатор переместится к родительскому элементу div с id
равным “childId”.
18. Как перейти к n-му дочернему элементу, используя XPath?
Существуют два способа перейти к n
-му элементу с помощью XPath:
- С использованием квадратных скобок с указанием позиции. Например,
div[2]
найдет второй элемент div. - С использованием
position()
. Например,div[position()=3]
найдет третий элемент div.
19. Как найти элемент по классу с помощью CSS-селектора?
Используя .className
в локаторе CSS, можно выбрать все элементы, принадлежащие определенному классу, например: .red
выберет все элементы с классом red
.
20. Как найти элемент по id с помощью CSS-селектора?
Используя #id
в локаторе CSS, можно выбрать все элементы с определенным идентификатором, например: #userId
выберет элемент с id
, равным userId
.
21. Как выбрать элементы по значению атрибута, используя CSS-селектор?
Используя [attribute=value]
в локаторе CSS, можно выбрать все элементы с определенным атрибутом, например: [type=small]
выберет элемент с атрибутом type
и значением small
.
22. Как перейти к n-му дочернему элементу, используя CSS-селектор?
Используя :nth-child(n)
в локаторе CSS, можно перейти к n
-му дочернему элементу, например: div:nth-child(2)
найдет второй элемент div у родительского элемента.
23. В чем принципиальная разница между XPath и CSS-селекторами?
Основное различие между XPath и CSS-селекторами в том, что с помощью XPath можно подниматься вверх по документу, то есть переходить к родительским элементам, тогда как с помощью CSS-селектора можно только двигаться вниз по документу.
Вопросы по Selenium на Java
В этом разделе мы разберем вопросы по Selenium WebDriver на основе языка программирования Java.
24. Как запустить разные браузеры в Selenium WebDriver?
Для этого нужно создать экземпляр драйвера нужного браузера, например, следующая команда инициализирует браузер Firefox:
WebDriver driver = new FirefoxDriver();
25. Для чего используются команды driver.get(“URL”) и driver.navigate().to(“URL”)? Есть ли разница между ними?
Обе команды driver.get("URL")
и driver.navigate().to("URL")
используются для перехода на URL, переданный в качестве параметра. Между ними есть небольшая разница:
driver.navigate()
позволяет перемещаться назад и вперед по истории браузера с помощью командdriver.navigate().forward()
иdriver.navigate().back()
.- В случае одностраничных приложений (где URL изменяется с помощью ‘#’ для перехода к различным разделам страницы)
driver.navigate().to()
может перемещаться к определенному разделу без обновления страницы. В то время какdriver.get()
обновляет страницу.
Эта перезагрузка страницы также является основной причиной того, что история не сохраняется в случае команды driver.get()
.
26. Как ввести текст в текстовое поле, используя Selenium?
С помощью метода sendKeys()
можно вводить текст в текстовое поле:
WebElement searchTextBox = driver.findElement(By.id("srch")); searchTextBox.sendKeys("searchTerm");
27. Как удалить текст из текстового поля?
Для удаления текста из текстового поля можно использовать метод clear()
:
driver.findElement(By.id("elementLocator")).clear();
28. Как установить флажок (checkbox)?
Тот же метод click()
, который мы используем для нажатия на кнопки или переключатели, можно использовать для установки флажка.
29. Как отправить форму в Selenium?
С помощью метода submit()
можно отправить форму в Selenium:
driver.findElement(By.id("form1")).submit();
Также можно использовать метод click()
для той же цели.
30. Объясните разницу между командами close и quit.
Разница между командами close
и quit
следующая:
driver.close()
– закрывает только текущее окно браузера, которое в данный момент активно. Если тест запускает несколько окон или вкладок, то командаclose()
завершит работу только с одним из них, не затрагивая остальные.driver.quit()
– завершает все сеансы WebDriver и закрывает все окна браузера, запущенные этим тестом. Эта команда полностью завершает работу с браузером, освобождая ресурсы и останавливая все активные экземпляры браузера, связанные с данным сеансом WebDriver.
31. Как переключаться между несколькими окнами в Selenium?
Selenium имеет команды driver.getWindowHandles()
и driver.switchTo().window("{windowHandleName}")
для работы с несколькими окнами.
Команда getWindowHandles()
возвращает список идентификаторов для каждого окна. Если мы передадим определенный идентификатор окна в команду driver.switchTo().window("{windowHandleName}")
, то сможем переключить управление/фокус на это окно.
for (String windowHandle : driver.getWindowHandles()) { driver.switchTo().window(windowHandle); }
32. В чем разница между driver.getWindowHandle() и driver.getWindowHandles()?
driver.getWindowHandle()
возвращает идентификатор текущего окна (уникальный идентификатор для одного окна), тогда как driver.getWindowHandles()
возвращает набор идентификаторов всех доступных окон.
33. Как переключиться на конкретный фрейм?
Команда driver.switchTo()
используется для перехода на определенный iframe.
driver.switchTo().frame("{frameIndex/frameId/frameName}");
Для поиска фрейма можно использовать его индекс (начиная с 0), имя или его id.
34. Можно ли перемещаться назад и вперед в браузере?
Да, с помощью команд driver.navigate().back()
и driver.navigate().forward()
можно перемещаться назад и вперед в браузере.
35. Какие существуют способы обновить страницу браузера?
Есть несколько способов обновить страницу в Selenium:
- Использовать команду
driver.navigate().refresh()
. - Использовать
sendKeys(Keys.F5)
на любом текстовом поле на веб-странице. - Использовать
driver.get("URL")
для текущего URL илиdriver.getCurrentUrl()
. - Использовать
driver.navigate().to("URL")
для текущего URL илиdriver.navigate().to(driver.getCurrentUrl())
.
36. Как можно развернуть окно браузера в Selenium?
Окно браузера можно развернуть с помощью команды driver.manage().window().maximize()
.
37. Как можно получить текст элемента?
С помощью метода getText()
можно получить текст элемента.
String text = driver.findElement("elementLocator").getText();
38. Как можно найти значения различных атрибутов, таких как name, class и value элемента?
Чтобы получить значения различных атрибутов элемента, таких как name
, class
, value
, и других, в Selenium используется метод getAttribute("{attributeName}")
. Этот метод позволяет обратиться к конкретному атрибуту элемента и получить его значение. Например:
String valueAttribute = driver.findElement(By.id("locator")).getAttribute("value");
В этом примере мы ищем элемент по его id
(замените “locator” на реальный идентификатор элемента). После этого с помощью getAttribute("value")
получаем значение атрибута value
данного элемента и сохраняем его в переменной valueAttribute
.
39. Как удалить файлы cookie в Selenium?
В Selenium для удаления файлов cookie в браузере можно использовать метод deleteAllCookies()
.
40. Что такое неявное ожидание (implicit wait)?
Неявное ожидание — это вид ожидания, который ждет указанное время при поиске элемента перед тем, как выдать исключение NoSuchElementException
. По умолчанию Selenium пытается найти веб-элементы немедленно, без ожидания, поэтому рекомендуется использовать неявное ожидание. Это ожидание применяется ко всем элементам текущего экземпляра браузера.
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
41. Что такое явное ожидание (explicit wait)?
Явное ожидание — это вид ожидания, который применяется к конкретному веб-элементу до тех пор, пока не выполнится указанное условие.
WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));
Рекомендуется использовать явные ожидания вместо неявных, так как более высокое время ожидания в неявных ожиданиях (установленное для обработки только некоторых медленных элементов) применяется ко всем веб-элементам, что увеличивает общее время выполнения сценария. Можно применять разные тайм-ауты к разным элементам в случае явных ожиданий.
42. Какие условия ожидания существуют для явных ожиданий?
Вот некоторые из самых популярных условий ожидания для явных ожиданий:
- elementToBeClickable(WebElement element or By locator)
- stalenessOf(WebElement element)
- visibilityOf(WebElement element)
- visibilityOfElementLocated(By locator)
- invisibilityOfElementLocated(By locator)
- attributeContains(WebElement element, String attribute, String value)
- alertIsPresent()
- titleContains(String title)
- titleIs(String title)
- textToBePresentInElementLocated(By, String)
43. Что такое свободное ожидание (fluent wait)?
Свободное ожидание(Fluent Wait) — это специальный тип ожидания в Selenium, который предоставляет более гибкий и настраиваемый способ ожидания событий, например, появления элементов на странице. Главное отличие Fluent Wait от других типов ожиданий (например, явных ожиданий) заключается в том, что он позволяет задать два важных параметра:
- Максимальное время ожидания — это общее время, в течение которого Selenium будет пытаться найти элемент.
- Интервал опроса — это промежуток времени, через который драйвер будет снова пытаться найти элемент, если он ещё не найден. Этот интервал можно настроить, чтобы избежать излишней нагрузки на систему и дать браузеру время на обновление состояния.
Wait wait = new FluentWait(driver) .withTimeout(20, SECONDS) .pollingEvery(5, SECONDS) .ignoring(NoSuchElementException.class); WebElement textBox = wait.until(new Function<webdriver,webElement>() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("textBoxId")); } });
44. Какие операции с клавиатурой можно выполнять в Selenium?
Давайте рассмотрим различные операции с клавиатурой, которые можно выполнять в Selenium:
.sendKeys("последовательность символов")
— используется для передачи последовательности символов в поле ввода или текстовое поле..pressKey("не текстовые клавиши")
— используется для клавиш, таких как Control, функциональные клавиши и другие, которые не являются текстовыми..releaseKey("не текстовые клавиши")
— используется в Selenium для симуляции отпускания клавиши, которая была ранее нажата. Этот метод обычно применяется в сочетании с событием нажатия клавиши, чтобы создать полную симуляцию работы с клавишами.
45. Какие действия с мышью можно выполнять с помощью Selenium?
В Selenium поддерживаются следующие события мыши:
click(WebElement element)
— клик по элементу.doubleClick(WebElement element)
— двойной клик по элементу.contextClick(WebElement element)
— клик правой кнопкой мыши по элементу.mouseDown(WebElement element)
— нажатие кнопки мыши на элементе.mouseUp(WebElement element)
— отпускание кнопки мыши на элементе.mouseMove(WebElement element)
— перемещение мыши к элементу.mouseMove(WebElement element, long xOffset, long yOffset)
— перемещение мыши к элементу с заданным смещением.
46. Напишите код для двойного клика по элементу.
Код для двойного клика по элементу:
Actions action = new Actions(driver); WebElement element = driver.findElement(By.id("elementId")); action.doubleClick(element).perform();
47. Напишите код для клика правой кнопкой мыши по элементу.
Код для клика правой кнопкой мыши в Selenium:
Actions action = new Actions(driver); WebElement element = driver.findElement(By.id("elementId")); action.contextClick(element).perform();
48. Как выполнить наведение мыши на элемент в Selenium?
Код для наведения мыши на элемент:
Actions action = new Actions(driver); WebElement element = driver.findElement(By.id("elementId")); action.moveToElement(element).perform();
49. Как получить текущий URL страницы?
Для получения текущего URL страницы можно использовать команду driver.getCurrentURL()
.
50. Как получить заголовок страницы в Selenium?
С помощью команды driver.getTitle()
можно получить заголовок страницы в Selenium. Этот метод возвращает строку, содержащую заголовок веб-страницы.
51. Как получить исходный код страницы?
С помощью команды driver.getPageSource()
можно получить исходный код страницы в Selenium. Этот метод возвращает строку с исходным кодом страницы.
52. Как проверить текст всплывающей подсказки (tooltip)?
Всплывающие подсказки имеют атрибут типа title
. Получив значение атрибута title
, мы можем проверить текст подсказки в Selenium.
String toolTipText = element.getAttribute("title");
53. Как найти ссылку, используя её текст?
Методы linkText()
и partialLinkText()
в Selenium используются для нахождения ссылок на веб-странице, но между ними есть важное различие.
linkText()
позволяет найти ссылку по полному тексту, который отображается на странице. То есть, если ссылка на странице выглядит как, например, “Перейти на главную”, то методlinkText("Перейти на главную")
будет искать именно такую ссылку с точным совпадением текста.partialLinkText()
позволяет найти ссылку по частичному совпадению текста. Это полезно, когда вы не хотите точно указывать весь текст, а достаточно его части. Например, если на странице есть ссылка с текстом “Перейти на главную страницу”, то использованиеpartialLinkText("главную")
найдет эту ссылку, даже если текст ссылки полностью не совпадает.
WebElement link1 = driver.findElement(By.linkText("artOfTesting")); WebElement link2 = driver.findElement(By.partialLinkText("artOf"));
54. Что такое DesiredCapabilities в Selenium WebDriver?
DesiredCapabilities — это механизм в Selenium, который представляет собой набор параметров в виде пар “ключ-значение”. Эти параметры используются для настройки и конфигурации различных свойств браузера или устройства, с которым будет работать ваш тест. В частности, DesiredCapabilities позволяют задать такие настройки, как:
- Версия браузера (например, Chrome 89 или Firefox 85)
- Платформа (например, Windows, macOS, Linux)
- Тип устройства (например, мобильное устройство или планшет)
- Специальные настройки для работы с браузером (например, включение режима инкогнито)
55. Как найти все ссылки на веб-странице?
Все ссылки на странице имеют тег <a>
. Поэтому, найдя элементы с именем тега a
, мы можем получить все ссылки на веб-странице.
List<WebElement> links = driver.findElements(By.tagName("a"));
56. Какие исключения часто встречаются в Selenium?
Некоторые часто встречающиеся исключения в Selenium:
NoSuchElementException
— когда элемент не может быть найден по предоставленному локатору.ElementNotVisibleException
— когда элемент присутствует в DOM, но не виден.NoAlertPresentException
— когда мы пытаемся переключиться на окно с уведомлением, но оно отсутствует.NoSuchFrameException
— когда мы пытаемся переключиться на фрейм, но он отсутствует.NoSuchWindowException
— когда мы пытаемся переключиться на окно, но оно отсутствует.UnexpectedAlertPresentException
— когда неожиданное уведомление блокирует обычное взаимодействие драйвера.TimeoutException
— когда выполнение команды превышает время ожидания.InvalidElementStateException
— когда состояние элемента не соответствует для нужного действия.NoSuchAttributeException
— когда мы пытаемся получить значение атрибута, но атрибут некорректен.WebDriverException
— когда возникают проблемы с экземпляром драйвера, не позволяющие ему запуститься.
57. Как сделать скриншот в Selenium?
Для создания скриншотов в Selenium можно использовать метод getScreenshotAs
интерфейса TakesScreenshot
.
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(scrFile, new File("D:\\testScreenShot.jpg"));
58. Как обрабатывать выпадающие списки?
Обрабатывать выпадающие списки в Selenium можно с помощью класса Select
:
Select countriesDropDown = new Select(driver.findElement(By.id("countries"))); dropdown.selectByVisibleText("India"); // или по индексу, начиная с 0 dropdown.selectByIndex(1); // или по значению атрибута dropdown.selectByValue("Ind");
59. Как узнать, какой вариант в выпадающем списке выбран?
С помощью метода isSelected()
можно проверить состояние элемента в выпадающем списке.
Select countriesDropDown = new Select(driver.findElement(By.id("countries"))); dropdown.selectByVisibleText("India"); System.out.println(driver.findElement(By.id("India")).isSelected());
60. Как проверить, отображается ли элемент на веб-странице?
С помощью метода isDisplayed()
можно проверить, отображается ли элемент на веб-странице.
driver.findElement(By locator).isDisplayed();
61. Как проверить, доступен ли элемент для взаимодействия на веб-странице?
С помощью метода isEnabled()
можно проверить, доступен ли элемент.
driver.findElement(By locator).isEnabled();
62. В чем разница между командами driver.findElement() и driver.findElements()?
findElement()
возвращает один элементWebElement
, который был найден первым по указанному локатору.findElements()
возвращает список элементовWebElements
, которые удовлетворяют значению локатора.- Если элемент не найден,
findElement()
вызывает исключениеNoSuchElementException
, тогда какfindElements()
возвращает список с нулевым количеством элементов.
63. Как обрабатывать элементы UI и всплывающие окна Windows с помощью Selenium?
Selenium используется только для автоматизации веб-приложений. Чтобы управлять элементами Windows, можно использовать AutoIT.
AutoIT — это бесплатный инструмент для автоматизации действий в Windows, который позволяет имитировать нажатия клавиш, движения мыши и взаимодействие с графическим интерфейсом. Его часто используют для автоматизации задач, которые сложно выполнить с помощью Selenium, поскольку Selenium поддерживает только веб-приложения и не работает с элементами интерфейса Windows.
64. Что такое Robot API?
С помощью Robot API можно симулировать ввод с клавиатуры и мыши, выполнять различные действия, такие как нажатие клавиш, перемещение мыши, прокрутка и т.д. Этот API полезен для тестирования приложений, создания автоматических действий или симуляции пользовательских сценариев, которые требуют взаимодействия с графическим интерфейсом.
Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_ENTER);
65. Как выполнить загрузку файла в Selenium?
Файл можно загрузить несколькими способами:
- Используя
element.sendKeys("путь к файлу")
. - С помощью Robot API.
- Используя AutoIT API.
66. Как работать с HTTPS-сайтами в Selenium или как принять неподтвержденное SSL-соединение?
Когда вы работаете с HTTPS-сайтами в Selenium, иногда встречаются сайты с неподтвержденными SSL-сертификатами, например, сайты с самоподписанными сертификатами. Браузеры обычно блокируют такие сайты или показывают предупреждения о безопасности, что может прерывать тесты. Чтобы избежать этого и автоматически принять такие соединения, можно настроить профиль браузера.
В Firefox для этого используется класс FirefoxProfile
. С помощью этого класса можно настроить браузер так, чтобы он принимал неподтвержденные сертификаты и игнорировал предупреждения.
FirefoxProfile profile = new FirefoxProfile(); profile.setAcceptUntrustedCertificates(true); profile.setAssumeUntrustedCertificateIssuer(false); WebDriver driver = new FirefoxDriver(profile);
67. Как выполнить операцию перетаскивания в Selenium?
С помощью класса Actions
можно выполнить операцию перетаскивания.
Actions builder = new Actions(driver); Action dragAndDrop = builder.clickAndHold(SourceElement) .moveToElement(TargetElement) .release(TargetElement) .build(); dragAndDrop.perform();
68. Как выполнить JavaScript-код в Selenium?
JavaScript-код можно выполнить с помощью JavaScriptExecuter
.
WebDriver driver = new FireFoxDriver(); if (driver instanceof JavascriptExecutor) { ((JavascriptExecutor)driver).executeScript("{JavaScriptCode}"); }
69. Как работать с предупреждениями (alerts) в Selenium?
Для работы с окнами предупреждений (так называемыми alert окнами) в Selenium используется класс Alert
. Окна предупреждений (например, всплывающие диалоговые окна) часто появляются на веб-страницах, чтобы уведомить пользователя о какой-то важной информации или запросить подтверждение действия. Чтобы обработать такие окна в автоматизированных тестах, Selenium предоставляет возможности для переключения на alert и взаимодействия с ним.
Alert alert = driver.switchTo().alert(); // Принять предупреждение alert.accept(); Alert alert = driver.switchTo().alert(); // Отклонить предупреждение alert.dismiss();
70. Что такое HtmlUnitDriver?
HtmlUnitDriver — это самый быстрый WebDriver. В отличие от других драйверов (например, FireFoxDriver, ChromeDriver), HtmlUnitDriver не имеет графического интерфейса (non-GUI). При выполнении тестовых скриптов окно браузера не отображается.
71. Как работать со скрытыми элементами в Selenium WebDriver?
Скрытые элементы можно обработать, используя JavaScript Executor:
((JavascriptExecutor)driver).executeScript("document.getElementsByClassName('locator').click()")
Вопросы для опытных специалистов по Selenium
72. Что такое объектная модель страницы (POM)?
Page Object Model (POM) — это паттерн проектирования в Selenium. Паттерн проектирования — это решение или набор стандартов, которые используются для решения часто возникающих проблем в разработке программного обеспечения. POM помогает создать структуру для поддержания сценариев Selenium. В POM для каждой страницы приложения создается класс, который содержит веб-элементы, относящиеся к этой странице, и методы, обрабатывающие события на этой странице. Тестовые сценарии поддерживаются в отдельных файлах, и методы из файлов объектов страниц вызываются в файлах тестовых сценариев.
Таким образом, можно создать надежную автоматизированную структуру, используя POM.
73. Какие преимущества у POM?
Преимущества POM (Page Object Model) следующие:
- Используя POM, можно создать объектный репозиторий, т.е. набор веб-элементов в отдельных файлах вместе с их соответствующими функциями. Это помогает поддерживать код чистым.
- При любых изменениях в пользовательском интерфейсе (или веб-элементах) необходимо обновить только файлы объектов страниц, оставляя тестовые файлы без изменений.
- Это делает код многократно используемым и удобным для обслуживания.
74. Что такое Page Factory?
Page Factory — это реализация модели объектов страницы (Page Object Model) в Selenium. Она предоставляет аннотацию @FindBy
для поиска веб-элементов. Также существует метод PageFactory.initElements()
, который инициализирует все веб-элементы, определенные с помощью аннотации @FindBy
.
public class SamplePage { WebDriver driver; @FindBy(id="search") WebElement searchTextBox; @FindBy(name="searchBtn") WebElement searchButton; // Конструктор public SamplePage(WebDriver driver){ this.driver = driver; // Метод initElements для инициализации всех элементов PageFactory.initElements(driver, this); } // Пример метода public void search(String searchTerm){ searchTextBox.sendKeys(searchTerm); searchButton.click(); } }
75. Что такое объектный репозиторий?
Объектный репозиторий — это централизованное хранилище всех объектов или веб-элементов тестовых скриптов. В Selenium объектный репозиторий можно реализовать с помощью моделей Page Object Model и Page Factory.
76. Что такое фреймворк с данными?
Фреймворк с данными — это фреймворк, в котором данные для тестирования помещаются во внешние файлы, такие как CSV, Excel и другие. В этом случае данные для тестов отделены от логики теста, написанной в скриптах. Методы теста выполняются для каждого набора значений тестовых данных.
TestNG предоставляет встроенную поддержку для тестирования с использованием данных с помощью аннотации @DataProvider
.
77. Что такое фреймворк, основанный на ключевых словах?
Фреймворк, основанный на ключевых словах, — это фреймворк, в котором мы связываем обычные действия с ключевыми словами и сохраняем их в внешнем файле, обычно в табличной форме.
Например, можно использовать ключевое слово:
launchBrowser()
, для действия запуска браузера.writeInTextBox(webElement, textToWrite)
, для действия ввода текста в текстовое поле с помощью ключевого слова и т.д.
Фреймворк содержит код для выполнения действия на основе ключевого слова, указанного во внешнем файле.
Таким образом, человек без опыта программирования также может написать шаги теста в файле, при условии, что все ключевые слова присутствуют в фреймворке вместе с их реализацией.
78. Что такое гибридный фреймворк?
Гибридный фреймворк — это комбинация двух или более фреймворков. Например, комбинация фреймворков с данными и фреймворков, основанных на ключевых словах, также является гибридным фреймворком.
79. Что такое Selenium Grid?
Selenium Grid — это инструмент, который помогает при распределенном тестировании. С помощью Grid можно запускать тестовые скрипты на разных машинах с различными браузерами, версиями браузеров, операционными системами и т.д. параллельно. В Selenium Grid есть центральный сервер, называемый хабом, который управляет всеми распределенными машинами, известными как узлы.
80. Какие преимущества у Selenium Grid?
Преимущества Selenium Grid следующие:
- Он позволяет запускать тестовые кейсы параллельно, что значительно сокращает время выполнения тестов.
- С помощью Selenium Grid можно проводить тестирование на различных браузерах, запуская тесты на машинах с разными браузерами.
- Кроме того, можно проводить многоплатформенное тестирование, настроив узлы с разными операционными системами.
81. Что такое хаб в Selenium Grid?
Хаб — это сервер или центральная точка в Selenium Grid, который управляет выполнением тестов на разных машинах.
82. Что такое узел в Selenium Grid?
Узлы — это машины, которые подключены к хабу Selenium Grid и на которых выполняются экземпляры Selenium для запуска тестовых скриптов. В отличие от хаба, в Selenium Grid может быть несколько узлов.
83. Объясните строку кода WebDriver driver = new FirefoxDriver()
В строке кода WebDriver driver = new FirefoxDriver();
WebDriver — это интерфейс, а FirefoxDriver — класс, который реализует этот интерфейс. Мы создаем объект типа WebDriver, инициализируя его экземпляром класса FirefoxDriver.
84. Зачем использовать переменную типа WebDriver вместо прямого создания объекта FirefoxDriver?
Создавая переменную-ссылку типа WebDriver, мы можем использовать одну и ту же переменную для работы с разными браузерами, такими как ChromeDriver
, IEDriver
и т.д.
85. Назовите API, используемое для чтения и записи данных в Excel файлы.
Для чтения, записи и обновления Excel файлов можно использовать API Apache POI и JXL (Java Excel API).
86. Назовите API, используемое для ведения логирования в Java.
Log4j — это открытое API, которое широко используется для логирования в Java. Оно поддерживает различные уровни логирования, такие как — ALL, DEBUG, INFO, WARN, ERROR, TRACE и FATAL.
87. Какова цель логирования в автоматизации?
Логирование помогает в отладке тестов, когда это необходимо, а также предоставляет информацию о поведении тестов во время их выполнения.
88. Что такое TestNG?
TestNG (NG — от Next Generation) — это фреймворк для тестирования, который можно интегрировать с Selenium или любым другим инструментом автоматизации. Кроме того, TestNG предоставляет множество возможностей, таких как ассерты, отчетность, параллельное выполнение тестов и т.д.
89. Какие преимущества у TestNG?
Преимущества TestNG следующие:
- TestNG предоставляет различные ассерты, которые помогают проверять ожидаемые и фактические результаты.
- Он поддерживает параллельное выполнение методов теста.
- В TestNG можно задать зависимость одного метода теста от других.
- Также можно назначать приоритет методам теста в Selenium.
- TestNG позволяет группировать методы теста в группы тестов.
- Он поддерживает тестирование с данными через аннотацию
@DataProvider
. - TestNG имеет встроенную поддержку отчетности.
- Он поддерживает параметризацию тестов с помощью аннотации
@Parameters
.
90. Какие аннотации TestNG используются чаще всего?
Часто используемые аннотации TestNG:
@Test
— аннотация, которая помечает метод как тестовый.@BeforeSuite
— аннотированный метод выполняется только один раз перед запуском всех тестов в этом наборе.@AfterSuite
— аннотированный метод выполняется только один раз после выполнения всех тестов в этом наборе.@BeforeClass
— аннотированный метод выполняется только один раз перед первым методом теста в текущем классе.@AfterClass
— аннотированный метод выполняется только один раз после выполнения всех методов теста в текущем классе.@BeforeTest
— аннотированный метод выполняется перед выполнением любых методов теста в классах, указанных в теге<test>
.@AfterTest
— аннотированный метод выполняется после выполнения всех методов теста в классах, указанных в теге<test>
.@BeforeMethod
— аннотированный метод выполняется перед каждым методом теста, помеченным аннотацией@Test
.@AfterMethod
— аннотированный метод выполняется после каждого метода теста, помеченного аннотацией@Test
.@DataProvider
— аннотация используется для передачи данных тестов в метод теста. Метод теста будет выполнен в соответствии с количеством строк данных, переданных через метод поставщика данных.
91. Какие общие утверждения предоставляет TestNG?
Некоторые из распространенных утверждений, предоставляемых TestNG:
- assertEquals(String actual, String expected, String message)
- assertNotEquals(double data1, double data2, String message)
- assertFalse(boolean condition, String message)
- assertTrue(boolean condition, String message)
- assertNotNull(Object object)
- fail(boolean condition, String message)
- true(String message)
92. Для чего используется файл testng.xml?
Файл testng.xml
используется для конфигурации всего набора тестов. В этом файле можно создать тестовый набор, определить тестовые группы, отметить тесты для параллельного выполнения, добавить слушателей и передать параметры в тестовые скрипты. Позже этот файл testng.xml
можно использовать для запуска набора тестов.
93. Как передать параметры в тестовый скрипт с помощью TestNG?
Используя аннотацию @Parameter
и тег <parameter>
в файле testng.xml
, можно передавать параметры в тестовый скрипт. Пример файла testng.xml
:
<suite name="sampleTestSuite"> <test name="sampleTest"> <parameter name="sampleParamName" value="sampleValue"/> <classes> <class name="TestFile" /> </classes> </test> </suite>
Пример тестового скрипта:
public class TestFile { @Test @Parameters("sampleParamName") public void parameterTest(String paramValue) { System.out.println("Value of sampleParamName is - " + sampleParamName); } }
94. Как создать фреймворк с данными, используя TestNG?
Для создания фреймворка с данными в TestNG можно использовать аннотацию @DataProvider
. Суть этого подхода в том, что вы передаете данные для тестов в виде нескольких наборов значений, и каждый набор данных будет использоваться для выполнения теста. Это позволяет проводить один и тот же тест с разными входными данными, что полезно для проверки различных сценариев. Метод, аннотированный аннотацией @DataProvider
, возвращает 2D массив объектов.
// Data provider, возвращающий 2D массив размером 3x2 @DataProvider(name = "dataProvider1") public Object[][] dataProviderMethod1() { return new Object[][] {{"kuldeep","rana"}, {"k1","r1"},{"k2","r2"}}; } // Этот метод связан с вышеупомянутым data provider, возвращающим 2D массив 3x2 // Метод теста будет выполнен 3 раза с разными наборами значений @Test(dataProvider = "dataProvider1") public void sampleTest(String s1, String s2) { System.out.println(s1 + " " + s2); }
95. Для чего используется аннотация @Listener в TestNG?
Слушатели используются для выполнения некоторых действий, когда срабатывает событие. Обычно слушатели в TestNG применяются для настройки отчетности и логирования. Один из самых распространенных слушателей в TestNG — это интерфейс ITestListener
.
Он включает методы, такие как onTestSuccess
, onTestFailure
, onTestSkipped
и т.д. Необходимо реализовать этот интерфейс, создав свой класс слушателя. После этого, с помощью аннотации @Listener
, можно указать, что для конкретного класса тестов должен использоваться созданный класс слушателя.
@Listeners(PackageName.CustomizedListenerClassName.class) public class TestClass { WebDriver driver = new FirefoxDriver(); @Test public void testMethod(){ // логика теста } }
96. Как сделать зависимость одного метода от другого в TestNG?
С помощью параметра dependsOnMethods
в аннотации @Test
можно сделать так, чтобы один метод теста выполнялся только после успешного выполнения зависимого теста.
@Test(dependsOnMethods = { "preTests" })
97. Как установить приоритет тестов в TestNG?
В TestNG параметр priority
в аннотации @Test
используется для задания приоритета выполнения тестов. Этот параметр позволяет указать, в каком порядке должны выполняться тесты.
Значение по умолчанию для приоритета теста, если он не указан, равно нулю. Это значит, что тесты без заданного приоритета будут выполняться первыми или в случайном порядке, если других критериев для упорядочивания нет.
@Test(priority = 1)
98. Каков приоритет тестов по умолчанию в TestNG?
Значение приоритета теста по умолчанию равно 0, если оно не указано. То есть, если один тест имеет приоритет 1, а другой — не имеет приоритета, то тест без приоритета выполнится первым.
99. Как предотвратить выполнение теста в TestNG?
Метод теста можно отключить от выполнения, установив атрибут enabled
в значение false
.
// В случае метода теста @Test(enabled = false) public void testMethod1() { // Логика теста } // В случае теста, принадлежащего группе @Test(groups = {"NegativeTests"}, enabled = false) public void testMethod2() { // Логика теста }
100. Как запустить тесты параллельно в TestNG?
Чтобы запустить тесты параллельно в TestNG, нужно добавить два параметра в конфигурацию вашего XML-файла:
- parallel — указывает, какой уровень тестов будет выполняться параллельно. Это может быть:
- methods — тесты в разных методах будут выполняться параллельно.
- tests — тесты в разных тестах будут выполняться параллельно.
- classes — тесты из разных классов будут выполняться параллельно.
- thread-count — указывает количество потоков, которые будут использоваться для параллельного выполнения тестов.
<suite name="ArtOfTestingSuite" parallel="methods" thread-count="4"> <test name="Test1"> <classes> <class name="com.example.TestClass1" /> <class name="com.example.TestClass2" /> </classes> </test> </suite>
101. Для чего используется аннотация @Factory в TestNG?
Аннотация @Factory
помогает динамически выполнять тесты. С помощью аннотации @Factory
можно передавать параметры всему классу тестов во время выполнения. Эти параметры затем могут быть использованы одним или несколькими методами теста этого класса.
Давайте рассмотрим пример. Есть два класса: TestClass
и TestFactory
. Благодаря аннотации @Factory
методы теста в классе TestClass
будут выполнены дважды с данными “k1” и “k2”.
public class TestClass { private String str; // Конструктор public TestClass(String str) { this.str = str; } @Test public void TestMethod() { System.out.println(str); } } public class TestFactory { // Методы теста класса TestClass будут выполнены дважды с данными "k1" и "k2" @Factory public Object[] factoryMethod() { return new Object[] { new TestClass("K1"), new TestClass("k2") }; } }
102. В чем разница между аннотациями @Factory и @DataProvider?
Метод, аннотированный @Factory
, используется для динамического создания экземпляров класса тестов и выполнения всех методов теста с разными наборами данных. В отличие от @DataProvider
, который применяется к отдельным методам тестов и позволяет повторно выполнить один тест с разными наборами данных, @Factory
используется для создания нескольких экземпляров тестового класса, каждый из которых может использовать разные параметры или состояния.
Основное различие:
@Factory
: Создает несколько экземпляров тестового класса и выполняет все тесты в этих экземплярах.@DataProvider
: Передает данные в отдельный метод теста и позволяет выполнить этот метод несколько раз с разными наборами данных.
Сложные вопросы на собеседовании по Selenium
103. Как вы справляетесь с динамическими элементами в Selenium WebDriver?
Во время автоматизации часто приходится сталкиваться с ситуациями, когда приложение, подлежащее автоматизации, имеет элементы с динамическими локаторами или с такими, которые заранее не известны. Эти элементы могут изменять свои атрибуты, ID или позиции в DOM во время выполнения. Для эффективной работы с такими элементами можно использовать следующие стратегии:
1. Использование XPath или CssSelector с “Contains“
Можно использовать XPath или CSS-селекторы с функцией “contains” для поиска элементов по частичным атрибутам, которые остаются постоянными. Например, если ID элемента содержит динамическое число, можно использовать следующий XPath:
WebElement dynamicElement = driver.findElement(By.xpath("//input[contains(@id, 'частичныйID, который статичен')]"));
2. Использование родительских элементов
Иногда можно найти стабильный родительский элемент и затем обратиться к динамическому элементу внутри него.
WebElement parentElement = driver.findElement(By.id("статичныйIDРодителя")); WebElement dynamicElement = parentElement.findElement(By.tagName("button"));
Для элементов, которые появляются с задержкой на веб-странице, можно использовать различные ожидания, такие как — неявное ожидание, явное ожидание (предпочтительнее, так как оно основывается на различных ожидаемых условиях), а также свободное ожидание(Fluent Wait).
104. Объясните концепцию параллельного выполнения тестов в Selenium.
Параллельное выполнение тестов подразумевает одновременный запуск нескольких тестов для сокращения времени их выполнения. Для параллельного выполнения можно использовать такие инструменты и фреймворки, как TestNG, JUnit и Selenium Grid.
105. Как вы справляетесь с ошибками SSL-сертификатов в Selenium?
В Selenium WebDriver с использованием ChromeDriver можно обойти ошибки SSL-сертификатов, настроив ChromeOptions
и установив флаг --ignore-certificate-errors
. Это позволяет браузеру игнорировать предупреждения о недействительных или самоподписанных сертификатах и продолжать выполнение тестов без прерываний.
106. Объясните концепцию безголовых браузеров в Selenium.
Безголовые браузеры (например, Headless Chrome) обеспечивают более быстрое выполнение тестов, снижают потребление ресурсов и позволяют запускать тесты на серверах без графического интерфейса. Они подходят для автоматизированного тестирования, веб-скрейпинга и сред непрерывной интеграции, где рендеринг графического интерфейса не требуется.
107. Расскажите о лучших практиках написания поддерживаемых и надежных автоматизированных скриптов в Selenium?
Для написания надежных и поддерживаемых тестов следует соблюдать несколько лучших практик. Вот основные из них:
- Использование паттерна Page Object Model (POM)
- Правильное использование ожиданий (Waits)
- Разделение тестовых данных и логики теста
- Использование значимых имен для тестов
- Регулярный рефакторинг тестового кода
108. Как вы справляетесь с проблемами синхронизации в Selenium при работе с асинхронными веб-приложениями?
Асинхронные веб-приложения могут быть сложными для автоматизации, потому что элементы на странице могут загружаться с задержкой, и Selenium может попытаться взаимодействовать с ними до того, как они станут доступными. Чтобы решить эту проблему, можно использовать явные ожидания, ExpectedConditions и даже создавать пользовательские условия ожидания.
109. Как вы справляетесь с кросс-браузерным тестированием? Какие проблемы могут возникнуть?
Кросс-браузерное тестирование — это процесс проверки, как веб-приложение работает в различных браузерах, таких как Chrome, Firefox, Safari, Edge и другие. Это нужно для того, чтобы убедиться, что приложение будет корректно отображаться и функционировать на разных браузерах.
Для эффективного выполнения кросс-браузерного тестирования можно использовать Selenium Grid и WebDriver, которые позволяют запускать тесты на разных браузерах и платформах.
Проблемы, которые могут возникнуть при кросс-браузерном тестировании:
- Разнообразие браузеров:
- Каждый браузер использует свой движок рендеринга (например, Chrome использует Blink, Firefox — Gecko, Safari — WebKit). Это может привести к различиям в том, как браузеры отображают страницы. Иногда для правильного отображения контента нужно писать код, который будет работать по-разному в разных браузерах.
- Версии браузеров:
- Браузеры часто обновляются, и новые версии могут иметь улучшения или изменения, которые влияют на работу веб-приложений. Важно проверять, что тесты работают не только с новыми версиями браузеров, но и с более старыми версиями, чтобы поддерживать совместимость.
- Различия в операционных системах:
- Браузеры могут вести себя по-разному в зависимости от операционной системы, например, на Windows, macOS или Linux. Кросс-браузерное тестирование должно учитывать эти различия, чтобы гарантировать, что приложение будет работать корректно на всех платформах.
110. Какова роль библиотеки WebDriverManager в автоматизации и почему она полезна?
WebDriverManager — это библиотека, которая автоматизирует процесс загрузки и настройки WebDriver для различных браузеров и их версий. Она значительно упрощает настройку WebDriver, обеспечивая автоматический выбор и загрузку правильной версии драйвера для конкретного браузера. Это помогает избежать проблем с совместимостью и значительно сокращает время и усилия, необходимые для поддержания тестовой инфраструктуры.
Заключение
На этом завершен наш подробный список из 110 популярных вопросов для собеседования по Selenium. Мы надеемся, что эти вопросы помогут вам подготовиться к собеседованию и углубить ваши знания в области автоматизации тестирования.
Перевод статьи «Selenium Interview Questions And Answers».