【问题标题】:Testing tab navigation order测试标签导航顺序
【发布时间】:2015-03-05 04:14:58
【问题描述】:

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

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


目前我们正在通过对表单中存在的尽可能多的输入字段重复以下步骤来解决这个问题(代码如下):

  • 检查当前焦点元素的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 是一个页面对象:

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;

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

如果当前的方法是您也将采用的方法,我将不胜感激有关使其可重用的任何见解。

【问题讨论】:

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


    【解决方案1】:

    我认为 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()”方法。 (这对我来说似乎是一个合理的假设,但某些环境可能不支持它。)

    我认为这可以很好地隔离 PageObject 上的选项卡顺序(因此它很容易与页面内容保持同步,并且不会在验证顺序的代码中丢失)。测试代码看起来“乐观”(我怀疑现实世界会引入足够多的问题,您最终会稍微扩展此代码)。

    我还没有尝试过任何这些,所以如果这不起作用,请随意投反对票。 :)

    另外,我相信forEach 循环会按原样工作,但如果它需要一些更明确的承诺处理来明确依赖关系,我不会感到惊讶。

    【讨论】:

    • 更清洁,绝对可重复使用,谢谢!我仍然需要在实践中尝试一下——如果它不能按原样工作,我会编辑答案。但是,再一次,看起来很棒!
    • 按原样工作。我已将 testTabOrder 添加到我的辅助测试库中,它在测试中看起来非常干净。这周我们会更加感谢你:)
    • 2.1.0(从 1.7.0 升级)对 Protractor 进行了一些更改,显然必须使用 browser.driver.switchTo().activeElement().then(...),也就是 activeElement 调用现在基于 Promise。
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多