使用protractor操作页面元素

时间:2021-11-18 09:12:56

Protractor是为Angular JS应用量身打造的端到端测试框架。它可以真实的驱动浏览器,自动完成对web应用的测试。Protractor驱动浏览器使用的是WebDriver标准,所以使用起来与其他语言实现的WebDriver库大体相同。当然,我说大体相同那肯定还是有不同的地方。一旦不注意这些不同的地方就会坑到你(我就被成功坑过,所以才有了这篇文章)。

Protractor编写测试的核心是查找DOM元素,与其交互,然后查看交互后的状态与你的期望是否一致。所以查找DOM元素并与之交互显的非常重要。Protractor提供了一个全局函数element,其接受一个Locator对象并返回一个ElementFinder对象。该函数会返回单个元素。如果你想返回多个元素,可以使用element.all函数,其接受一个Locator对象并返回ElementArrayFinder对象。ElementFinder对象有一组方法,用于元素交互,比如click(),getText(),sendKeys等。

Locator对象的创建主要使用全局的by对象,其提供一些API来生成Locator对象以供element或element.all函数使用。

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//根据class名来查找元素
by.css(‘myclass') //根据id来查找元素
by.id(‘myid') //根据ng-model名来查找元素
by.model(’name') //查找绑定了指定名的元素
by.binding(‘bindingname') //查找指定repeater中的元素
by.repeater(‘myrepeater')

可以看出前两个Locator的创建方法与其他语言实现的WebDriver的用法基本一样,而后几个则专为AngularJS应用设计的,方便在基于AngualrJS框架下写的web应用中查找页面元素。这是第一处不同。

另一处不同其他语言实现的WebDriver库使用Locator找到的元素类型是WebElement,而Protractor则返回的是ElementFinder对象。两者不同之处是在于ElementFinder对象不会立即与浏览器交互,根据指定的Locator来查找到页面上的元素;而只有当你调用了ElementFinder对象的方法时,它才会真正的与浏览器进行交互。一些常用的方法有以下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//这时不会与浏览器交互获取元素信息
var el = element(by.css(‘mycss’)); //点击元素
el.click(); //给该元素输入内容
el.sendKeys(’text’); //清空元素内内容
el.clear(); //获取指定属性的值
el.getAttribute(‘value’); //获取元素的文本值
el.getText();

请注意这些方法都是异步的。所有的方法返回的是一个promise(我就吃过这个亏,以为返回的是值)。所以比如你想输出一个元素的值,应该这么写:

1
2
3
element(by.css(‘myclass’)).getText().then(function(text) {
console.log(text);
}):

如果你使用expect方法来验证元素的值时,expect方法会帮你取出promise中值,所以你只用这么写:

1
expect(element(by.css(‘myclass’)).getText()).toEqual('确定’);

还有不同的地方在于Protractor支持对元素查找时进行链式调用。这样的功能相当实用。你可以组合element和element.all两个函数来定位元素。并且Protractor还提供了几个辅助方法来更方便你的使用。

1
2
3
element.all(locator1).first().element(locator2);
element(locator1).all(locator2);
element.all(locator1).get(index).all(locator2);

element.all函数提供的辅助方法有:

  • filter: 提供一个过滤器过滤其中的元素。
1
2
3
4
5
element.all(by.css(‘myclass’)).filter(function(ele, index) {
return ele.getText().then(function(text) {
return text == ‘确定';
});
});
  • get: 根据索引获取指定元素。如 element.all(by.css(‘myclass’)).get(0);

  • first: 获取第一个元素。 element.all(by.css(’myclass’)).first();

  • last: 获取最后一个元素,用法同上。

  • count:获取元素个数。

此外还提供了each,map,reduce等方法对列表进行各种操作。

element函数提供的辅助方法有:

  • locator: 返回locator对象。

  • getWebElement: 返回该ElementFinder包裹的WebElement对象。

  • all: 查找其一组子元素。

  • element: 查找其子元素。

  • isPresent: 元素是否在页面上展示。

总结起来,Protractor与其它的WebDriver语言实现的区别如下:

  1. Protractor专为AngualrJS应用定制,其自身包含了很多wait操作,保证AngularJS脚本执行完毕后才进行下一步操作,保证了测试的稳定性与健壮性。

  2. Protractor设计的By对象针对AngularJS应用提供了很多实用方法,在定义AngularJS应用页面时更加轻松。

  3. element函数返回的是ElementFinder对象,其不会立即与浏览器交互,除非调用ElementFinder对象的方法。

  4. 调用ElementFinder对象的方法返回的是一个promise。(这点很重要)

  5. Protractor在定位元素时支持链式调用。

使用protractor操作页面元素的更多相关文章

  1. 使用javaScript操作页面元素

    from selenium import webdriver import time import unittest from selenium.common.exceptions import We ...

  2. selenium常用命令--操作页面元素及获取元素内容整理

    selenium常用命令之操作页面元素及获取元素内容的事件整理 例子:  /**id <input type="text" id="phone" name ...

  3. Selenium with Python 005 - 调用js操作页面元素

    WebDriver提供了execute_script()方法来执行JavaScript方法,格式如 driver.execute_script(script,*args) 执行js一般有两种场景,一是 ...

  4. &lbrack;Selenium&rsqb; 操作页面元素等待时间

    WebDriver 在操作页面元素等待时间时,提供2种等待方式:一个为显式等待,一个为隐式等待,其区别在于: 1)显式等待:明确地告诉 WebDriver 按照特定的条件进行等待,条件未达到就一直等待 ...

  5. F12修改html进行本地js操作页面元素

    F12修改html进行本地js操作页面元素

  6. Java&amp&semi;Selenium调用JS实现高亮被操作页面元素高亮

    Java&Selenium调用JS实现高亮被操作页面元素高亮 /* * the method of invoking js to do something * * @author daviey ...

  7. 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变

    查看本章节 查看作业目录 需求说明: 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变 当用户单击"+&quot ...

  8. 使用 jQuery 操作页面元素的方法,实现浏览大图片的效果,在页面上插入一幅小图片,当鼠标悬停到小图片上时,在小图片的右侧出现与之相对应的大图片

    查看本章节 查看作业目录 需求说明: 使用 jQuery 操作页面元素的方法,实现浏览大图片的效果,在页面上插入一幅小图片,当鼠标悬停到小图片上时,在小图片的右侧出现与之相对应的大图片 实现思路: 在 ...

  9. juery学习总结&lpar;二&rpar;——juery操作页面元素

    所有的操作都可以分为增.删.改.查四种,juery选择器代表查看的功能,那么剩下的操作就是对页面元素增.删.改.页面元素有3部分构成:标签,属性和内容,juery对元素的操作可以从这3方面入手. 一. ...

随机推荐

  1. ajax&plus;div 代替iframe 学习尝试

    工作的时候遇到了所谓html内多tab展示的情况,主要是通过iframe来关联子页面: 不过也不知道从何时开始记得是说iframe不建议多用,所以想想,还是找找有没有其他方法(不应用于工作): 先说下 ...

  2. 编程风格(Coding Style)要求

    编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份 ...

  3. Swift中UITableView的简单使用

    Swift中的注释 使用"// MARK:- 注释内容",对属性或方法进行注释 使用"///注释内容"对属性或方法提供调用说明的注释 使用extension对同 ...

  4. Spring Date Jpa on update current&lowbar;timestamp 自动维护创建时间和更新时间

    在数据库里设置默认值current_timestamp可以维护创建时间,设置on update current_timestamp 可以维护更新时间.在JPA中应该如何去做呢?这里还是以上篇Topic ...

  5. 如何用Python在豆瓣中获取自己喜欢的TOP N电影信息

    一.什么是 Python Python (蟒蛇)是一门简单易学. 优雅健壮. 功能强大. 面向对象的解释型脚本语言.具有 20+ 年发展历史, 成熟稳定. 具有丰富和强大的类库支持日常应用. 1989 ...

  6. &lbrack;Python Study Notes&rsqb;Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  7. K3 WISE 开发插件《K3 WISE常用数据表整理》

    在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单. ----------------系统设置------------------------ FStatu ...

  8. k8s简单的来部署一下tomcat,并测试自愈功能

    前言: 2018年12月6日 今天终于把k8s运行tomcat打通了,耗了我几天时间一个一个坑踩过来,不容易啊,废话不多说. 先记录一些操作时的错误: <<<<<< ...

  9. nodejs&plus;express的(前端跨域请求)

    1.后端代码 var dp = 456; var back = 'callback(\{\dp\ : \ ' + dp + '\ }\)'; res.send(back); 2.前端代码 <sc ...

  10. 1&period; Socket网络编程

    1. 借助服务器实现小写转大写的程序: 客户端:发送任意小写字母到服务器端. 服务器端:接收小写字母,转为大写,回传给客户端,然后客户端显示到屏幕. #include <stdio.h> ...