DEV Community

Cover image for Selenium Automation Testing Course in Mumbai: Everything You Need to Know (From Someone Who's Actually Written the Tests)
JustAcademy Official
JustAcademy Official

Posted on

Selenium Automation Testing Course in Mumbai: Everything You Need to Know (From Someone Who's Actually Written the Tests)

I want to start with a confession: for the first year I worked as a manual tester, I genuinely thought "automation" just meant writing the same test steps I already knew, but in a script instead of an Excel sheet. It took me embarrassingly long to realize that automation isn't a faster way to do manual testing it's a completely different discipline that happens to share a goal with manual QA. You're not just verifying behavior anymore. You're building software that builds confidence in other software. And once that clicked, Selenium stopped being "that tool recruiters keep mentioning" and started being genuinely interesting.

This post is my attempt to write the guide I wish someone had handed me when I was staring at my first WebDriver object wondering why findElement kept throwing a NoSuchElementException on a page I could clearly see the button on. If you're in Mumbai and weighing whether to get serious about Selenium, or you've already started and want to sanity-check your learning path, this is for you.

If you'd rather skip ahead to a structured breakdown of the whole landscape before diving into my rambling, that's worth a read either before or after this one.

Why Selenium, Specifically, in 2026

Let's address the elephant in the room first, because every thread about Selenium eventually turns into a debate about whether it's "dying." It isn't. What's actually happening is more interesting: Selenium has settled into being the dependable, slightly unglamorous backbone of enterprise test automation, while newer tools like Playwright and Cypress get the spotlight in blog posts and conference talks.

Here's the thing nobody mentions in those debates most companies aren't starting from scratch. They have five, sometimes ten years of existing Selenium test suites, hundreds of test cases, integrations with Jenkins pipelines that took months to stabilize, and QA teams who know the codebase intimately. Rewriting all of that in a newer framework isn't a two-week decision; it's a multi-quarter migration with real risk attached. So Selenium keeps running, keeps getting maintained, and keeps showing up in job postings — not because it's the most exciting option on paper, but because it's the one already wired into how most software actually ships.

That's not a knock against Playwright, by the way. I've used both, and Playwright's auto-waiting and built-in test runner genuinely make some things easier. But here's a pattern I've noticed across a lot of QA engineers I've worked with: the ones who understand Selenium deeply pick up Playwright in a matter of days, because the underlying concepts locators, waits, assertions, framework design transfer almost entirely. The ones who only ever learned Playwright often struggle when dropped into a legacy Selenium codebase, because they never built the mental model of why waits matter, they just trusted the tool to handle it for them.

So learning Selenium first isn't a wasted detour. It's closer to learning to drive a manual transmission before an automatic — it teaches you what's actually happening under the hood.

Getting Past "Hello World" Automation

Almost every tutorial starts the same way:

java
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
driver.findElement(By.id("login-button")).click();

And that's fine as a first step. But this is roughly where most beginner courses stop teaching and start assuming, which is exactly where people get stuck. The gap between "I can click a button" and "I can write a test suite someone else can maintain" is enormous, and it's mostly about three things: locators, waits, and structure.

Locators: Stop Trusting Auto-Generated XPaths

Right-click, inspect, copy XPath — I get why this feels efficient. It's also one of the fastest ways to build a test suite that collapses the moment a frontend developer reorders a div. Auto-generated XPaths tend to look like this:

/html/body/div[3]/div/div[2]/form/div[4]/button

That's not a locator, that's a landmine. It has zero resilience to layout changes. A cleaner approach is to work with your dev team (or the app's DOM directly) to identify stable attributes — data-testid, name, aria-label — and build locators around those:

java
driver.findElement(By.cssSelector("[data-testid='login-submit']")).click();

If the application doesn't have test-friendly attributes, that's worth raising as feedback rather than working around silently. A five-minute conversation with a developer to add data-testid attributes can save your team dozens of hours of flaky-test debugging down the line. This is also, honestly, where a lot of QA engineers start to earn real respect from their dev teams — showing up with a specific, low-effort ask instead of a vague complaint about "tests keep breaking."

Waits: The Silent Killer of Test Reliability

Thread.sleep(5000) is the automation equivalent of duct tape. It works, technically, right up until it doesn't — and when it fails, it fails in the most frustrating way possible: intermittently, and usually right before a release.

The fix isn't complicated, it's just underexplained in most beginner material. Explicit waits let you wait for a condition, not an arbitrary duration:

java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement submitButton = wait.until(
ExpectedConditions.elementToBeClickable(By.id("login-button"))
);
submitButton.click();

This waits exactly as long as needed — no more, no less — and fails fast with a clear timeout exception if something's actually wrong, instead of silently clicking on an element that isn't ready yet. Once you internalize explicit waits, Thread.sleep() starts to feel like something you'd only reach for in genuinely unusual edge cases, not as a default habit.

Structure: Why the Page Object Model Isn't Optional

Here's a scenario every automation engineer eventually lives through: a login page's HTML changes, and suddenly forty different test files break because the locator was copy-pasted into all of them. The Page Object Model exists specifically to prevent this.

java
public class LoginPage {
private WebDriver driver;

private By usernameField = By.id("username");
private By passwordField = By.id("password");
private By loginButton = By.id("login-button");

public LoginPage(WebDriver driver) {
    this.driver = driver;
}

public void login(String username, String password) {
    driver.findElement(usernameField).sendKeys(username);
    driver.findElement(passwordField).sendKeys(password);
    driver.findElement(loginButton).click();
}
Enter fullscreen mode Exit fullscreen mode

}

Now every test that needs to log in just calls loginPage.login(user, pass). If the login page's HTML changes, you fix it in exactly one place. This feels like overkill on a five-test project and feels like the only thing standing between you and chaos on a five-hundred-test project. Learning to think in this pattern early — even before your test suite is big enough to "need" it — pays off enormously later.

Where This Skill Actually Takes You

It's easy to think of a Selenium course as a box to check for a job application, but I'd push back on framing it that narrowly. In practice, it tends to be a fork in the road rather than a single destination, and which direction you take often depends less on the tool itself and more on what kind of problems you enjoy solving.

Some people lean into pure test architecture — designing frameworks, building internal tooling for their QA team, becoming the person others come to when a suite needs restructuring. Others drift toward SDET roles, where the line between "tester" and "developer" gets blurry in a good way, and you end up contributing to application code, not just test code. Still others branch into performance testing or API automation, layering tools like RestAssured or JMeter on top of what they already know from Selenium.

I've genuinely seen all three paths play out from people who started in the exact same beginner Selenium course, which tells me the tool matters less than the mindset you build while learning it. If you're trying to figure out which direction might suit you, this deeper look at the career path covers it better than I have room for here, including what interviewers at different experience levels tend to actually ask.

Wiring It Into CI/CD (Because Someone Will Ask in the Interview)

If you learn Selenium in isolation, running tests only from your local IDE, you're going to hit a wall the moment you interview for an actual job, because almost every real QA role expects at least conceptual familiarity with continuous integration. You don't need to become a DevOps engineer, but you do need to understand what's happening when tests run automatically on every push.

A minimal GitHub Actions setup for a Selenium suite might look like this:

yaml
name: Selenium Test Suite

on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Run tests
run: mvn test

That's it, conceptually. Push code, tests run automatically, results show up before anyone has a chance to merge something broken. In an interview, being able to talk through even a basic pipeline like this what triggers it, what happens on failure, how results get reported puts you ahead of candidates who only know how to right-click "Run Test" in an IDE.

The Mistakes I See on Repeat

A few patterns show up so consistently across people learning Selenium that I think they're worth naming explicitly, not as criticism, but because recognizing them early saves months of frustration.

Treating flaky tests as normal. If a test passes sometimes and fails other times with no code change in between, that's not "just how automation is" — it's almost always a waits or locator problem, and it's fixable. Teams that tolerate flaky tests eventually stop trusting their own test suite, which defeats the entire point of having one.

Writing tests that mirror manual test cases too literally. A manual test case written for a human doesn't always translate cleanly into an automated one. Automated tests should be atomic, independent, and fast to run — not a direct one-to-one script of a fifteen-step manual checklist.

Under-investing in test data management. Hardcoding usernames and passwords directly into test scripts works until two tests run in parallel and collide over the same data. Learning to manage test data properly separate test environments, data seeding, cleanup after runs is unglamorous but genuinely separates junior automation engineers from senior ones.

Ignoring reporting. A test suite that passes or fails without producing a readable report is nearly useless to anyone outside the QA team. Tools like Allure or ExtentReports turn raw logs into something a project manager or developer can actually act on without pinging you to explain what happened.

Cross-Browser Testing: The Part That Looks Simple Until It Isn't

Somewhere around your third or fourth project, someone will ask, "does this work in Firefox too?" and you'll realize your entire test suite was quietly written with Chrome-specific assumptions baked in. This happens to almost everyone, and it's worth getting ahead of rather than discovering the hard way in production.

The naive approach is to just swap the driver:

java
WebDriver driver = new FirefoxDriver();

And that works, until you notice that a dropdown that renders instantly in Chrome takes an extra half-second in Firefox, or that a CSS selector that worked fine in one engine behaves subtly differently in another. This is exactly where the waits discipline from earlier stops being a nice-to-have and becomes load-bearing — explicit waits absorb these small timing differences gracefully, while Thread.sleep() calls tuned for one browser quietly become flaky the moment you point them at another.

At scale, most teams stop managing browser instances manually altogether and lean on Selenium Grid, or a cloud grid provider, to run the same suite across multiple browser and OS combinations in parallel:

java
DesiredCapabilities caps = new DesiredCapabilities();
caps.setBrowserName("firefox");
caps.setPlatform(Platform.WIN10);

WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), caps);

You don't need to memorize this syntax — I certainly didn't the first time I used it — but understanding why teams reach for a grid setup (parallelization, coverage across environments, faster feedback loops) is the kind of context that separates someone who's only ever run tests locally from someone who understands how testing actually scales inside a real engineering org.

Debugging a Failing Test Without Losing Your Mind

There's a particular kind of dread that sets in when a test that passed yesterday fails today with no obvious code change. Every automation engineer goes through this rite of passage, and the instinct to just re-run the test and hope is understandable but rarely productive.

A more disciplined debugging approach usually looks something like this. First, check whether the failure is consistent or intermittent — run it three or four times in isolation before assuming anything. Second, capture a screenshot at the point of failure; this single habit saves more debugging time than almost anything else on this list:

java
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("failure-" + System.currentTimeMillis() + ".png"));

Third, check the actual DOM state at failure time rather than assuming your mental model of the page still matches reality — applications change more often than test suites get updated to reflect it. And fourth, resist the urge to immediately add a longer wait as a fix. A longer wait might make a symptom disappear temporarily while leaving the actual root cause — a race condition, an unstable locator, a backend dependency that's slow under certain conditions — completely unaddressed.

I mention this because it's rarely covered explicitly in beginner material, yet it's arguably the skill that most determines whether you're pleasant to work with on a QA team. Anyone can write a passing test on a good day. The engineers who get trusted with critical suites are the ones who can calmly figure out why a test is failing without turning it into a two-day investigation or a hastily bolted-on workaround.

What Interviewers Are Actually Listening For

Having sat in on a few hiring conversations from the other side of the table, I noticed something that surprised me early on: interviewers usually aren't testing whether you've memorized Selenium's API surface. Documentation exists for that. What they're actually probing for is judgment — do you understand why you'd choose one approach over another, not just that both exist.

A question like "how would you handle a dynamically loading dropdown" isn't really about dropdowns. It's checking whether you reach instinctively for Thread.sleep() or whether you can articulate why an explicit wait tied to a specific condition is the more resilient choice. A question about page object design isn't really about syntax — it's checking whether you've thought about maintainability at all, or whether every test you've ever written lived in a single sprawling file.

This is, honestly, good news for anyone worried they haven't memorized every method in the WebDriver API. Nobody has, and nobody needs to. What matters far more is being able to explain your reasoning clearly, including the trade-offs of decisions you've made, and being honest about what you don't know yet rather than bluffing through it. I've seen candidates with modest technical depth get hired over more "impressive" ones simply because they could reason clearly about a problem they hadn't seen before.

Realistic Expectations on Timelines and Outcomes

One thing worth setting straight before you dive in: this isn't a weekend skill, and treating it like one sets you up for frustration. Getting comfortable with core WebDriver commands might take a few weeks of consistent practice. Actually becoming job-ready — able to debug a suite you didn't write, explain your framework decisions, and hold your own in a technical interview — realistically takes a few months, not because the material is impossibly hard, but because judgment takes repetition to build, and repetition takes time no course can compress away.

That timeline shifts depending on how much hands-on project work you do versus passive tutorial-watching. Two people can finish the same course in the same number of weeks and come out at very different skill levels, purely based on whether one of them built an actual project — flaky tests, messy locators, real debugging sessions and all — while the other just followed along with pre-written scripts. If there's one piece of advice I'd underline from everything above, it's this: build something real, even something small and ugly, before you consider yourself done learning.

What I'd Actually Recommend, Concretely

If you're starting from zero, here's roughly the order I'd suggest tackling things, based on what tripped me up versus what came naturally:

Get comfortable with core Java or Python first not extensively, but enough that OOP concepts, loops, and exception handling don't feel foreign when you meet them inside a test framework.
Learn raw Selenium WebDriver commands until locating elements and interacting with them feels automatic.
Deliberately practice writing bad locators and watching them break, then fixing them with stable attributes this builds intuition faster than reading about best practices in the abstract.
Introduce explicit waits before your test suite grows large enough that Thread.sleep() habits become hard to unlearn.
Build a small Page Object Model framework from scratch, even for a toy project, before working with someone else's larger framework.
Set up a basic CI pipeline for that toy project, even if it's just running tests on every commit to a personal GitHub repo.
Only then start applying for roles — not because you need to be an expert, but because you'll be able to speak concretely about your own decisions in an interview instead of reciting theory.

Closing Thoughts

Selenium isn't a trendy skill, and it's not going to feel exciting in the way a shiny new framework does. But there's something genuinely satisfying about getting good at a tool that's survived nearly two decades of the JavaScript ecosystem reinventing itself every eighteen months. It rewards patience and precision over cleverness, which honestly makes it a decent training ground for the kind of careful, structured thinking that automation testing demands regardless of which tool you eventually settle into.

If you're in Mumbai and thinking about learning this properly rather than piecing it together from scattered tutorials, having someone review your framework decisions and point out bad habits before they calcify is worth more than most people expect going in. For anyone who wants that kind of structured, mentor-guided path rather than going it alone, a Mumbai-based training program built around exactly this progression is worth looking into.

Either way self taught or guided the fundamentals don't change. Write locators like someone else has to maintain them. Wait for conditions, not arbitrary time. Structure your tests before you're forced to. And treat a flaky test as a bug in your framework, not a fact of life. Everything else in this discipline builds on those four habits.

Top comments (0)