protractor-skill について
既存の Protractor テストを保守するチーム向けに、ブラウザテストの作成と実行方法をまとめたスキルです。Angular のロケーター、ページオブジェクト、クラウド実行、Playwright への移行を扱います。Protractor は 2023 年にサポート終了しています。
主な機能
- 01Angular 専用ロケーターパターン
- 02ページオブジェクトの例
- 03Protractor 設定ガイド
- 04TestMu AI でのクラウド実行
- 05Playwright 移行対応表
活用シーン
- 01既存 Protractor テストの保守
- 02Angular ページ要素の特定
- 03TestMu AI でのテスト実行
- 04Playwright への移行計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill protractor-skillインストール後、Claude Code で/protractor-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/advanced-patterns.mdcloud-integration.mdplaybook.md詳細
Protractor 自動化スキル(非推奨)
Protractor は 2023 年にサポートを終了しました。 Angular チームは Playwright または Cypress を推奨しています。
TestMu AI クラウド実行については、reference/cloud-integration.md と shared/testmu-cloud-reference.md を参照してください。
コアパターン
基本的なテスト
describe('Login', () => {
beforeEach(async () => {
await browser.get('/login');
});
it('should login with valid credentials', async () => {
await element(by.model('email')).sendKeys('[email protected]');
await element(by.model('password')).sendKeys('password123');
await element(by.css('button[type="submit"]')).click();
expect(await browser.getCurrentUrl()).toContain('/dashboard');
expect(await element(by.css('.welcome')).getText()).toContain('Welcome');
});
it('should show error for invalid credentials', async () => {
await element(by.model('email')).sendKeys('[email protected]');
await element(by.model('password')).sendKeys('wrong');
await element(by.css('button[type="submit"]')).click();
expect(await element(by.css('.error')).isDisplayed()).toBe(true);
});
});
Angular 固有のロケーター
element(by.model('ctrl.email')); // ng-model
element(by.binding('ctrl.username')); // Angular binding
element(by.exactBinding('ctrl.name')); // Exact binding
element(by.repeater('item in items')); // ng-repeat
element.all(by.repeater('item in items')).count(); // Count repeater
element(by.cssContainingText('.item', 'Active')); // CSS + text
element(by.buttonText('Submit')); // Button text
element(by.partialButtonText('Sub')); // Partial text
ページオブジェクト
class LoginPage {
constructor() {
this.emailInput = element(by.model('email'));
this.passwordInput = element(by.model('password'));
this.loginButton = element(by.css('button[type="submit"]'));
this.errorMessage = element(by.css('.error'));
}
async login(email, password) {
await this.emailInput.sendKeys(email);
await this.passwordInput.sendKeys(password);
await this.loginButton.click();
}
}
// Usage
const loginPage = new LoginPage();
await loginPage.login('[email protected]', 'password123');
protractor.conf.js
exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['specs/**/*.spec.js'],
capabilities: { browserName: 'chrome' },
jasmineNodeOpts: { defaultTimeoutInterval: 30000 },
onPrepare: () => {
browser.waitForAngularEnabled(true);
}
};
移行ガイド
| Protractor | Playwright |
|---|---|
element(by.model('x')) | page.locator('[ng-model="x"]') |
element(by.css('#id')) | page.locator('#id') |
browser.get(url) | page.goto(url) |
element.sendKeys(text) | locator.fill(text) |
browser.sleep(ms) | page.waitForTimeout(ms) |
browser.waitForAngular() | 不要(自動待機) |
TestMu AI でのクラウド実行
環境変数を設定します:LT_USERNAME、LT_ACCESS_KEY
// conf.js
exports.config = {
seleniumAddress: `https://${process.env.LT_USERNAME}:${process.env.LT_ACCESS_KEY}@hub.lambdatest.com/wd/hub`,
capabilities: {
browserName: 'chrome',
'LT:Options': {
user: process.env.LT_USERNAME,
accessKey: process.env.LT_ACCESS_KEY,
build: 'Protractor Build',
name: 'Protractor Test',
platformName: 'Windows 11',
video: true,
console: true,
network: true,
},
},
};
実行:npx protractor conf.js(非推奨。代わりに Playwright/Cypress を使用してください)
詳細なパターン
高度なパターン、デバッグガイド、CI/CD 統合、ベストプラクティスについては、
reference/playbook.md を参照してください。
コメント
Markdown 対応