Ответ
Для организации кросс-браузерного тестирования в автоматизации я комбинирую несколько паттернов, которые делают код поддерживаемым и гибким.
Основные паттерны:
-
Page Object Model (POM): Это основа. Каждая страница или значимый компонент представлен отдельным классом, который инкапсулирует локаторы элементов и методы для взаимодействия с ними. Это изолирует изменения в верстке от самих тестов.
// Пример Page Object на Java public class LoginPage { private WebDriver driver; private By usernameField = By.id("username"); private By passwordField = By.id("password"); private By submitButton = By.id("submit"); public LoginPage(WebDriver driver) { this.driver = driver; } public void login(String user, String pass) { driver.findElement(usernameField).sendKeys(user); driver.findElement(passwordField).sendKeys(pass); driver.findElement(submitButton).click(); } } -
Factory Pattern: Использую для создания экземпляра WebDriver в зависимости от требуемого браузера. Это централизует логику инициализации.
public class WebDriverFactory { public static WebDriver createDriver(String browserName) { switch (browserName.toLowerCase()) { case "chrome": return new ChromeDriver(); case "firefox": return new FirefoxDriver(); case "edge": return new EdgeDriver(); default: throw new IllegalArgumentException("Browser not supported: " + browserName); } } } // В тесте WebDriver driver = WebDriverFactory.createDriver(System.getProperty("browser", "chrome")); -
ThreadLocal для параллельного запуска: При запуске тестов в несколько потоков (например, через Selenium Grid или параллельно в CI) использую
ThreadLocal<WebDriver>, чтобы у каждого потока был свой изолированный экземпляр драйвера, избегая состояния гонки. -
Strategy Pattern: Может быть полезен для определения различного поведения в разных браузерах (например, особый способ клика для IE) или для переключения между локальным запуском и запуском на удаленном гриде (RemoteWebDriver).