mcpField
P
protractor-skill

protractor-skill

github.com/lambdatest测试与质量384200 次安装2 周前更新
代码仓库

关于 protractor-skill

面向维护旧版 Protractor 测试套件的团队,介绍 Protractor 浏览器测试编写与运行。内容涵盖 Angular 定位器、页面对象、云端执行及迁移到 Playwright;Protractor 已于 2023 年停止维护。

主要功能

  1. 01Angular 专用定位器模式
  2. 02页面对象示例
  3. 03Protractor 配置指南
  4. 04TestMu AI 云端执行
  5. 05Playwright 迁移对照

适用场景

  1. 01维护旧版 Protractor 测试
  2. 02定位 Angular 页面元素
  3. 03在 TestMu AI 上运行测试
  4. 04规划迁移到 Playwright

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lambdatest/agent-skills --skill protractor-skill

安装后在 Claude Code 中输入/protractor-skill确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

reference/
advanced-patterns.md
cloud-integration.md
playbook.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);
  }
};
迁移指南
ProtractorPlaywright
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