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

贵族冲浪者

我最近受命为我公司开发的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.DEFAULT_TIMEOUT_INTERVAL指定的超时内未调用异步回调。堆栈:错误:超时-未在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时内调用异步回调。在onTimeout(timers.js:386:11)在tryOnTimeout(timers.js:250:5)在Timer.listOnTimeout(timers.js:214:5)消息:失败:元素不可见(会话信息:chrome = 61.0。 3163.100)(驱动程序信息:chromedriver = 2.33.506120(e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform = Windows NT 10.0.15063 x86_64)堆栈:...

和:

2)应用程序应导航到``图表''页面消息:失败:元素不可见(会话信息:chrome = 61.0.3163.100)(驱动程序信息:chromedriver = 2.33.506120(e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform = 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元素以获取它们?

马修·托马斯

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

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

量角器

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

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

绑定-通过文本绑定查找元素。

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

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

buttonText-通过文本查找按钮。

partialButtonText-通过局部文本查找按钮。

中继器-在ng-repeat中查找元素。

precisionRepeater-通过精确中继器查找元素。

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

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

deepCss-通过Shadow DOM中的CSS选择器查找元素。

扩展webdriver.By

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

CSS -找到使用CSS选择器要素。

ID -找到通过其ID的元件。

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

js-通过评估JavaScript表达式(可以是函数或字符串)来查找元素。

名字-找到的元素,其name属性具有给定值。

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

tagName-查找具有给定标签名称的元素。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用量角器测试angularjs应用

无法使用量角器测试运行器加载应用

使用量角器进行滑块测试

使用量角器测试链接颜色

使用量角器进行性能测试

如何使用量角器测试生成Jhipster应用

使用量角器执行异步脚本的 AngularJS 测试

可以使用量角器测试淘汰赛应用程序吗?

在 AngularJS 中使用量角器拖放

使用量角器“期望”

使用量角器测试angularjs应用程序,当数组随着使用它而变化时,如何保持对element.all行之一的引用?

使用量角器进行e2e测试angularjs(量角器交互模式制动器)

在AngularJS应用中使用量角器将文件上传到文件选择器

在phantomjs中使用量角器运行angularjs e2e测试时出现问题

在Visual Studio 2015中使用量角器测试ASP.NET Core应用

如何使用量角器测试使用getSize()函数比较元素的宽度和高度?

如何使用量角器测试检查元素是否可单击

如何使用量角器测试元素是否具有类?

如何获取引导警报消息的文本以使用量角器进行测试

如何在Angular 2中使用量角器测试ngx-toastr

如何使用量角器测试日期选择器?

如何使用量角器访问SVG元素

如何使用量角器选择组件元素?

如何使用量角器将角度应用程序外部的元素定位?

如何使用量角器获取当前网址?

如何使用量角器获取当前网址?

如何在非angularjs网站上使用量角器?

如何在日食中使用量角器?

如何使用量角器测试角材料拖放