Read article

This code example demonstrates a robust approach to testing a website using Python and Selenium, along with other libraries such as difflib, requests, os, and subprocess. The code navigates to a spec

07 April 2023 Alejandro Acosta Alejandro Acosta

It also checks for any broken links on the page using the requests library and takes a screenshot of any broken links if they are found.

Additionally, the code checks for any visual changes on the page using the ImageMagick command-line tool and the Python os and subprocess libraries.

from selenium import webdriver from https://lnkd.in/eyphV6mv import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import difflib import time import requests import os

url = "https://www.example.com" expected_text = "Welcome to Example.com"

driver_path = "/path/to/chromedriver" screenshot_dir = "/path/to/screenshots"

def take_screenshot(driver, file_name): if not os.path.exists(screenshot_dir): os.makedirs(screenshot_dir) driver.save_screenshot(os.path.join(screenshot_dir, file_name))

def compare_text(driver): page_text = driver.find_element_by_tag_name("body").text ratio = difflib.SequenceMatcher(None, expected_text, page_text).ratio() return ratio >= 0.9

options = webdriver.ChromeOptions() options.add_argument("--headless") driver = webdriver.Chrome(driver_path, options=options) driver.set_window_size(1920, 1080)

driver.get(url) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))

screenshot_name = f"{url.replace('https://', '')}_{int(time.time())}.png" take_screenshot(driver, screenshot_name) assert compare_text(driver)

broken_links = [] links = driver.find_elements_by_tag_name("a") for link in links: url = link.get_attribute("href") if url.startswith("mailto:"): continue try: response = requests.head(url, allow_redirects=True, timeout=5) if response.status_code >= 400: broken_links.append(url) except: broken_links.append(url)

if broken_links: screenshot_name = f"{url.replace('https://', '')}broken_links{int(time.time())}.png" take_screenshot(driver, screenshot_name) raise Exception(f"Found broken links: {broken_links}")

expected_image = "/path/to/expected_image.png" screenshot_image = os.path.join(screenshot_dir, screenshot_name) if not os.path.exists(expected_image): os.rename(screenshot_image, expected_image) else: os.system(f"compare -metric AE -fuzz 5% {expected_image} {screenshot_image} /dev/null 2>&1") difference = int(os.popen(f"identify -format %[distortion] {screenshot_image}").read().strip()) if difference > 1000: raise Exception(f"Found visual changes: {screenshot_image}")

driver.quit()