如何用Python Selenium校验Postman API响应与应用UI数据并实现代码复用
问题排查与封装方案
无输出问题根因
- 方法未触发执行:你定义的
__init__、三个业务方法都是类成员方法,没有实例化类对象,也没有按获取UI数据→获取API数据→执行校验的顺序调用方法,自然没有任何输出 - 断言逻辑限制:只有当
self.name和self.text1完全相等时才会打印matched,如果值不等会直接抛出AssertionError终止程序,不会输出内容 - webdriver初始化异常(如果未提前配置driver):你导入的
from webdriver_manager import driver没有实际初始化Chrome驱动实例,方法运行时会报错终止,不会到打印步骤
可复用封装实现
下面封装的工具类可直接接入unittest/pytest等测试框架,支持任意UI和API的匹配校验,所有参数可动态配置:
import requests from selenium import webdriver from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager class ApiUiValidator: def __init__(self, headless: bool = False): # 初始化浏览器配置 chrome_options = webdriver.ChromeOptions() if headless: chrome_options.add_argument("--headless=new") self.driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) self.ui_value = None self.api_value = None def get_ui_value(self, url: str, xpath: str) -> str: """从UI获取指定元素的文本值""" self.driver.get(url) self.ui_value = self.driver.find_element(By.XPATH, xpath).text.strip() self.driver.quit() return self.ui_value def get_api_value(self, url: str, value_path: list) -> any: """从API响应中按路径取对应值,value_path示例:["data", 0, "first_name"]""" resp = requests.get(url) resp.raise_for_status() json_data = resp.json() # 按路径逐层取值 current = json_data for key in value_path: current = current[key] self.api_value = current return self.api_value def validate(self, ui_url: str, ui_xpath: str, api_url: str, api_value_path: list) -> None: """执行全流程校验,相等打印匹配结果,不等抛出异常""" self.get_ui_value(ui_url, ui_xpath) self.get_api_value(api_url, api_value_path) assert self.ui_value == self.api_value, f"值不匹配:UI返回{self.ui_value},API返回{self.api_value}" print(f"校验通过:UI和API返回值均为{self.ui_value}") # 调用示例 if __name__ == "__main__": validator = ApiUiValidator(headless=True) try: validator.validate( ui_url="https://en.wikipedia.org/wiki/Michael", ui_xpath='//h1[normalize-space()="Michael"]', api_url="https://reqres.in/api/users?page=2", api_value_path=["data", 0, "first_name"] ) except AssertionError as e: print(f"校验失败:{e}") except Exception as e: print(f"执行异常:{str(e)}")
调用说明
- 如果是在测试框架中使用,直接导入
ApiUiValidator类,实例化后调用validate方法传入对应参数即可 - 支持开启无头模式(初始化时传
headless=True),适合CI/CD流水线无界面运行 - 可根据需求扩展方法,比如支持POST请求API、支持CSS选择器定位UI元素、支持校验非文本类数据等
内容的提问来源于stack exchange,提问作者Kiran Bhingare Patil
相关产品推荐
相关产品推荐

