Ответ
Да, я использовал Selenium WebDriver для автоматизации UI-тестов веб-приложений. Мой основной стек — Java, Selenium, TestNG/JUnit, Maven/Gradle с обязательным применением Page Object Model (POM) для поддержания читаемости и реюзабельности кода.
Ключевые практики, которые я применяю:
- Page Object Model: Каждая страница или значимый компонент представлен отдельным классом, что изолирует локаторы и действия.
- Explicit Waits: Использую
WebDriverWaitдля ожидания элементов, что делает тесты стабильнее. - Параллельный запуск: Настраивал Selenium Grid или использовал возможности TestNG для параллельного выполнения тестов в разных браузерах.
- Интеграция с системами отчетности: Настраивал генерацию подробных отчетов через Allure или ExtentReports.
Пример теста на Java (TestNG + Page Object):
// Page Object Class
public class LoginPage {
private WebDriver driver;
private By usernameField = By.id("username");
private By passwordField = By.id("password");
private By submitButton = By.cssSelector("button[type='submit']");
private By errorMessage = By.className("alert-error");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String username, String password) {
driver.findElement(usernameField).sendKeys(username);
driver.findElement(passwordField).sendKeys(password);
driver.findElement(submitButton).click();
}
public boolean isErrorMessageDisplayed() {
return driver.findElement(errorMessage).isDisplayed();
}
}
// Test Class
public class LoginTests {
WebDriver driver;
LoginPage loginPage;
@BeforeMethod
public void setUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.get("https://example.com/login");
loginPage = new LoginPage(driver);
}
@Test
public void testLoginWithInvalidCredentialsShowsError() {
loginPage.login("wrongUser", "wrongPass");
// Используем Explicit Wait для ожидания ошибки
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOfElementLocated(
loginPage.getErrorMessageLocator()
));
Assert.assertTrue(loginPage.isErrorMessageDisplayed(),
"Error message should be visible after invalid login");
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
Для быстрого написания стабильных тестов на Java я также использовал Selenide — обертку над Selenium с более лаконичным синтаксисом.
Ответ 18+ 🔞
Хули ты думал, я, как какой-нибудь лох, руками всё кликаю? Конечно, Selenium WebDriver юзал, чтобы эти веб-интерфейсы автоматизировать. Мой основной набор — это Java, Selenium, TestNG/JUnit, Maven/Gradle, и без Page Object Model (POM) я вообще не представляю, как можно писать тесты, которые через месяц не превратятся в пиздапроебибну.
Что я делаю, чтобы не сойти с ума и не убить коллег:
- Page Object Model: Каждая страница — это отдельный класс, блядь. Все локаторы и методы там, в одном месте. Не надо потом пол-проекта перелопачивать, если кнопку переименовали.
- Explicit Waits: Только
WebDriverWait, ёпта. НикакихThread.sleep()— это признак того, что у человека в голове хуй с винтом. Ждём конкретные условия, тесты стабильнее, нервы целее. - Параллельный запуск: Настраивал Selenium Grid, чтобы всё летало быстрее. Либо фичи TestNG использовал, чтобы тесты по потокам гонять в разных браузерах. Время — деньги, ебать.
- Отчёты, которые можно показать: Подключал Allure или ExtentReports. Чтобы не просто «упал/не упал», а красивая хуйня, где видно, на каком шаге всё пошло по пизде. Для менеджеров — самое то.
Вот, смотри, как это примерно выглядит в коде (TestNG + Page Object): (Блок кода не трогаю, оставляю как есть)
// Page Object Class
public class LoginPage {
private WebDriver driver;
private By usernameField = By.id("username");
private By passwordField = By.id("password");
private By submitButton = By.cssSelector("button[type='submit']");
private By errorMessage = By.className("alert-error");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String username, String password) {
driver.findElement(usernameField).sendKeys(username);
driver.findElement(passwordField).sendKeys(password);
driver.findElement(submitButton).click();
}
public boolean isErrorMessageDisplayed() {
return driver.findElement(errorMessage).isDisplayed();
}
}
// Test Class
public class LoginTests {
WebDriver driver;
LoginPage loginPage;
@BeforeMethod
public void setUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.get("https://example.com/login");
loginPage = new LoginPage(driver);
}
@Test
public void testLoginWithInvalidCredentialsShowsError() {
loginPage.login("wrongUser", "wrongPass");
// Используем Explicit Wait для ожидания ошибки
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOfElementLocated(
loginPage.getErrorMessageLocator()
));
Assert.assertTrue(loginPage.isErrorMessageDisplayed(),
"Error message should be visible after invalid login");
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
А ещё, честно говоря, когда уже овердохуища этих findElement и WebDriverWait писать, брал Selenide. Это такая обёртка над Selenium, там синтаксис в разы короче и приятнее. Для быстрого написания стабильных проверок на Java — просто ядрёна вошь, рекомендую.