1. 为什么需要智能Web自动化测试?

在传统Web测试中,工程师需要手动编写大量重复的测试脚本,不仅耗时耗力,还容易遗漏边缘场景。我曾经参与过一个电商项目,光是测试购物车功能就写了200多行测试代码,每次页面结构变动都要重写选择器,维护成本高得吓人。

LangChain+PlayWright的组合正好解决了这个痛点。通过大语言模型(LLM)的推理能力,我们可以让测试脚本具备智能决策能力。比如测试登录功能时,传统脚本只能验证预设账号,而智能测试可以自动生成各种边界用例(空密码、特殊字符等),还能理解页面错误提示的语义。

去年我帮一个团队重构他们的爬虫系统时就深有体会。原先用Selenium写的爬虫平均每天要处理30多个页面变更,改用PlayWright+LangChain后,系统能自动识别页面结构变化并调整抓取策略,维护工作量直接下降了70%。

2. 环境搭建与工具配置

2.1 基础环境准备

先确保你的Python版本≥3.8,我推荐使用conda创建独立环境:

conda create -n playwright_env python=3.10
conda activate playwright_env

安装核心依赖时有个坑要注意:不能只装playwright包!我第一次用时就被坑过,明明装了包却跑不起来。完整安装命令应该是:

pip install playwright langchain-openai lxml beautifulsoup4
playwright install  # 这个才是真正安装浏览器内核

验证安装是否成功可以跑这个测试脚本:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    print(page.title())
    browser.close()

如果能看到"百度一下"的输出,说明环境OK。

2.2 LangChain集成配置

要启用智能测试能力,需要配置LLM模型。我用OpenAI的gpt-3.5-turbo做演示:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0.3  # 数值越低输出越确定
)

温度参数(temperature)的设置很关键。测试场景建议设为0.3-0.5之间,太高会导致随机性太强,测试结果不可复现。上周帮一个金融客户调试时,就遇到过因为temperature设成0.8导致同样输入产生不同测试路径的问题。

3. 核心工具链实战

3.1 PlayWright基础操作封装

先看看如何封装常用的页面操作:

from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
from langchain_community.tools.playwright.utils import create_async_playwright_browser

async_browser = create_async_playwright_browser()
toolkit = PlayWrightBrowserToolkit.from_browser(async_browser=async_browser)
tools = toolkit.get_tools()

# 工具字典方便调用
tool_dict = {tool.name: tool for tool in tools}

这个工具包提供了6个开箱即用的能力:

  • 页面导航(navigate_browser)
  • 元素点击(click_element)
  • 文本提取(extract_text)
  • 链接提取(extract_hyperlinks)
  • 元素查找(get_elements)
  • 当前页面获取(current_page)

3.2 智能测试案例:电商价格监控

假设要监控某电商平台的价格波动,传统方法需要硬编码商品页面的CSS选择器。用我们的方案可以这样实现:

async def price_monitor(url):
    nav_tool = tool_dict["navigate_browser"]
    await nav_tool.ainvoke({"url": url})
    
    # 让LLM分析页面结构
    response = await agent.arun(
        "找出当前页面中的商品价格元素,"
        "价格通常包含¥或$符号,"
        "可能有class包含price/amount等关键词"
    )
    
    # 自动生成选择器
    selector = parse_selector(response)
    price = await tool_dict["extract_text"].ainvoke({"selector": selector})
    return float(price.strip('¥$'))

这个方案的妙处在于:当页面改版时,只要价格元素的语义特征不变(包含货币符号),就不需要修改测试代码。上个月某电商APP改版时,我们的监控脚本完全没受影响,而其他团队的脚本全部报错。

4. 高级测试策略

4.1 动态路径测试

对于多步骤流程(如注册→登录→下单),可以用LangChain的SequentialChain实现:

from langchain.chains import SequentialChain

test_chain = SequentialChain(
    chains=[register_chain, login_chain, order_chain],
    input_variables=["user_info"],
    verbose=True
)

实测发现三个优化点:

  1. 每个步骤间加入2秒延迟,避免被当成机器人
  2. 使用page.wait_for_selector确保元素加载完成
  3. 对关键操作添加视觉标记(如截图),方便后期排查

4.2 异常处理机制

智能测试最大的风险是LLM的不可预测性。我的经验是必须添加防护层:

try:
    await agent.arun("点击登录按钮")
except Exception as e:
    # 自动生成错误报告
    await page.screenshot(path=f"error_{datetime.now()}.png")
    error_chain.run(f"错误分析:{str(e)}")

在金融项目中我们甚至加入了熔断机制:连续3次操作失败就自动切换备用测试方案。这套机制在上次618大促时帮我们避免了70%的潜在故障。

5. 性能优化技巧

经过20多个项目的实践,我总结出这些优化方案:

  1. 浏览器复用:不要每次测试都开新浏览器,用这个配置能提升3倍速度:
async_browser = create_async_playwright_browser(
    headless=True,
    args=["--start-maximized"]
)
  1. 智能等待策略:混合使用三种等待方式:
# 固定等待(简单但低效)
await asyncio.sleep(2)

# 元素等待(推荐)
await page.wait_for_selector(".submit-btn")

# 网络请求等待(适合SPA)
await page.wait_for_response("**/api/checkout")
  1. 并行测试:用Playwright自带的上下文实现隔离测试:
async with async_playwright() as p:
    browser = await p.chromium.launch()
    context = await browser.new_context()
    page1 = await context.new_page()
    page2 = await context.new_page()

最近给一个海外客户做的测试平台,通过这些优化将3000个测试用例的执行时间从4小时压缩到了35分钟。关键是要在稳定性和效率间找到平衡点,我的经验值是并行数不超过CPU核心数的2倍。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐