selenium-skill: Enabling AI to Write End-to-End Tests According to the Selenium WebDriver Specification

前言

很多存量项目仍用 Selenium WebDriver 做浏览器自动化,而对话式编码助手近年更常默认输出 Playwright 示例。团队若要保持 Maven/JUnit、pytest、NUnit 等既有栈,需要反复纠正定位方式、等待策略和项目结构。selenium-skill 是面向 Agent 的专用 Skill:在用户提到 Selenium、WebDriver、Grid 或跨浏览器测试时,引导模型生成可本地或云端执行的 WebDriver 脚本,并约束常见反模式。

这是什么

selenium-skill 来自 LambdaTest/agent-skills 仓库中的 selenium-skill 目录,采用通用 SKILL.md 格式;元数据标明作者为 TestMu AI,版本 1.0,许可证 MIT,分类为 e2e-testing。

官方描述概括为:生成生产级 Selenium WebDriver 自动化脚本与测试,支持 Java、Python、JavaScript、C#、Ruby、PHP;可在本机执行,也可对接 TestMu AI 云(资料中写明支持 3000+ 浏览器/操作系统组合)。触发词包括 Selenium、WebDriver、RemoteWebDriver、ChromeDriver、GeckoDriver、Selenium Grid、cross-browser、TestMu、LambdaTest 等。

核心功能

执行目标分流

Skill 要求先判断运行环境,再写代码:

  • 用户提到 cloud、TestMu、LambdaTest、Grid、cross-browser、真机等 → 走 TestMu AI 云(RemoteWebDriver)。
  • 需要特殊组合(如 Windows 上的 Safari、旧版浏览器)→ 建议云环境。
  • 用户强调 locally、本机、ChromeDriver → 本地执行。
  • 意图不清时默认本地,并提示云侧可扩大覆盖。

语言与工程约定

信号 语言 配置
默认 / 无明确信号 Java Maven + JUnit 5
Python、pytest、.py Python pip + pytest
JavaScript、Node、.js JavaScript npm + Mocha/Jest
C#、.NET、NUnit C# NuGet + NUnit
Ruby、.rb、RSpec Ruby gem + RSpec
PHP、Codeception PHP Composer + PHPUnit

非 Java 语言时,Skill 指向阅读 reference/<language>-patterns.md。

请求范围

请求类型 行为
为某功能写测试 单测文件,内联 setup
搭建 Selenium 项目 完整工程(含 POM、配置、基类)
修复/调试测试 阅读 reference/debugging-common-issues.md
云上运行 阅读 reference/cloud-integration.md

Java 默认模式(摘录)

定位优先级:id → name → cssSelector → 相对 XPath;禁止脆弱绝对 XPath(如 //div[3]/span[2]/a)。

等待:必须使用显式 WebDriverWait;禁止 Thread.sleep(),且不要混用隐式等待与显式等待。

反模式对照(官方表格要点):无等待的 findElement 易抛 NoSuchElementException;测试结束须在 teardown 中 driver.quit()。

校验清单:定位符、仅显式等待、清理浏览器、云凭证环境变量、POM 中放定位与页面操作、测试中放断言。

参考文档

Skill 内嵌多份 reference,按需引用:

文件 用途
reference/cloud-integration.md 云/Grid、并行、capabilities
reference/page-object-model.md 完整 POM、基类、工厂
reference/python-patterns.md 等 各语言惯用写法
reference/debugging-common-issues.md 陈旧元素、超时、不稳定用例

安装与启用

已抓取资料未给出 Cursor、Codex CLI、Claude Code 的统一安装命令或配置字段。实际使用时,将仓库中 selenium-skill 目录按你所用 Agent 产品的 Skill 加载方式接入即可;具体路径与启用步骤以 官方目录 及对应产品文档为准。

典型用法

本地 Java + JUnit 5 登录流

下面示例来自 Skill 正文,展示显式等待与 teardown:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.junit.jupiter.api.*;
import java.time.Duration;

public class LoginTest {
    private WebDriver driver;
    private WebDriverWait wait;

    @BeforeEach
    void setUp() {
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        driver.manage().window().maximize();
    }

    @Test
    void testLogin() {
        driver.get("https://example.com/login");
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")))
            .sendKeys("user@test.com");
        driver.findElement(By.id("password")).sendKeys("password123");
        driver.findElement(By.cssSelector("button[type='submit']")).click();
        wait.until(ExpectedConditions.urlContains("/dashboard"));
        Assertions.assertTrue(driver.getTitle().contains("Dashboard"));
    }

    @AfterEach
    void tearDown() {
        if (driver != null) driver.quit();
    }
}

本地 Java 工程常用 mvn test 或 mvn test -Dtest=LoginTest 执行(Skill Quick Reference)。

Page Object 片段

页面类集中维护定位符,测试类负责断言:

public class LoginPage {
    private WebDriver driver;
    private WebDriverWait wait;
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton  = By.cssSelector("button[type='submit']");

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    }

    public void login(String username, String password) {
        wait.until(ExpectedConditions.visibilityOfElementLocated(usernameField))
            .sendKeys(username);
        driver.findElement(passwordField).sendKeys(password);
        driver.findElement(submitButton).click();
    }
}

TestMu AI 云(RemoteWebDriver)

云侧 Hub 使用环境变量 LT_USERNAME、LT_ACCESS_KEY,地址形如 https://{username}:{accessKey}@hub.lambdatest.com/wd/hub。capabilities 中通过 LT:Options 设置 platform、build、name、video、network 等;测试结束后可通过 lambda-status 脚本上报 passed/failed。完整并行与能力项见 reference/cloud-integration.md。

适用场景与注意

适合:维护 Selenium 技术栈的 Legacy 工程;需要 Grid/跨浏览器/云真机矩阵;希望 AI 输出与团队规范一致的 WebDriver 代码(等待、POM、清理)。

注意:Skill 默认 Java;其他语言依赖仓库内 reference,需保证 Agent 能读取这些文件。云执行依赖有效 LambdaTest/TestMu 账号与环境变量,资料未包含定价或配额说明。截断资料中 Advanced Playbook 未完整展示,深度生产实践仍以仓库内完整 SKILL.md 与 reference 为准。

结尾

selenium-skill 把「选本地还是云、选哪种语言栈、单测还是整包工程」写成固定决策树,并把 WebDriver 等待与定位约束写进生成流程,减少 Playwright 范式误用到 Selenium 项目的情况。官方地址:https://github.com/LambdaTest/agent-skills/tree/main/selenium-skill

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye