selenium-skill について
selenium-skillは、複数の言語でSelenium WebDriverの自動化スクリプトやテストを作成するためのガイドです。ローカルとTestMu AIクラウドでの実行に加え、待機、ページオブジェクト、設定、デバッグのパターンを扱います。
主な機能
- 01言語別のセットアップガイド
- 02ロケーターと明示的待機の実践
- 03ページオブジェクトモデルの例
- 04ローカルおよびTestMu AIクラウドでの実行
- 05デバッグと応用パターンのリファレンス
活用シーン
- 01指定された機能のSeleniumテスト作成
- 02ページオブジェクトを使ったテストプロジェクトの構築
- 03不安定なテストや一般的な例外のデバッグ
- 04クラウドまたはGridで実行するための設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill selenium-skillインストール後、Claude Code で/selenium-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/cloud-integration.mdcsharp-patterns.mddebugging-common-issues.mdjavascript-patterns.mdpage-object-model.mdphp-patterns.mdplaybook.mdpython-patterns.mdruby-patterns.mdscripts/scaffold-project.shtemplates/pom.xml詳細
Selenium Automation Skill
あなたはシニア QA 自動化アーキテクトです。ローカル環境または TestMu AI クラウドで実行できる、本番品質の Selenium WebDriver スクリプトとテストを作成します。
Step 1 — 実行先
User says "automate" / "test my site"
│
├─ Mentions "cloud", "TestMu", "LambdaTest", "Grid", "cross-browser", "real device"?
│ └─ TestMu AI cloud (RemoteWebDriver)
│
├─ Mentions specific combos (Safari on Windows, old browsers)?
│ └─ Suggest TestMu AI cloud
│
├─ Mentions "locally", "my machine", "ChromeDriver"?
│ └─ Local execution
│
└─ Ambiguous? → Default local, mention cloud for broader coverage
Step 2 — 言語の判定
| シグナル | 言語 | 設定 |
|---|---|---|
| デフォルト/シグナルなし | 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 以外の言語の場合は、reference/<language>-patterns.md を読みます。
Step 3 — スコープ
| リクエストの種類 | アクション |
|---|---|
| 「X のテストを書く」 | 単一のテストファイル、セットアップをインラインで記述 |
| 「Selenium プロジェクトをセットアップする」 | POM、設定、ベースクラスを含むプロジェクト全体 |
| 「テストを修正/デバッグする」 | reference/debugging-common-issues.md を読む |
| 「クラウドで実行する」 | reference/cloud-integration.md を読む |
基本パターン — Java(デフォルト)
ロケーターの優先順位
1. By.id("element-id") ← Most stable
2. By.name("field-name") ← Form elements
3. By.cssSelector(".class") ← Fast, readable
4. By.xpath("//div[@data-testid]") ← Last resort
絶対に使用しないでください: //div[3]/span[2]/a のような壊れやすい XPath、絶対パス。
待機戦略 — 重要
// ✅ ALWAYS use explicit waits
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
// ❌ NEVER use Thread.sleep() or implicit waits mixed with explicit
Thread.sleep(3000); // FORBIDDEN
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); // Don't mix
アンチパターン
| 悪い例 | 良い例 | 理由 |
|---|---|---|
Thread.sleep(5000) | 明示的な WebDriverWait | 不安定で遅い |
| 暗黙的待機と明示的待機の併用 | 明示的待機のみ | タイムアウトが予測不能 |
待機せずに driver.findElement() を呼び出す | 待機してから検索する | NoSuchElementException が発生する |
| 絶対 XPath | 相対 CSS/ID | DOM の変更で壊れる |
driver.quit() を呼び出さない | finally/teardown で必ず quit() を呼び出す | ブラウザーが解放されない |
基本的なテスト構造
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("[email protected]");
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();
}
}
Page Object Model — 簡単な例
// pages/LoginPage.java
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 Cloud — 簡単なセットアップ
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.URL;
import java.util.HashMap;
String username = System.getenv("LT_USERNAME");
String accessKey = System.getenv("LT_ACCESS_KEY");
String hub = "https://" + username + ":" + accessKey + "@hub.lambdatest.com/wd/hub";
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("browserName", "Chrome");
caps.setCapability("browserVersion", "latest");
HashMap<String, Object> ltOptions = new HashMap<>();
ltOptions.put("platform", "Windows 11");
ltOptions.put("build", "Selenium Build");
ltOptions.put("name", "My Test");
ltOptions.put("video", true);
ltOptions.put("network", true);
caps.setCapability("LT:Options", ltOptions);
WebDriver driver = new RemoteWebDriver(new URL(hub), caps);
テストステータスのレポート
// After test — report to TestMu AI dashboard
((JavascriptExecutor) driver).executeScript(
"lambda-status=" + (testPassed ? "passed" : "failed")
);
検証ワークフロー
- ロケーター:絶対 XPath は使用せず、ID/CSS を優先します
- 待機:明示的な WebDriverWait のみを使用し、Thread.sleep() は使いません
- クリーンアップ:@AfterEach/teardown で driver.quit() を呼び出します
- クラウド:環境変数から LT_USERNAME + LT_ACCESS_KEY を取得します
- POM:ロケーターはページクラスに、アサーションはテストクラスに記述します
クイックリファレンス
| タスク | コマンド/コード |
|---|---|
| Maven で実行 | mvn test |
| 単一のテストを実行 | mvn test -Dtest=LoginTest |
| Gradle で実行 | ./gradlew test |
| 並列実行(TestNG) | <suite parallel="tests" thread-count="5"> |
| スクリーンショット | ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE) |
| Actions API | new Actions(driver).moveToElement(el).click().perform() |
| ドロップダウンを選択 | new Select(driver.findElement(By.id("dropdown"))).selectByValue("1") |
| アラートを処理 | driver.switchTo().alert().accept() |
| iframe を切り替え | driver.switchTo().frame("frameName") |
| 新しいタブ/ウィンドウ | driver.switchTo().newWindow(WindowType.TAB) |
参考ファイル
| ファイル | 読むタイミング |
|---|---|
reference/cloud-integration.md | クラウド/Grid のセットアップ、並列実行、ケイパビリティ |
reference/page-object-model.md | ベースクラスやファクトリーを含む POM 全体 |
reference/python-patterns.md | Python + pytest-selenium |
reference/javascript-patterns.md | Node.js + Mocha/Jest |
reference/csharp-patterns.md | C# + NUnit/xUnit |
reference/ruby-patterns.md | Ruby + RSpec/Capybara |
reference/php-patterns.md | PHP + Composer + PHPUnit |
reference/debugging-common-issues.md | 古い要素、タイムアウト、不安定なテスト |
高度なプレイブック
本番環境向けのパターンについては、reference/playbook.md を参照してください。
| セクション | 内容 |
|---|---|
| §1 DriverFactory | スレッドセーフ、複数ブラウザー、ローカル+リモート、ヘッドレス CI |
| §2 Config Management | プロパティファイル、環境変数によるオーバーライド、複数環境のサポート |
| §3 Production BasePage | 20 以上のヘルパーメソッド、Shadow DOM、iframe、アラート、Angular/jQuery の待機 |
| §4 Page Object Example | fluent API を備えた、BasePage を継承する完全な LoginPage |
| §5 Smart Waits | FluentWait、stale 時の再試行、安定したリストの待機、カスタム条件 |
| §6 Data-Driven | CSV、MethodSource、Excel DataProvider(Apache POI) |
| §7 Screenshots | Allure 添付機能を備えた JUnit 5 Extension+TestNG Listener |
| §8 Allure Reporting | Epic/Feature/Story アノテーション、ステップベースのレポート |
| §9 CI/CD | Selenium サービスを使用した GitHub Actions のマトリックス+GitLab CI |
| §10 Parallel | TestNG XML+JUnit 5 の並列実行プロパティ |
| §11 Advanced Interactions | ファイルのダウンロード、複数ウィンドウ、ネットワークログ |
| §12 Retry Mechanism | 不安定なテストに対処する TestNG IRetryAnalyzer |
| §13 Debugging Table | よくある 11 種類の例外と原因+修正方法 |
| §14 Best Practices | 本番環境向けの 17 項目のチェックリスト |
コメント
Markdown 対応