大家好本篇在上一版基础上进行了优化,重点增加了 Page Object Model(POM) 最佳实践示例 和 健壮的错误处理机制,让生成的测试代码更规范、更易维护、更接近生产环境。

核心目标依然是:输入一句自然语言测试需求 → AI 自动生成高质量 Playwright 代码(POM 模式)→ 自动执行 + 错误处理 → 输出报告

一、核心技术栈

  • Playwright + LangChain Agent + Ollama
  • POM 模式(提升代码可维护性)
  • 异常捕获 + 重试 + 日志机制

二、环境准备

(同上篇,此处省略)

三、完整代码实战(优化版)

1. 定义 Page Object Model 基类

Python

from playwright.sync_api import Page, expect
from abc import ABC, abstractmethod

class BasePage(ABC):
    def __init__(self, page: Page):
        self.page = page
    
    @abstractmethod
    def goto(self):
        pass
    
    def safe_click(self, selector, timeout=10000):
        """安全点击,包含错误处理"""
        try:
            self.page.wait_for_selector(selector, timeout=timeout)
            self.page.locator(selector).click()
            return True
        except Exception as e:
            print(f"点击 {selector} 失败: {str(e)}")
            self.take_screenshot(f"error_click_{selector}")
            return False
    
    def take_screenshot(self, name: str):
        self.page.screenshot(path=f"screenshots/{name}.png")

2. 具体 Page 示例(电商登录页面)

Python

class LoginPage(BasePage):
    def goto(self):
        self.page.goto("https://demo.ecommerce.com/login")
    
    def login(self, username: str, password: str):
        self.safe_click('input[name="username"]')
        self.page.fill('input[name="username"]', username)
        self.page.fill('input[name="password"]', password)
        self.safe_click('button[type="submit"]')
        
        # 断言登录成功
        try:
            expect(self.page.locator(".welcome-text")).to_be_visible(timeout=5000)
            print("登录成功!")
            return True
        except:
            print("登录失败")
            self.take_screenshot("login_failed")
            return False

3. Tools 增强(支持错误处理)

Python

from langchain_core.tools import tool

@tool
def execute_playwright_test(test_code: str) -> str:
    """执行 Playwright 测试代码,包含错误重试"""
    try:
        with open("generated_test.py", "w", encoding="utf-8") as f:
            f.write(test_code)
        
        # 执行并捕获详细错误
        import subprocess
        result = subprocess.run(["pytest", "generated_test.py", "--browser=chromium", "-q"], 
                              capture_output=True, text=True, timeout=120)
        
        if result.returncode == 0:
            return "✅ 测试全部通过"
        else:
            return f"❌ 测试失败: {result.stderr[-500:]}"  # 返回最后500字符错误信息
    except Exception as e:
        return f"执行异常: {str(e)}"

4. 优化后的 Agent Prompt(重点加强 POM 和错误处理)

Python

prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一位资深测试开发工程师,精通 Playwright 和 POM 模式。
要求:
1. 必须使用 Page Object Model 模式组织代码
2. 所有操作使用 safe_click、显式等待等健壮方式
3. 加入完善的 try-except 错误处理和截图机制
4. 使用 getByRole、getByLabel、getByTestId 等稳定定位器
5. 代码必须可直接运行
当前时间是2026年,请遵循最新最佳实践。"""),
    ("placeholder", "{chat_history}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}")
])

5. 执行函数

Python

def run_ai_test(requirement: str):
    print(f"正在处理需求: {requirement}")
    result = agent_executor.invoke({
        "input": f"请使用 POM 模式,根据以下需求生成完整、可运行的 Playwright 测试代码,并包含错误处理:{requirement}"
    })
    print("AI 测试执行完成!")
    return result

使用示例

Python

run_ai_test("测试电商网站登录流程:用户名 test@163.com,密码 123456,登录成功后进入首页并检查购物车是否为空")

四、实际效果 & 踩坑总结

优化后提升

  • 使用 POM 后,代码结构清晰,后续维护成本大幅降低
  • 加入 safe_click + 截图 + 日志,脚本健壮性显著提高
  • Agent 生成的代码更规范,基本符合生产标准

常见问题 & 解决

  • 定位器失效 → 使用 safe_click + 截图快速定位问题
  • 网络波动 → 增加 page.wait_for_load_state("networkidle")
  • 大模型幻觉 → 在 Prompt 中强约束使用 POM 和稳定定位器

五、今日感悟

加入 POM 和错误处理后,我明显感觉到生成的测试脚本从“能跑”进化到了“可维护”。 这也是测开未来发展的方向:AI 负责生成初稿 + 执行,人负责设计框架、Review 质量和持续优化。

下一期预告(AI Web UI 自动化专栏 #02)实现 AI 自愈测试(Self-Healing) + 视觉回归测试

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐