使用protractor操作页面元素

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在定位元素时支持链式调用。

时间: 2024-12-20 01:00:27

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

WebDriver操作页面元素之单选按钮

在使用webdriver操作页面元素的时候经常会遇到一些单选按钮的情况,例如:注册时性别选择.单选按钮族中所有按钮共享同一个名称,所以浏览器知道将按钮组合在一起,通过选中其中一个按钮,其他按钮自动变为未选中状态. 示例代码: package com.seleniumdemo.webdriver; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.T

操作页面元素等待时间

WebDriver在操作页面元素等待时间,提供两种等待方式:一个为显示等待,另一个为隐式等待 区别:1)显示等待:明确告诉webDriver按照特定的条件进行等待,条件未达到,,就一直等待.这在等待某个元素需要非常长的时间时非常有效 2) 隐式等待:告诉webDriver一个最大的超时时间,如果等待条件在超时以前就满足,就立刻执行后续操作而无须等待超时达到 package test; import java.util.concurrent.TimeUnit; import org.openqa.

使用JavaScript操作页面元素

在webdriver脚本代码中执行JavaScript代码,来实现对页面元素的操作.此种方式主要用于解决在某些情况下,页面元素的.click()方法无法生效等问题. #!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : [email protected] """ #使用JavaScript操作页面元素 from selenium import

jQuery操作页面元素之包装元素

一:包装结点:指用指定HTML结构包装现有元素,被包装元素成为结构的子结点.就好像python中的装饰器. 1:wrap(): wrap方法用指定HTML结构包装结点,参数可以是HTML字符串.选择器或者jQuery对象.匹配多个结点时,分别包装各个结点. 2:wrapAll(): wrapAll方法将所有选中的结点包装在一个HTML结构中,参数可以是HTML字符串.选择器或者jQuery对象. 1 <!DOCTYPE html> 2 <html> 3 4 <head>

juery学习总结(二)——juery操作页面元素

所有的操作都可以分为增.删.改.查四种,juery选择器代表查看的功能,那么剩下的操作就是对页面元素增.删.改.页面元素有3部分构成:标签,属性和内容,juery对元素的操作可以从这3方面入手. 一.juery对标签的操作 新建元素 1 //js创建元素 2 var ele_div = document.createElement("<div>") 3 //元素属性 4 //ele_div.setAttribute("id","demo&quo

Selenium操作页面元素

转自:http://blog.sina.com.cn/s/blog_6966650401012a7q.html 一.输入框(text field or textarea) //找到输入框元素: WebElement element = driver.findElement(By.id("passwd-id")); //将输入框清空: element.clear(); //在输入框中输入内容: element.sendKeys(“test”); //获取输入框的文本内容: element

webdriver高级应用-使用JavaScript操作页面元素

Webdriver搞不定的,需要用js,无需引入有关js的包就可用 在WebDriver脚本代码中执行JavaScript代码,来实现对页面元素的操作.此方法主要用于解决在某些情况下,页面元素的.click()方法无法生效等问题. #encoding=utf-8 from selenium import webdriver from selenium.common.exceptions import WebDriverException import unittest import traceb

jQuery操作页面元素之元素插入

1:jQuery提供的append().prepend().appendTo().prependTo().after().before().insertAfter()和insertBefore()等方法可以向文档中插入结点. 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="uft-8"> 6 <title>插入结点</title> 7 <scrip

纯css实现二级导航菜单效果,通过简单的鼠标事件操作页面元素样式变换实现二级导航菜单的功能,非常简单实用,

HTML代码如下 <!-- 头部导航栏开始--><div id="nav"><dl class="sy"><dt><a class="first" href="#" >首页</a></dt><dd class="line">|</dd><dd class="triangle"