Learn Selenium, Playwright, Java, Python, SQL, API testing, DevOps and cloud tools with hands-on QA engineering lessons, quizzes and interview practice.
⚡ Interview Warm-Up Round
12 real interview questions mixed from different topics — think for a second before revealing the answer.
What this section is for — and what it is not This is just a quick pulse check — the real interview practice with AI-graded feedback lives in each lesson's interview tab.
Your web form test sometimes throws NoSuchElementException but the page looks fine manually. What could be the cause?
The most common cause is a timing issue. Even if the page appears ready, DOM elements may be added later by JavaScript. Solution: use WebDriverWait + ExpectedConditions instead of Thread.sleep(). Also check for iframes — call switchTo().frame() first. Another cause: CI/CD runs slower than local, increase the timeout.
Selenium
How do you implement Page Object Model (POM) in Playwright?
Create class per page, pass Page in constructor: class LoginPage { constructor(page) { this.emailInput = page.locator("[data-qa='login-email']"); } async login(e,p) { await this.emailInput.fill(e); } }. In tests: const lp = new LoginPage(page); await lp.login(). Identical to Java POM pattern.
Playwright
How does Cypress's architecture (running in the same browser process) differ from Selenium/Playwright, and what are the trade-offs?
Cypress runs test code directly in the browser's JavaScript run-loop; Selenium and Playwright manage the browser "remotely" from a separate process. Advantage: no network latency, direct DOM access, time-travel debugging. Disadvantage: JavaScript/TypeScript only, single-tab limit, same-origin restriction. The "full isolation" you're used to in the Java/Selenium world doesn't exist in Cypress.
Cypress
You see BUILD FAILURE in Maven — what is your first step and why?
First, find the "Tests run: X, Failures: Y, Errors: Z" line in the terminal output. Failures > 0 means an assertion error — the test ran but expected vs actual values didn't match. Errors > 0 means a setup problem before the test even started (e.g. driver couldn't be created, file not found). The XML or TXT files in target/surefire-reports contain a separate stack trace for each test — read the root cause from there. In CI, save this folder as an artifact for later analysis.
Java
What are *args and **kwargs in Python?
*args accepts a variable number of positional arguments — arrives as a tuple. **kwargs accepts variable keyword arguments — arrives as a dict. def log(*args, **kwargs) can accept both log("msg1", "msg2") and log(level="INFO", test="login").
Python
Q36: What is the difference between COALESCE and NULLIF?
`COALESCE(val1, val2, ...)` returns the first non-NULL value in the list (used for default fallbacks). `NULLIF(val1, val2)` returns NULL if the two arguments are equal, otherwise it returns the first value (used to prevent division-by-zero errors).
SQL
What is the difference between var, let, and const? When should you use which?
`var` is function-scoped and hoisted with `undefined`. `let` and `const` are block-scoped and stay in the Temporal Dead Zone (TDZ) before initialization. `const` cannot be reassigned after declaration, while `let` allows reassignment. In modern JS, `var` is avoided to prevent scoping bugs; prefer `const` by default, and use `let` only when you expect variable updates.
JavaScript
When should you use a tuple in TypeScript?
When you have a fixed number of elements and each position has a different type. Example: [string, number, boolean] — like name, age, active. Often used for function return values: function useState<T>(init: T): [T, (v: T) => void]. If an object would be more readable, prefer that over a tuple.
TypeScript
How would you design a parallel test execution setup using Docker for 500 Selenium tests?
Use Selenium Grid in Docker Compose: selenium-hub + multiple selenium/node-chrome containers. Each Chrome node handles 4-6 parallel sessions. For 500 tests: 3 Chrome nodes × 5 sessions = 15 parallel tests = ~10 min vs 2 hours sequential. Scale Chrome nodes based on CI server capacity: docker compose scale chrome=5. Use pytest-xdist with --dist=loadscope to distribute tests. Each node gets a clean browser session. Mount reports directory to persist results. Add healthchecks to ensure nodes are ready before tests start.
Docker
What is Jenkins and why is it used in software development?
Jenkins is an open-source CI/CD automation server written in Java. Every time a developer pushes code, Jenkins automatically builds, tests, and optionally deploys it. It catches bugs within minutes of committing, reduces manual work, and ensures consistent quality on every change. In QA, Jenkins is where our test suites live and run — every commit triggers our Selenium, pytest, or Playwright tests automatically.
Jenkins
Before opening a PR, how do you update your branch with main?
I run `git fetch origin` first, then use either `git merge origin/main` or `git rebase origin/main` depending on team convention. I am careful with rebase on shared branches because commit hashes change. Like running tests after a Java dependency update, I rerun the test suite after updating the branch.
Git & GitHub
How do you implement data-driven API testing in Postman?
Use external CSV/JSON where each row is an iteration. pm.iterationData.get("field") in scripts. Newman: --iteration-data data.csv. Test 100 scenarios without 100 separate requests.
Postman