A custom wait condition is a user-defined rule that tells Selenium to wait until a specific condition is true before continuing the test. It helps handle cases where built-in waits are not enough.
Click to reveal answer
beginner
How do you create a custom wait condition in Selenium with Python?
You create a function that takes a WebDriver as input and returns True when the condition is met or False otherwise. Then you use WebDriverWait with this function.
Click to reveal answer
beginner
Why use custom wait conditions instead of fixed sleep times?
Custom waits wait only as long as needed, making tests faster and more reliable. Fixed sleeps waste time and can cause flaky tests if the wait is too short or too long.
Click to reveal answer
intermediate
Example of a simple custom wait condition function in Selenium Python?
from selenium.webdriver.common.by import By
def element_has_text(driver):
element = driver.find_element(By.ID, 'message')
return element.text == 'Loaded'
This waits until the element with ID 'message' has text 'Loaded'.
Click to reveal answer
beginner
What exception does WebDriverWait raise if the custom condition is not met in time?
It raises a TimeoutException to indicate the wait timed out before the condition became true.
Click to reveal answer
What does a custom wait condition function in Selenium Python return when the condition is met?
AAn exception
BFalse
CTrue
DNone
✗ Incorrect
The custom wait condition function returns True when the condition is met, signaling WebDriverWait to proceed.
Which Selenium class is used to apply custom wait conditions?
AWebDriverWait
BExpectedConditions
CActionChains
DSelect
✗ Incorrect
WebDriverWait is used to wait until a custom or built-in condition is true.
What happens if the custom wait condition is not met within the timeout?
ATimeoutException is raised
BTest passes anyway
CThe browser closes automatically
DThe condition is ignored
✗ Incorrect
If the condition is not met in time, WebDriverWait raises a TimeoutException.
Why are custom wait conditions better than fixed sleep() calls?
AThey always wait the maximum time
BThey wait only as long as needed
CThey make tests slower
DThey ignore page loading
✗ Incorrect
Custom waits wait dynamically, improving test speed and reliability.
Which argument does a custom wait condition function receive?
ALocator string
BTimeout value
CTest case name
DWebDriver instance
✗ Incorrect
The function receives the WebDriver instance to check page state.
Explain how to implement a custom wait condition in Selenium Python and why it is useful.
Think about waiting for specific page states dynamically.
You got /4 concepts.
Describe what happens when a custom wait condition times out in Selenium tests.
Consider how Selenium signals wait failures.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of creating a custom wait condition in Selenium with Python?
easy
A. To automatically retry failed tests
B. To speed up the test execution by skipping waits
C. To replace the WebDriverWait class completely
D. To wait for a specific condition that is not covered by built-in waits
Solution
Step 1: Understand built-in waits limitations
Built-in waits cover common cases but sometimes you need to wait for a unique condition.
Step 2: Purpose of custom wait
Custom waits let you define exactly what to wait for, improving test reliability.
Final Answer:
To wait for a specific condition that is not covered by built-in waits -> Option D
Quick Check:
Custom wait = wait for unique condition [OK]
Hint: Custom waits handle unique conditions not in built-in waits [OK]
Common Mistakes:
Thinking custom waits speed up tests
Believing custom waits replace WebDriverWait
Assuming custom waits retry tests automatically
2. Which of the following is the correct way to define a custom wait condition class in Selenium Python?
easy
A. class MyWait:
def __call__(self, driver):
return driver.find_element_by_id('myid')
B. class MyWait:
def wait(self):
return True
C. def MyWait(driver):
return driver.find_element('id', 'myid')
D. class MyWait:
def wait_for(self, driver):
return False
Solution
Step 1: Identify the special method for custom waits
Custom wait classes must implement the __call__ method to be callable by WebDriverWait.
Step 2: Check method signature and return
Method __call__ takes driver and returns element or True when condition met.
Final Answer:
class MyWait:\n def __call__(self, driver):\n return driver.find_element_by_id('myid') -> Option A
Quick Check:
Custom wait uses __call__ method [OK]
Hint: Custom wait class must have __call__(self, driver) method [OK]
Common Mistakes:
Using method named wait instead of __call__
Defining function instead of class
Using wrong method signature
3. Given the code below, what will be the output if the element with id 'submit' appears after 3 seconds?
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
class WaitForSubmit:
def __call__(self, driver):
try:
elem = driver.find_element(By.ID, 'submit')
return elem
except:
return False
wait = WebDriverWait(driver, 5)
submit_button = wait.until(WaitForSubmit())
print(submit_button.tag_name)
medium
A. Prints False
B. Raises TimeoutException immediately
C. Prints the tag name of the 'submit' element after waiting
D. Raises NoSuchElementException
Solution
Step 1: Understand the custom wait behavior
The custom wait tries to find element with id 'submit'. If not found, returns False to keep waiting.
Step 2: Analyze wait.until with timeout 5 seconds
The element appears after 3 seconds, so wait.until returns the element before timeout.
Final Answer:
Prints the tag name of the 'submit' element after waiting -> Option C
Quick Check:
Element appears before timeout, so tag_name prints [OK]
Hint: Custom wait returns element or False; wait.until waits until element found [OK]
Common Mistakes:
Assuming immediate TimeoutException
Expecting print of False instead of element
Confusing exceptions raised
4. Identify the error in the following custom wait condition code:
class WaitForText:
def __call__(self, driver):
element = driver.find_element(By.ID, 'message')
if element.text == 'Done':
return True
else:
return None
wait = WebDriverWait(driver, 10)
wait.until(WaitForText())
medium
A. Returning None instead of False causes wait.until to stop waiting
B. Missing import for By causes NameError
C. Returning True instead of element causes error
D. Using find_element instead of find_elements causes exception
Solution
Step 1: Check imports
The code uses By.ID but does not import By, causing NameError at runtime.
Step 2: Analyze return values
Returning True or None is allowed; wait.until treats True as success and None as failure to continue waiting.
Final Answer:
Missing import for By causes NameError -> Option B
Quick Check:
By must be imported to avoid NameError [OK]
Hint: Always import By before using it in locators [OK]
Common Mistakes:
Thinking None stops waiting (it continues)
Assuming returning True causes error
Confusing find_element with find_elements
5. You want to wait until a button with id 'start' is both visible and enabled before clicking it. Which custom wait condition class correctly implements this?
hard
A. class WaitForStart:
def __call__(self, driver):
btn = driver.find_element(By.ID, 'start')
if btn.is_displayed() and btn.is_enabled():
return btn
return False
B. class WaitForStart:
def __call__(self, driver):
btn = driver.find_element(By.ID, 'start')
if btn.is_displayed() or btn.is_enabled():
return True
return False
C. class WaitForStart:
def __call__(self, driver):
btn = driver.find_element(By.ID, 'start')
if btn.is_displayed() and btn.is_enabled():
return True
return False
D. class WaitForStart:
def __call__(self, driver):
btn = driver.find_element(By.ID, 'start')
if btn.is_enabled():
return btn
return None
Solution
Step 1: Check condition logic
We need both visible and enabled, so use 'and' operator to check both.
Step 2: Return element when condition met
Return the button element so wait.until returns it for further actions.
Final Answer:
class WaitForStart:\n def __call__(self, driver):\n btn = driver.find_element(By.ID, 'start')\n if btn.is_displayed() and btn.is_enabled():\n return btn\n return False -> Option A
Quick Check:
Return element when visible and enabled [OK]
Hint: Return element only if visible AND enabled, else False [OK]
Common Mistakes:
Using 'or' instead of 'and' for conditions
Returning True instead of element
Returning None instead of False
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.