Dynamic elements change their attributes on each page load. Here are strategies to handle them:
1. Use contains() in XPath for partial attribute match:
Java
driver.findElement(By.xpath("//*[contains(@id, ''username'')]"));
2. Use starts-with() for predictable prefixes:
Java
driver.findElement(By.xpath("//input[starts-with(@name, ''search'')]"));
3. Use stable attributes (data-, aria-, name):
Java
driver.findElement(By.cssSelector("[data-testid=''login-btn'']"));
driver.findElement(By.cssSelector("[aria-label=''Search'']"));
4. Use text-based XPath:
Java
driver.findElement(By.xpath("//button[text()=''Submit Order'']"));
driver.findElement(By.xpath("//label[contains(text(),''First Name'')]/following-sibling::input"));
5. Use Explicit Wait for elements that load dynamically:
Java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("//div[@class=''result-item'']")
));
6. Relative Locators (Selenium 4):
Java
WebElement emailField = driver.findElement(
RelativeLocator.with(By.tagName("input")).below(By.id("userLabel"))
);
