A flaky test is a test that sometimes passes and sometimes fails without any changes in the code. It behaves unpredictably, often due to timing or environment issues.
Click to reveal answer
beginner
Why do we use a retry mechanism for flaky tests?
We use retry mechanisms to automatically rerun tests that fail due to temporary issues. This helps reduce false failures and makes test results more reliable.
Click to reveal answer
intermediate
How can you implement a retry mechanism in Selenium with Python?
You can implement retry by using a decorator or a loop that reruns the test function a set number of times until it passes or the retries run out.
Click to reveal answer
intermediate
What is a simple example of a retry decorator in Python for flaky tests?
A retry decorator runs a test function multiple times if it raises an exception, stopping early if the test passes. It helps handle flaky failures automatically.
Click to reveal answer
beginner
Name one common cause of flaky tests in Selenium automation.
Common causes include timing issues like waiting for elements to load, network delays, or asynchronous page behavior.
Click to reveal answer
What does a retry mechanism do in test automation?
AReruns failed tests automatically to reduce false failures
BSkips tests that fail
CRuns tests only once
DIgnores all test failures
✗ Incorrect
Retry mechanisms rerun tests that fail temporarily to avoid false negatives.
Which of these is a common cause of flaky tests?
AConsistent test data
BStable network connection
CProper synchronization
DTiming issues like slow page loads
✗ Incorrect
Timing issues such as slow page loads often cause flaky tests.
In Python, what feature can help implement retries elegantly?
ADecorators
BGlobal variables
CList comprehensions
DLambda functions
✗ Incorrect
Decorators can wrap test functions to add retry logic cleanly.
What should a retry mechanism do when a test passes on a retry?
AContinue retrying until max retries
BStop retrying and mark test as passed
CMark test as failed anyway
DSkip the test
✗ Incorrect
Once a test passes on retry, the mechanism should stop and mark it passed.
Which Selenium Python tool can help wait for elements to avoid flaky tests?
ARandom sleeps
BPrint statements
CExplicit waits
DHardcoded delays
✗ Incorrect
Explicit waits wait for conditions and reduce flaky failures.
Explain what a flaky test is and why retry mechanisms help in Selenium testing.
Think about tests that fail sometimes without code changes and how retrying helps.
You got /5 concepts.
Describe how you would implement a simple retry mechanism in Python for Selenium tests.
Consider wrapping the test function to catch failures and retry.
You got /5 concepts.
Practice
(1/5)
1. What is the main purpose of a retry mechanism in Selenium tests?
easy
A. To permanently ignore failed tests without rerunning
B. To speed up test execution by running tests in parallel
C. To rerun tests that fail due to temporary issues like slow loading
D. To generate detailed logs for every test step
Solution
Step 1: Understand flaky tests
Flaky tests fail sometimes due to temporary problems like slow page loads or network delays.
Step 2: Purpose of retry mechanism
Retry mechanism reruns failed tests to check if failure was temporary, reducing false failures.
Final Answer:
To rerun tests that fail due to temporary issues like slow loading -> Option C
Quick Check:
Retry mechanism = rerun flaky tests [OK]
Hint: Retry fixes temporary failures by rerunning tests [OK]
Common Mistakes:
Thinking retry speeds up tests
Assuming retry ignores failures
Confusing retry with logging
2. Which of the following is the correct way to implement a simple retry decorator in Python for Selenium tests?
easy
A. def retry(func):
try:
func()
except Exception:
func()
B. def retry(func):
def wrapper():
for _ in range(3):
try:
return func()
except Exception:
pass
return wrapper
C. def retry(func):
while True:
func()
return func
D. def retry(func):
for _ in range(3):
func()
return func
Solution
Step 1: Check retry decorator structure
def retry(func):
def wrapper():
for _ in range(3):
try:
return func()
except Exception:
pass
return wrapper defines a wrapper function that tries to run the test 3 times catching exceptions.
Step 2: Verify retry logic correctness
def retry(func):
def wrapper():
for _ in range(3):
try:
return func()
except Exception:
pass
return wrapper retries on exception and returns on success, which is correct retry behavior.
Final Answer:
def retry(func):
def wrapper():
for _ in range(3):
try:
return func()
except Exception:
pass
return wrapper -> Option B
Quick Check:
Retry decorator = try 3 times with exception catch [OK]
Hint: Retry decorator wraps function with try-except loop [OK]
Common Mistakes:
Not catching exceptions inside loop
Infinite loops without exit
Calling function multiple times without try-except
3. Given this retry decorator and test function, what will be printed?
def retry(func):
def wrapper():
for i in range(2):
try:
return func()
except Exception:
print(f"Retry {i+1} failed")
print("All retries failed")
return wrapper
@retry
def test():
print("Running test")
raise Exception("Fail")
test()
medium
A. Running test
Retry 1 failed
Running test
Retry 2 failed
All retries failed
B. Running test
All retries failed
C. Running test
Retry 1 failed
Retry 2 failed
D. Running test
Retry 1 failed
Running test
Retry 2 failed
Solution
Step 1: Analyze retry loop
The wrapper tries to run test twice. Each time test() prints "Running test" then raises Exception.
Step 2: Trace output
On first try, prints "Running test", then exception triggers "Retry 1 failed". Second try repeats same steps, then prints "Retry 2 failed". After loop ends, prints "All retries failed".
Final Answer:
Running test
Retry 1 failed
Running test
Retry 2 failed
All retries failed -> Option A
Quick Check:
Retry prints on each failure, then final failure message [OK]
Hint: Each retry prints failure message, then final failure after loop [OK]
Common Mistakes:
Missing repeated 'Running test' print
Ignoring final 'All retries failed' print
Assuming retry stops after first failure
4. You wrote this retry decorator but it does not retry on failure. What is the bug?
def retry(func):
def wrapper():
for _ in range(3):
try:
func()
except Exception:
continue
return wrapper
medium
A. The decorator is missing the @functools.wraps(func) call
B. The except block should raise the exception instead of continue
C. The loop should be a while loop instead of for loop
D. The function does not return the result or stop retrying on success
Solution
Step 1: Check retry logic
The wrapper calls func() but never returns its result or breaks loop on success.
Step 2: Effect of missing return
Without return, wrapper always completes loop and returns None, so retry never stops on success.
Final Answer:
The function does not return the result or stop retrying on success -> Option D
Quick Check:
Missing return causes always 3 retries even on success [OK]
Hint: Always return on success to stop retries [OK]
Common Mistakes:
Not returning function result inside try
Misusing continue in except block
Ignoring decorator metadata preservation
5. You want to implement a retry mechanism in Selenium tests that retries up to 3 times with a 2-second delay between tries. Which code snippet correctly implements this?
hard
A. import time
def retry(func):
def wrapper():
for i in range(3):
try:
return func()
except Exception:
if i < 2:
time.sleep(2)
else:
raise
return wrapper
B. import time
def retry(func):
def wrapper():
for _ in range(3):
try:
func()
except Exception:
time.sleep(2)
return wrapper
D. import time
def retry(func):
def wrapper():
while True:
try:
return func()
except Exception:
time.sleep(2)
return wrapper
Solution
Step 1: Check retry count and delay
import time
def retry(func):
def wrapper():
for i in range(3):
try:
return func()
except Exception:
if i < 2:
time.sleep(2)
else:
raise
return wrapper retries 3 times with a 2-second sleep between tries except after last attempt.
Step 2: Verify exception handling
import time
def retry(func):
def wrapper():
for i in range(3):
try:
return func()
except Exception:
if i < 2:
time.sleep(2)
else:
raise
return wrapper raises exception after last retry, correctly stopping retries on failure.
Final Answer:
import time
def retry(func):
def wrapper():
for i in range(3):
try:
return func()
except Exception:
if i < 2:
time.sleep(2)
else:
raise
return wrapper -> Option A
Quick Check:
Retry with delay and raise after last try [OK]
Hint: Use loop with sleep and raise after last retry [OK]
Common Mistakes:
Not raising exception after last retry
Missing delay between retries
Retrying infinitely without limit
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.