测试选项卡导航顺序

时间:2015-02-27 23:17:43

标签: javascript testing selenium protractor end-to-end

在我们的一个测试中,我们需要确保表单内的选项卡键盘导航以正确的顺序执行。

问题:使用量角器检查标签导航顺序的常规方法是什么?


目前我们正在通过对表单中存在的许多输入字段(下面的代码)重复以下步骤来解决它:

  • 检查当前关注元素的ID(使用getId()
  • TAB键发送到当前关注的元素

以下是示例规范:

it("should navigate with tab correctly", function () {
    var regCodePage = new RegCodePage();
    browser.wait(protractor.ExpectedConditions.visibilityOf(regCodePage.title), 10000);

    // registration code field has focus by default
    expect(regCodePage.registrationCode.getId()).toEqual(browser.driver.switchTo().activeElement().getId());

    // focus moved to Remember Registration Code
    regCodePage.registrationCode.sendKeys(protractor.Key.TAB);
    expect(regCodePage.rememberRegistrationCode.getId()).toEqual(browser.driver.switchTo().activeElement().getId());

    // focus moved to Request Code
    regCodePage.rememberRegistrationCode.sendKeys(protractor.Key.TAB);
    expect(regCodePage.requestCode.getId()).toEqual(browser.driver.switchTo().activeElement().getId());

    // focus moved to Cancel
    regCodePage.requestCode.sendKeys(protractor.Key.TAB);
    expect(regCodePage.cancelButton.getId()).toEqual(browser.driver.switchTo().activeElement().getId());

    // focus moved back to the input
    regCodePage.cancelButton.sendKeys(protractor.Key.TAB);
    expect(regCodePage.registrationCode.getId()).toEqual(browser.driver.switchTo().activeElement().getId());
});

其中regCodePage是Page Object:

var RegCodePage = function () {
    this.title = element(by.css("div.modal-header b.login-modal-title"));
    this.registrationCode = element(by.id("regCode"));

    this.rememberRegistrationCode = element(by.id("rememberRegCode"));
    this.requestCode = element(by.id("forgotCode"));

    this.errorMessage = element(by.css("div.auth-reg-code-block div#message"));

    this.sendRegCode = element(by.id("sendRegCode"));
    this.cancelButton = element(by.id("cancelButton"));
    this.closeButton = element(by.css("div.modal-header button.close"));
};

module.exports = RegCodePage;

它正在工作,但它并不是真正的明确和可读性,这使得难以维护。另外,另一种气味"在当前的方法中是代码重复。

如果当前的方法也是如此,我会很感激有关使其可重复使用的任何见解。

1 个答案:

答案 0 :(得分:6)

我认为PageObject应该定义一个Tab键顺序列表,因为它实际上是页面的直接属性,应该可以表示为简单数据。一系列项目似乎是一个充分的表示,所以类似于:

this.tabOrder = [ this.registrationCode, this.rememberRegistrationCode, this.requestCode, this.cancelButton ];

然后你需要一些可以检查标签顺序的通用代码。

function testTabOrder(tabOrder) {
    // Assumes TAB order hasn't been messed with and page is on default element
    tabOrder.forEach(function(el) {
       expect(el.getId()).toEqual(browser.driver.switchTo().activeElement().getId());
       el.sendKeys(protractor.Key.TAB);
    });
}

然后你的测试会是这样的:

it('has correct tab order', function() {
    var regCodePage = new RegCodePage();  // this should probably be in the beforeEach
    testTabOrder(regCodePage.tabOrder);
});

当然,这假设每个元素都有一个" getId()"有效的方法。 (这对我来说似乎是一个合理的假设,但有些环境可能不支持它。)

我认为这样可以很好地将Tab键顺序隔离在PageObject上(因此很容易与页面内容保持同步,并且不会在验证顺序的代码中丢失)。测试代码看起来很乐观" (我怀疑现实世界会引入足够的问题,你最终会扩展这段代码)。

我还没有尝试过这一点,所以如果这不起作用,请随意投票。 :)

另外,我相信forEach循环将按原样运行,但如果需要更明确的承诺处理来使依赖项显式化,我不会感到惊讶。

相关问题