XPath with attributes in Selenium Java - Build an Automation Script
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.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.time.Duration; public class LoginButtonXPathTest { private WebDriver driver; private WebDriverWait wait; @BeforeClass public void setUp() { // Set path to chromedriver if needed driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.manage().window().maximize(); driver.get("https://example.com/login"); } @Test public void testLoginButtonClickableUsingXPathAttribute() { // Locate login button using XPath with attribute id='loginBtn' By loginButtonLocator = By.xpath("//button[@id='loginBtn']"); // Wait until the login button is clickable WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(loginButtonLocator)); // Assert the button is displayed Assert.assertTrue(loginButton.isDisplayed(), "Login button should be visible"); // Click the login button loginButton.click(); // Wait for URL to change to dashboard wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard")); // Assert the URL is correct String currentUrl = driver.getCurrentUrl(); Assert.assertEquals(currentUrl, "https://example.com/dashboard", "URL should be dashboard after login"); } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } }
This test uses Selenium WebDriver with Java and TestNG framework.
In setUp(), we open the Chrome browser and navigate to the login page.
In the test method, we locate the login button using XPath with an attribute id='loginBtn'. This is done with By.xpath("//button[@id='loginBtn']").
We use an explicit wait to wait until the button is clickable to avoid timing issues.
We assert the button is visible, then click it.
After clicking, we wait until the URL changes to the dashboard URL and assert it matches the expected URL.
Finally, in tearDown(), we close the browser to clean up.
This structure ensures the test is stable, readable, and follows best practices.
Now add data-driven testing with 3 different login button IDs to verify the button is clickable for each.
Practice
//input[@type='submit'] select in a web page?Solution
Step 1: Understand XPath tag and attribute syntax
The expression uses//inputto select all <input> tags anywhere in the document.Step 2: Analyze the attribute filter
The filter[@type='submit']selects only those <input> elements whose 'type' attribute exactly equals 'submit'.Final Answer:
All <input> elements with attribute type equal to 'submit' -> Option AQuick Check:
XPath //tag[@attr='value'] selects elements with that attribute value [OK]
- Confusing tag name with attribute name
- Using wrong attribute syntax like @type=submit without quotes
- Thinking it selects elements named 'submit'
Solution
Step 1: Recall correct attribute syntax in XPath
Attributes are selected using@attributeName='value'inside square brackets.Step 2: Check each option
//button[@id='loginBtn'] uses@id='loginBtn'correctly. Options A, B, and D use invalid syntax for attributes.Final Answer:
//button[@id='loginBtn'] -> Option DQuick Check:
Attributes need '@' before name in XPath [OK]
- Omitting '@' before attribute name
- Using parentheses or '#' incorrectly
- Confusing XPath with CSS selector syntax
<input type='checkbox' name='subscribe' checked>
What will the XPath
//input[@checked] select?Solution
Step 1: Understand attribute presence in XPath
The XPath//input[@checked]selects all <input> elements that have the 'checked' attribute, regardless of its value.Step 2: Analyze the HTML snippet
The <input> element has the 'checked' attribute present (without a value), so it matches the XPath.Final Answer:
All <input> elements with attribute 'checked' present -> Option AQuick Check:
XPath [@attr] checks attribute presence, not value [OK]
- Assuming attribute must have a value
- Confusing attribute presence with value equality
- Thinking empty attributes are ignored
//div[@class='container'] but it does not find the element. The element's class attribute is "container main". What is the issue?Solution
Step 1: Understand attribute matching in XPath
Using@class='container'matches only if the class attribute is exactly 'container'.Step 2: Analyze the actual class attribute
The element's class is 'container main', which is not an exact match, so XPath does not select it.Final Answer:
XPath looks for exact match; 'container main' ≠ 'container' -> Option BQuick Check:
Attribute equality in XPath is exact, no partial match [OK]
- Assuming XPath matches partial attribute values
- Using wrong attribute name like 'className'
- Thinking quotes style causes failure
<input> elements that have a type attribute equal to 'text' or 'password' using XPath. Which expression is correct?Solution
Step 1: Understand logical operators in XPath
To select elements matching either condition, useorbetween attribute tests.Step 2: Analyze each option
//input[@type='text' or @type='password'] correctly usesorto select inputs with type 'text' or 'password'. //input[@type='text' and @type='password'] usesandwhich is impossible for one attribute to have two values simultaneously. Options C and D use invalid syntax.Final Answer:
//input[@type='text' or @type='password'] -> Option CQuick Check:
Use 'or' to combine attribute conditions in XPath [OK]
- Using 'and' instead of 'or' for multiple attribute values
- Trying to list values inside one attribute test
- Incorrect syntax with parentheses or commas
Ready to prove it?
Pass the test and this pattern moves unknown
