Bird
Raised Fist0
Selenium Pythontesting~15 mins

Performance metrics collection in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Collect and verify page load performance metrics
Preconditions (2)
Step 1: Open the browser and navigate to 'https://example.com'
Step 2: Wait until the page is fully loaded
Step 3: Collect the page load performance metrics using the browser's performance API
Step 4: Verify that the 'loadEventEnd' timing is greater than 0
Step 5: Verify that the 'domContentLoadedEventEnd' timing is greater than 0
✅ Expected Result: The performance metrics 'loadEventEnd' and 'domContentLoadedEventEnd' are collected and both have values greater than zero, indicating the page loaded successfully.
Automation Requirements - Selenium with Python
Assertions Needed:
'loadEventEnd' > 0
'domContentLoadedEventEnd' > 0
Best Practices:
Use explicit waits to ensure page load completion
Use Selenium's execute_script method to access performance timing
Use clear and maintainable locators and code structure
Automated Solution
Selenium Python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# Setup Chrome options
chrome_options = Options()
chrome_options.add_argument('--headless=new')  # Run headless for faster execution

# Setup WebDriver service
service = Service()
driver = webdriver.Chrome(service=service, options=chrome_options)

try:
    driver.get('https://example.com')

    # Wait until the document.readyState is 'complete'
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script('return document.readyState') == 'complete'
    )

    # Collect performance timing metrics
    performance_timing = driver.execute_script('return window.performance.timing')

    load_event_end = performance_timing.get('loadEventEnd', 0)
    dom_content_loaded_event_end = performance_timing.get('domContentLoadedEventEnd', 0)

    assert load_event_end > 0, f"Expected loadEventEnd > 0 but got {load_event_end}"
    assert dom_content_loaded_event_end > 0, f"Expected domContentLoadedEventEnd > 0 but got {dom_content_loaded_event_end}"

finally:
    driver.quit()

This script uses Selenium WebDriver with Python to open the browser and navigate to 'https://example.com'.

It waits explicitly until the page's document.readyState is 'complete', ensuring the page is fully loaded before collecting performance data.

Using execute_script, it accesses the browser's window.performance.timing object to get timing metrics.

The script asserts that both loadEventEnd and domContentLoadedEventEnd are greater than zero, which means the page loaded successfully.

Finally, the browser is closed properly in a finally block to clean up resources.

Common Mistakes - 3 Pitfalls
{'mistake': 'Not waiting for the page to fully load before collecting performance metrics', 'why_bad': 'Performance metrics may be incomplete or zero if collected too early, causing false test failures.', 'correct_approach': "Use explicit waits to check that document.readyState is 'complete' before collecting metrics."}
{'mistake': 'Using hardcoded sleep (time.sleep) instead of explicit waits', 'why_bad': 'Hardcoded sleeps slow down tests and are unreliable if page load times vary.', 'correct_approach': "Use Selenium's WebDriverWait with conditions for better reliability and speed."}
{'mistake': 'Accessing performance metrics with incorrect JavaScript or wrong keys', 'why_bad': 'This leads to errors or missing data, causing test failures or incorrect results.', 'correct_approach': "Use correct JavaScript to access window.performance.timing and check keys like 'loadEventEnd'."}
Bonus Challenge

Now add data-driven testing with 3 different URLs to collect and verify performance metrics for each.

Show Hint

Practice

(1/5)
1. What is the main purpose of collecting performance metrics in Selenium tests?
easy
A. To check if the page layout matches the design
B. To verify the correctness of form inputs
C. To measure how fast a web page and its resources load
D. To test user login functionality

Solution

  1. Step 1: Understand performance metrics

    Performance metrics focus on timing data related to page loading and resource fetching.
  2. Step 2: Identify the purpose in Selenium context

    In Selenium, performance metrics help measure loading speed, not layout or input correctness.
  3. Final Answer:

    To measure how fast a web page and its resources load -> Option C
  4. Quick Check:

    Performance metrics = loading speed [OK]
Hint: Performance metrics = page and resource load times [OK]
Common Mistakes:
  • Confusing performance metrics with UI layout checks
  • Thinking performance metrics test form validation
  • Assuming performance metrics check user actions
2. Which Selenium Python code snippet correctly executes JavaScript to get the navigation start time from the performance object?
easy
A. driver.execute_script('return window.performance.timing.navigationStart;')
B. driver.execute_script('window.performance.navigationStart')
C. driver.execute_script('return window.performance.navigationStart')
D. driver.execute_script('window.performance.timing.navigationStart')

Solution

  1. Step 1: Identify correct JavaScript property

    The navigation start time is under window.performance.timing.navigationStart.
  2. Step 2: Check correct Selenium syntax

    Use return keyword and full property path with semicolon for valid JS execution.
  3. Final Answer:

    driver.execute_script('return window.performance.timing.navigationStart;') -> Option A
  4. Quick Check:

    Correct JS property and return statement = driver.execute_script('return window.performance.timing.navigationStart;') [OK]
Hint: Use full path with return and semicolon in execute_script [OK]
Common Mistakes:
  • Omitting 'return' keyword in execute_script
  • Using wrong property path without 'timing'
  • Missing semicolon causing JS errors
3. Given the following Selenium Python code snippet, what will be the output if navigationStart is 1000 and loadEventEnd is 3500?
nav_start = driver.execute_script('return window.performance.timing.navigationStart;')
load_end = driver.execute_script('return window.performance.timing.loadEventEnd;')
load_time = load_end - nav_start
print(load_time)
medium
A. 2500
B. 4500
C. 3500
D. 1000

Solution

  1. Step 1: Understand the variables

    nav_start = 1000, load_end = 3500 as given.
  2. Step 2: Calculate load_time

    load_time = load_end - nav_start = 3500 - 1000 = 2500.
  3. Final Answer:

    2500 -> Option A
  4. Quick Check:

    3500 - 1000 = 2500 [OK]
Hint: Subtract navigationStart from loadEventEnd for load time [OK]
Common Mistakes:
  • Adding instead of subtracting timestamps
  • Using wrong variable names
  • Confusing loadEventEnd with other timing values
4. Identify the error in this Selenium Python code snippet for collecting page load time:
nav_start = driver.execute_script('return window.performance.timing.navigationStart')
load_end = driver.execute_script('return window.performance.timing.loadEventEnd')
load_time = nav_start - load_end
print(load_time)
medium
A. Variables nav_start and load_end are not defined
B. Missing semicolons in JavaScript cause syntax error
C. Using 'driver.execute_script' is incorrect for performance data
D. The subtraction order is reversed, causing negative load time

Solution

  1. Step 1: Check subtraction logic

    Load time should be load_end - nav_start, not nav_start - load_end.
  2. Step 2: Understand impact of reversed subtraction

    Reversed order results in negative load time, which is incorrect.
  3. Final Answer:

    The subtraction order is reversed, causing negative load time -> Option D
  4. Quick Check:

    Correct subtraction order = load_end - nav_start [OK]
Hint: Subtract navigationStart from loadEventEnd, not vice versa [OK]
Common Mistakes:
  • Reversing subtraction causing negative results
  • Assuming missing semicolons cause errors in this context
  • Thinking execute_script can't get performance data
5. You want to collect multiple performance metrics in Selenium Python: navigationStart, responseStart, and loadEventEnd. Which code snippet correctly collects these and calculates the total load time from navigationStart to loadEventEnd?
hard
A. nav = driver.execute_script('window.performance.timing.navigationStart') resp = driver.execute_script('window.performance.timing.responseStart') load = driver.execute_script('window.performance.timing.loadEventEnd') total_load = resp - nav print(total_load)
B. nav = driver.execute_script('return window.performance.timing.navigationStart;') resp = driver.execute_script('return window.performance.timing.responseStart;') load = driver.execute_script('return window.performance.timing.loadEventEnd;') total_load = load - nav print(total_load)
C. nav = driver.execute_script('return window.performance.navigationStart;') resp = driver.execute_script('return window.performance.responseStart;') load = driver.execute_script('return window.performance.loadEventEnd;') total_load = load - nav print(total_load)
D. nav = driver.execute_script('return window.performance.timing.navigationStart;') resp = driver.execute_script('return window.performance.timing.responseStart;') load = driver.execute_script('return window.performance.timing.loadEventEnd;') total_load = resp - load print(total_load)

Solution

  1. Step 1: Verify JavaScript property paths

    Performance timing properties are under window.performance.timing with return keyword.
  2. Step 2: Check calculation logic

    Total load time is loadEventEnd minus navigationStart, so load - nav is correct.
  3. Final Answer:

    nav = driver.execute_script('return window.performance.timing.navigationStart;') resp = driver.execute_script('return window.performance.timing.responseStart;') load = driver.execute_script('return window.performance.timing.loadEventEnd;') total_load = load - nav print(total_load) -> Option B
  4. Quick Check:

    Correct property path and subtraction order = nav = driver.execute_script('return window.performance.timing.navigationStart;') resp = driver.execute_script('return window.performance.timing.responseStart;') load = driver.execute_script('return window.performance.timing.loadEventEnd;') total_load = load - nav print(total_load) [OK]
Hint: Use full timing path and subtract navigationStart from loadEventEnd [OK]
Common Mistakes:
  • Using wrong property paths without 'timing'
  • Calculating load time with wrong subtraction order
  • Omitting 'return' in execute_script calls
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