Below are the some best practices to make selenium test stable.
Implement Proper Wait Strategies:
public class WaitUtils { private WebDriver driver; private WebDriverWait wait;
public WaitUtils(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); }
public WebElement waitForElementClickable(By locator) { return wait.until(ExpectedConditions.elementToBeClickable(locator)); }
public WebElement waitForElementVisible(By locator) { return wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); }
public void waitForPageLoad() { wait.until(webDriver -> ((JavascriptExecutor) webDriver) .executeScript("return document.readyState").equals("complete")); } }
Implement Retry Mechanism:
public class RetryAnalyzer implements IRetryAnalyzer { private int retryCount = 0; private static final int MAX_RETRY = 3;
@Override public boolean retry(ITestResult result) { if (retryCount < MAX_RETRY) { retryCount++; return true; } return false; } }
Handle Dynamic Elements:
public class ElementHandler { private WebDriver driver; private WebDriverWait wait;
public void clickElement(By locator) { try { WebElement element = wait.until(ExpectedConditions.elementToBeClickable(locator)); scrollIntoView(element); element.click(); } catch (ElementClickInterceptedException e) { JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("arguments[0].click();", driver.findElement(locator)); } }
private void scrollIntoView(WebElement element) { ((JavascriptExecutor) driver).executeScript( "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", element ); } }