返回 MCP 目录
public公开dns本地运行

cypress-mcp

自动生成Cypress页面对象类和完整测试套件的MCP服务,支持网页抓取、元素识别和多种测试场景生成

article

README

🚀 MCP Cypress 页面对象与测试生成器

本 MCP(模型上下文协议)服务器可自动为任意网页生成完整的 Cypress 页面对象类 以及 全面的测试套件。

✨ 主要特性

  • 网页抓取:使用 Puppeteer 来获取并渲染网页。
  • HTML 解析:使用 Cheerio 解析 HTML 并提取元素信息。
  • 页面对象生成:创建完整的 TypeScript 页面对象类,包含:
    • 私有元素定位器。
    • 公共获取方法。
    • 交互方法(点击、输入、选择等)。
    • 常见测试场景的工作流方法。
  • 测试套件生成:创建全面的 Cypress 测试文件,包含:
    • 所有元素的正向测试用例。
    • 用于错误处理的负向测试用例。
    • 常见场景的工作流测试。
    • 可访问性、性能和边界情况测试。

📦 生成的输出

服务器会生成 两个文件

1. 页面对象类 ({ClassName}.ts)

export class ExampleComLoginPage {
  // Private elements
  #elements = {
    button_login: () => cy.get('#login-button'),
    input_username: () => cy.get('input[name="username"]'),
    link_home: () => cy.contains('a', 'Home')
  }

  // Public getters
  get ButtonLogin() { return this.#elements.button_login() }
  get InputUsername() { return this.#elements.input_username() }
  get LinkHome() { return this.#elements.link_home() }

  // Interaction methods
  clickButtonLogin() { return this.#elements.button_login().click() }
  typeInputUsername(text: string) { return this.#elements.input_username().type(text) }
  clickLinkHome() { return this.#elements.link_home().click() }

  // Workflow methods
  login(username: string, password: string) {
    this.typeInputUsername(username)
    this.typeInputPassword(password)
    this.clickButtonLogin()
    return this
  }
}

2. 测试套件 ({ClassName}.cy.ts)

import { ExampleComLoginPage } from './ExampleComLoginPage'

describe('ExampleComLoginPage Tests', () => {
  let page: ExampleComLoginPage
  
  beforeEach(() => {
    cy.visit('https://example.com/login')
    page = new ExampleComLoginPage()
  })
  
  describe('Element Interactions', () => {
    it('should click button_login', () => {
      page.clickButtonLogin()
    })
    
    it('should type in input_username', () => {
      page.typeInputUsername('test input')
      page.getInputUsername().should('have.value', 'test input')
    })
  })
  
  describe('Login Workflow', () => {
    it('should login with valid credentials', () => {
      page.login('validuser@example.com', 'validpassword')
      cy.url().should('not.include', '/login')
    })
    
    it('should show error with invalid credentials', () => {
      page.login('invalid@example.com', 'wrongpassword')
      cy.contains('Invalid credentials').should('be.visible')
    })
  })
  
  describe('Error Handling', () => {
    it('should handle network errors gracefully', () => {
      cy.intercept('GET', '**', { forceNetworkError: true })
      cy.visit('https://example.com/login')
    })
  })
})

📋 生成的测试类别

正向测试用例

  • 元素交互:对所有检测到的元素进行点击、输入、清除、勾选/取消勾选操作。
  • 工作流测试:登录、搜索、导航工作流。
  • 表单验证:成功的表单提交。
  • 元素可见性:所有元素可见且可访问。

负向测试用例

  • 错误处理:网络错误、服务器错误、连接缓慢。
  • 验证错误:空字段、无效格式、必填字段验证。
  • 边界情况:大输入、特殊字符、Unicode 文本。
  • 可访问性:ARIA 标签、键盘导航。

🔧 其他测试类型

  • 性能测试:加载时间、快速交互。
  • 响应式测试:不同视口大小。
  • 可访问性测试:ARIA 合规性、键盘导航。
  • 安全测试:输入清理、防止 XSS 攻击。

📌 支持的元素类型

  • 按钮:带有验证的点击交互。
  • 输入字段:输入、清除、勾选/取消勾选(复选框/单选框)。
  • 链接:带有导航验证的点击交互。
  • 下拉选择框:带有验证的选项选择。
  • 文本区域:带有内容验证的输入和清除。
  • 表单:带有成功/错误处理的提交交互。

🔍 工作流检测

服务器能够智能检测常见模式并生成相应的测试:

  • 登录表单:用户名/密码验证、错误处理。
  • 搜索表单:查询验证、结果验证。
  • 导航:主页链接、面包屑导航、菜单项。
  • 表单提交:成功状态、验证错误。

📦 安装指南

npm install

💻 使用示例

基础用法

  1. 启动服务器

    npx tsx main.ts
    
  2. 与 MCP 客户端配合使用: 服务器提供了一个 generateLocator 工具,该工具接受一个 URL 参数。

    工具调用示例:

    {
      "method": "tools/call",
      "params": {
        "name": "generateLocator",
        "arguments": {
          "url": "https://example.com/login"
        }
      }
    }
    
  3. 响应格式: 服务器会返回页面对象类和测试套件:

    // ===== PAGE OBJECT CLASS =====
    // Save this as: ExampleComLoginPage.ts
    export class ExampleComLoginPage { ... }
    
    // ===== CYPRESS TESTS =====
    // Save this as: ExampleComLoginPage.cy.ts
    describe('ExampleComLoginPage Tests', () => { ... }
    

高级用法

// Use the generated Page Object
import { ExampleComLoginPage } from './ExampleComLoginPage'

describe('Login Page', () => {
  const page = new ExampleComLoginPage()
  
  it('should login successfully', () => {
    page.login('username', 'password')
    page.verifyPageLoaded()
  })
})

// Run the generated test suite
// npx cypress run --spec "cypress/e2e/ExampleComLoginPage.cy.ts"

📚 详细文档

依赖项

  • @modelcontextprotocol/sdk:MCP 服务器实现。
  • puppeteer:网页抓取和页面渲染。
  • cheerio:HTML 解析和元素选择。
  • zod:模式验证。
  • typescript:类型安全。

错误处理

服务器包含全面的错误处理,用于处理以下情况:

  • 无效的 URL。
  • 网络连接问题。
  • 页面加载失败。
  • HTML 解析错误。

浏览器配置

服务器使用 Puppeteer 并采用以下设置:

  • 服务器环境的无头模式。
  • 容器化部署的无沙箱模式。
  • 等待网络空闲以处理动态内容。

🤝 贡献指南

若要添加对新元素类型、交互方法或测试模式的支持,请修改 main.ts 中的 generatePageObjectClassgenerateCypressTests 函数。

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端