基于Playwright Python实现Swagger API自动化及Ansible Tower自动化框架需求
一、Playwright Python实现Swagger API自动化
环境准备
- 安装依赖包:
pip install playwright playwright install chrome
核心实现思路
Swagger UI是网页版API调试界面,Playwright可模拟Chrome浏览器操作页面元素,完成API参数填充、请求发送、响应断言全流程。
示例脚本
from playwright.sync_api import sync_playwright def swagger_api_test(): with sync_playwright() as p: # 启动Chrome,打开目标Swagger页面 browser = p.chromium.launch(headless=False) # 调试时设为False,生产环境改为True page = browser.new_page() page.goto("http://your-swagger-ui-url") # 等待页面加载,定位目标API(以POST /api/users为例) page.wait_for_selector('text="POST /api/users"') # 展开API详情面板 page.click('text="POST /api/users"') # 激活"Try it out"模式 page.click('button:has-text("Try it out")') # 填充请求体参数 request_body = '{"username": "test_user", "email": "test@example.com"}' page.fill('textarea[name="body"]', request_body) # 发送请求 page.click('button:has-text("Execute")') # 等待响应加载,断言状态码和响应内容 page.wait_for_selector('.response-col_status') status_code = page.text_content('.response-col_status') assert status_code == "201 Created", f"预期状态码201,实际得到{status_code}" response_body = page.text_content('.response_body') assert '"username": "test_user"' in response_body, "响应内容未包含预期数据" browser.close() if __name__ == "__main__": swagger_api_test()
关键注意事项
- 元素定位:优先使用文本选择器(
text="xxx")或CSS属性选择器,避免依赖Swagger动态生成的元素ID - 等待机制:必须用
wait_for_selector确保元素加载完成,避免页面渲染延迟导致的定位失败 - 复用性:可将API操作封装为通用函数,传入API路径、请求参数、断言条件等,适配不同接口测试需求
二、Ansible Tower自动化的Python框架
Ansible Tower(现AWX)支持REST API和官方Python SDK,可实现作业模板管理、作业启动、状态查询等自动化操作,以下两种方案可选:
方案1:使用官方SDK awxkit
环境准备
pip install awxkit
示例代码
from awxkit.api.pages import * def tower_job_automation(): # 连接Ansible Tower实例 tower = AwxApi("http://your-tower-url", username="admin", password="your-password") # 根据名称获取目标作业模板 job_template = tower.job_templates.get(name="Deploy Web Server") # 启动作业 job = job_template.launch() # 等待作业执行完成 job.wait_until_completed() # 验证作业状态 assert job.status == "successful", f"作业执行失败,状态:{job.status}" # 打印作业日志 print("作业日志:\n", job.stdout) if __name__ == "__main__": tower_job_automation()
方案2:直接调用REST API(灵活度更高)
环境准备
pip install requests
示例代码
import requests from requests.auth import HTTPBasicAuth def tower_api_automation(): tower_url = "http://your-tower-url" username = "admin" password = "your-password" # 获取认证Token auth_response = requests.post( f"{tower_url}/api/v2/tokens/", auth=HTTPBasicAuth(username, password) ) auth_response.raise_for_status() token = auth_response.json()["token"] headers = {"Authorization": f"Bearer {token}"} # 根据名称查询作业模板ID templates_response = requests.get( f"{tower_url}/api/v2/job_templates/", headers=headers, params={"name": "Deploy Web Server"} ) templates_response.raise_for_status() template_id = templates_response.json()["results"][0]["id"] # 启动作业 launch_response = requests.post( f"{tower_url}/api/v2/job_templates/{template_id}/launch/", headers=headers ) launch_response.raise_for_status() job_id = launch_response.json()["id"] # 轮询作业状态,直到结束 while True: job_response = requests.get( f"{tower_url}/api/v2/jobs/{job_id}/", headers=headers ) job_response.raise_for_status() job_status = job_response.json()["status"] if job_status in ["successful", "failed", "canceled"]: break assert job_status == "successful", f"作业执行失败,状态:{job_status}" if __name__ == "__main__": tower_api_automation()
核心建议
- 凭证管理:避免硬编码敏感信息,使用环境变量或密钥管理工具存储用户名、密码、Token
- 错误处理:添加
try-except块捕获API请求异常,提升脚本稳定性 - 封装复用:将Tower常用操作(模板查询、作业启动、状态检查)封装为工具类,减少重复代码
- 集成场景:可将两种自动化流程结合,比如用Playwright验证API可用性后,调用Ansible Tower执行部署作业
内容的提问来源于stack exchange,提问作者Ali Haider
相关产品推荐
相关产品推荐

