Bird
Raised Fist0
Selenium Javatesting~15 mins

JSON test data in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Login form test using JSON test data
Preconditions (2)
Step 1: Open the login page URL
Step 2: Read the username and password from the JSON file
Step 3: Enter the username into the username input field with id 'username'
Step 4: Enter the password into the password input field with id 'password'
Step 5: Click the login button with id 'loginBtn'
Step 6: Wait for the page to load and verify the URL contains '/dashboard'
✅ Expected Result: User is successfully logged in and redirected to the dashboard page
Automation Requirements - Selenium WebDriver with Java
Assertions Needed:
Verify the current URL contains '/dashboard' after login
Best Practices:
Use explicit waits to wait for page load or element visibility
Use Page Object Model to separate page elements and actions
Read test data from external JSON file using a JSON parsing library
Use meaningful element locators like By.id or By.name
Automated Solution
Selenium Java
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 com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class LoginTest {
    public static void main(String[] args) throws Exception {
        // Setup WebDriver
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        try {
            // Open login page
            driver.get("http://example.com/login");

            // Read JSON test data
            ObjectMapper mapper = new ObjectMapper();
            JsonNode testData = mapper.readTree(new File("src/test/resources/loginData.json"));
            String username = testData.get("username").asText();
            String password = testData.get("password").asText();

            // Enter username
            WebElement usernameInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
            usernameInput.sendKeys(username);

            // Enter password
            WebElement passwordInput = driver.findElement(By.id("password"));
            passwordInput.sendKeys(password);

            // Click login button
            WebElement loginButton = driver.findElement(By.id("loginBtn"));
            loginButton.click();

            // Wait for dashboard URL
            wait.until(ExpectedConditions.urlContains("/dashboard"));

            // Assert URL contains /dashboard
            String currentUrl = driver.getCurrentUrl();
            assertTrue(currentUrl.contains("/dashboard"), "User should be redirected to dashboard after login");

            System.out.println("Test passed: User logged in successfully.");
        } finally {
            driver.quit();
        }
    }
}

This test script uses Selenium WebDriver with Java to automate the login test using JSON test data.

First, it sets up the ChromeDriver and opens the login page URL.

Then it reads the username and password from an external JSON file using Jackson's ObjectMapper.

It waits explicitly for the username input to be visible before entering the username and password.

After clicking the login button, it waits until the URL contains '/dashboard' to confirm successful login.

Finally, it asserts that the current URL contains '/dashboard' and prints a success message.

The driver quits in the finally block to ensure cleanup.

Common Mistakes - 4 Pitfalls
Using Thread.sleep() instead of explicit waits
Hardcoding test data inside the test code
Using brittle XPath locators instead of stable IDs
Not closing the WebDriver after test execution
Bonus Challenge

Now add data-driven testing with 3 different username and password combinations from JSON array

Show Hint

Practice

(1/5)
1. What is the main advantage of using JSON test data in Selenium Java tests?
easy
A. It separates test data from test code for easier maintenance.
B. It makes the test run faster by compiling JSON.
C. It automatically fixes bugs in the test code.
D. It converts Java code into JSON format.

Solution

  1. Step 1: Understand JSON role in testing

    JSON stores test data separately from the test code, so data changes don't require code changes.
  2. Step 2: Identify benefits of separation

    This separation makes tests easier to maintain and reuse with different data sets.
  3. Final Answer:

    It separates test data from test code for easier maintenance. -> Option A
  4. Quick Check:

    JSON separates data and code = B [OK]
Hint: Remember: JSON holds data, not code [OK]
Common Mistakes:
  • Thinking JSON speeds up test execution
  • Believing JSON fixes code bugs automatically
  • Confusing JSON with code format
2. Which of the following is the correct way to read a JSON file in Selenium Java using the org.json library?
easy
A. JSONObject obj = new JSONObject(new FileReader("data.json"));
B. JSONObject obj = new JSONObject("data.json");
C. JSONObject obj = new JSONObject(new FileInputStream("data.json"));
D. JSONObject obj = new JSONObject(new BufferedReader("data.json"));

Solution

  1. Step 1: Check correct constructor usage

    The org.json library's JSONObject constructor accepts a Reader object to parse JSON text.
  2. Step 2: Match with options

    JSONObject obj = new JSONObject(new FileReader("data.json")); uses new FileReader("data.json") which is a Reader, so it is correct.
  3. Final Answer:

    JSONObject obj = new JSONObject(new FileReader("data.json")); -> Option A
  4. Quick Check:

    JSONObject needs Reader input = A [OK]
Hint: Use FileReader with JSONObject constructor [OK]
Common Mistakes:
  • Passing filename string directly to JSONObject
  • Using InputStream instead of Reader
  • Passing filename string to BufferedReader constructor
3. Given the JSON file data.json with content:
{"username": "user1", "password": "pass123"}

What will the following Java code print?
JSONObject obj = new JSONObject(new FileReader("data.json"));
System.out.println(obj.getString("username"));
medium
A. null
B. pass123
C. user1
D. Throws JSONException

Solution

  1. Step 1: Parse JSON content

    The JSON has key "username" with value "user1".
  2. Step 2: Call getString("username")

    This returns the string value for key "username", which is "user1".
  3. Final Answer:

    user1 -> Option C
  4. Quick Check:

    obj.getString("username") = "user1" [OK]
Hint: Match key names exactly to get values [OK]
Common Mistakes:
  • Confusing username and password keys
  • Expecting null if key exists
  • Not handling JSONException properly
4. What is wrong with this Selenium Java code snippet that reads JSON test data?
JSONObject obj = new JSONObject(new FileReader("testdata.json"));
String email = obj.getString("email");
System.out.println(email);

Assuming the JSON file testdata.json does NOT contain the key email.
medium
A. It compiles but does not run.
B. It prints an empty string.
C. It returns null without error.
D. It throws a JSONException at runtime.

Solution

  1. Step 1: Understand getString behavior

    Calling getString on a missing key throws JSONException in org.json library.
  2. Step 2: Check code effect

    Since "email" key is missing, the code throws JSONException at runtime.
  3. Final Answer:

    It throws a JSONException at runtime. -> Option D
  4. Quick Check:

    Missing key getString throws exception = D [OK]
Hint: Missing JSON keys cause exceptions, not null [OK]
Common Mistakes:
  • Expecting null or empty string instead of exception
  • Ignoring exception handling
  • Assuming code won't compile
5. You want to run a Selenium test multiple times with different user credentials stored in a JSON array like:
{"users": [{"username": "user1", "password": "pass1"}, {"username": "user2", "password": "pass2"}]}

Which approach correctly reads and uses this JSON data in Java to loop through each user?
hard
A. JSONObject users = obj.getJSONObject("users"); for (int i = 0; i < users.length(); i++) { String username = users.getString("username"); String password = users.getString("password"); }
B. JSONArray users = obj.getJSONArray("users"); for (int i = 0; i < users.length(); i++) { JSONObject user = users.getJSONObject(i); String username = user.getString("username"); String password = user.getString("password"); // use username and password }
C. String users = obj.getString("users"); for (String user : users) { // use user }
D. JSONArray users = obj.getJSONArray("users"); for (int i = 0; i <= users.length(); i++) { JSONObject user = users.getJSONObject(i); // use user }

Solution

  1. Step 1: Identify JSON array access

    The key "users" holds a JSON array, so getJSONArray("users") is correct.
  2. Step 2: Loop correctly over array

    Loop from 0 to users.length() - 1, get each JSONObject, then extract username and password.
  3. Step 3: Check options

    JSONArray users = obj.getJSONArray("users"); for (int i = 0; i < users.length(); i++) { JSONObject user = users.getJSONObject(i); String username = user.getString("username"); String password = user.getString("password"); // use username and password } correctly uses JSONArray, loops with i < length, and extracts data properly.
  4. Final Answer:

    JSONArray users = obj.getJSONArray("users"); for (int i = 0; i < users.length(); i++) { JSONObject user = users.getJSONObject(i); String username = user.getString("username"); String password = user.getString("password"); // use username and password } -> Option B
  5. Quick Check:

    JSONArray + for loop with i < length = A [OK]
Hint: Use JSONArray and loop i < length, not <= [OK]
Common Mistakes:
  • Using getJSONObject instead of getJSONArray for array
  • Looping with i <= length causing IndexOutOfBounds
  • Treating JSON array as string
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard