Why synchronization eliminates timing failures in Selenium Java - Automation Benefits in Action
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.Duration; public class LoginTest { private WebDriver driver; private WebDriverWait wait; @BeforeEach public void setUp() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } @Test public void testLoginWithSynchronization() { driver.get("https://example.com/login"); // Wait for email input to be visible WebElement emailInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("email"))); emailInput.sendKeys("user@example.com"); // Wait for password input to be visible WebElement passwordInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("password"))); passwordInput.sendKeys("Password123"); // Wait for login button to be clickable WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("loginBtn"))); loginButton.click(); // Wait for dashboard URL wait.until(ExpectedConditions.urlContains("/dashboard")); // Verify welcome message WebElement welcomeMessage = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("welcomeMsg"))); assertEquals("Welcome, User!", welcomeMessage.getText()); } @AfterEach public void tearDown() { if (driver != null) { driver.quit(); } } }
This test script uses Selenium WebDriver with Java to automate the login process.
We use explicit waits (WebDriverWait) before interacting with elements. This ensures the elements are ready (visible or clickable) before we act on them, which prevents timing failures.
First, we wait for the email input field to be visible, then enter the email. Next, we wait for the password input field to be visible, then enter the password. Then, we wait for the login button to be clickable before clicking it.
After clicking login, we wait until the URL contains '/dashboard' to confirm navigation. Finally, we wait for the welcome message to be visible and verify its text.
Using explicit waits synchronizes the test steps with the web page's state, eliminating timing failures caused by elements not being ready.
The setup and teardown methods initialize and close the browser cleanly.
Now add data-driven testing with 3 different sets of login credentials to verify login success or failure.