代码之家  ›  专栏  ›  技术社区  ›  Noble-Surfer

使用量角器测试AngularJS应用程序-如何在不使用ID的情况下获取HTML元素?

  •  2
  • Noble-Surfer  · 技术社区  · 8 年前

    我最近的任务是为我的公司开发的AngularJS应用程序实现一些自动化测试。在对可用的不同测试框架进行了一些研究之后,我决定使用 Protractor 因为它似乎提供了我们需要的所有功能,并且似乎有很好的文档记录;保持。

    当我开始设计时;在编写测试时,我注意到代码中的大多数HTML元素都没有被赋予ID属性,所以我开始将ID属性分配给测试中使用的各种元素,这样我就可以使用如下函数访问它们: element(by.id('abc')); 将它们分配给变量,以便在测试脚本中使用。

    然而,我刚刚得知,为了使源代码更容易压缩以分发给我们的客户,不提供HTML元素ID属性是一种深思熟虑的设计选择。这意味着我现在需要重新编写测试,这样它们就不再使用ID属性来获取元素,但我不太确定如何做到这一点。。。

    当我在浏览器中检查这些菜单项时,它显示以下HTML结构:

    <ul id="nav" class="nav" data-slim-scroll ... >
        <li data-ng-mouseenter="setMenuTop($event)" ...
            <a href="#/pages" id="pagesMenuBtn" ... >
                ...
            <a href="#/alarms" id="alarmsMenuBtn" ... >
                ...
            ...
        </li>
        ...
    </ul>
    

    目标是能够删除 id 属性,但仍然能够访问这些HTML元素以对其运行测试。

    例如,我之前有:

    describe('myApp', function() {
        var alarmsMenuBtn = element(by.id('alarmsMenuBtn'));
        var chartsMenuBtn = element(by.id('chartsMenuBtn'));
        ...
        it('should navigate to the Charts page', function(){
            browser.waitForAngularEnabled(false);
            browser.actions().mouseMove(chartsMenuBtn).perform();
            chartsMenuBtn.click();
            browser.waitForAngularEnabled(true);
            browser.call(closeDlg).then(function(){
                expect(browser.getCurrentUrl()).toBe('chartsURL');
        });
    

    我现在有:

    describe('myApp', function() {
        var menuItems = $(".slimScrollDiv").$(".nav").$$("li");
        var alarmsMenuBtn = menuItems.get(1).$("a");
        var chartsMenuBtn = menuItems.get(2).$("a");
    

    但是,当我用相同的测试运行它时,我的测试现在失败了,给了我如下消息:

    失败: 1) 应用程序应导航到报警页面 消息: 错误:超时-在jasmine指定的超时内未调用异步回调。默认的超时间隔。 堆栈: 错误:超时-在jasmine指定的超时内未调用异步回调。默认的超时间隔。 在ontimeout(timers.js:386:11) 在tryOnTimeout(timers.js:250:5) 定时。listOnTimeout(timers.js:214:5) 消息: 失败:元素不可见 (会话信息:chrome=61.0.3163.100) (驱动程序信息:chromedriver=2.33.506120(E3E5343736286C0BC2D2DC9AA4915BA81D9023F),平台=Windows NT 10.0.15063 x86_64) 堆栈: ...

    以及:

    消息: 失败:元素不可见 (会话信息:chrome=61.0.3163.100) (驱动程序信息:chromedriver=2.33.506120(E3E5343736286C0BC2D2DC9AA4915BA81D9023F),平台=Windows NT 10.0.15063 x86_64)

    这些元素的HTML是:

    <li><a href="#/alarms" id="alarmsMenuBtn" target="_self"><i class="ti-alert"></i><span data-i18n="Alarms"></span></a></li>
    <li><a href="#/charts" id="chartsMenuBtn" target="_self"><i class="ti-bar-chart"></i><span data-i18n="Charts"></span></a></li>
    

    所以我的问题是,我如何使用ID属性以外的东西来访问这些(或任何其他)HTML元素?

    2 回复  |  直到 8 年前
        1
  •  2
  •   MatthewThomas.dev    8 年前

    这个 Protractor API documentation 提供了一个完整的定位器列表,除了ID之外,您还可以使用这些定位器来定位DOM元素。该文档还提供了示例代码,以演示如何在实践中实现每个定位器。

    以下是量角器5.2.0版的完整列表:

    ProtractorBy

    量角器定位器。这些提供了通过绑定、模型等在角度应用中查找元素的方法。

    addLocator -将定位器添加到此GradutorBy实例。

    binding

    exactBinding -通过精确绑定查找元素。

    model -通过ng模型表达式查找元素。

    buttonText -按文本查找按钮。

    partialButtonText -按部分文本查找按钮。

    repeater -查找ng repeat中的元素。

    exactRepeater -通过精确转发器查找元素。

    cssContainingText -通过CSS查找包含特定字符串的元素。

    options -通过ng options表达式查找元素。

    deepCss -在阴影DOM中通过css选择器查找元素。

    扩展webdriver。通过

    className -查找具有特定类名的元素。

    css -使用CSS选择器查找元素。

    id -根据元素ID定位元素。

    linkText -查找其可见文本与给定字符串匹配的链接元素。

    js

    name -查找名称属性具有给定值的元素。

    partialLinkText -查找其可见文本包含给定子字符串的链接元素。

    tagName -定位具有给定标记名的元素。

    xpath -查找与XPath选择器匹配的元素。

        2
  •  -1
  •   Khazi Afzal    8 年前

    跟随id是个坏主意。。请使用 data-test-hooks ... 你们已经有了关于量角器的文档。 http://www.protractortest.org/#/api