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语言实现的区别如下:
Protractor专为AngualrJS应用定制,其自身包含了很多wait操作,保证AngularJS脚本执行完毕后才进行下一步操作,保证了测试的稳定性与健壮性。
Protractor设计的By对象针对AngularJS应用提供了很多实用方法,在定义AngularJS应用页面时更加轻松。
element函数返回的是ElementFinder对象,其不会立即与浏览器交互,除非调用ElementFinder对象的方法。
调用ElementFinder对象的方法返回的是一个promise。(这点很重要)
Protractor在定位元素时支持链式调用。
本文转自:
http://www.fwqtg.net/%E4%BD%BF%E7%94%A8protractor%E6%93%8D%E4%BD%9C%E9%A1%B5%E9%9D%A2%E5%85%83%E7%B4%A0.html
分享到:
相关推荐
3. **避免回调地狱**:Protractor 使用了 Promises,这使得处理异步操作变得更加简洁,避免了传统的回调函数嵌套,提高了代码可读性。 4. **与 Selenium WebDriver 集成**:Protractor 基于 Selenium WebDriver,...
6. **元素定位**:Protractor提供多种方式定位页面元素,如`element(by.model())`、`element(by.css())`等,方便测试操作。 7. **数据驱动测试**:利用`jasmine-data-provider`库,可以实现数据驱动测试,将一组...
4. **页面对象(Page Objects)**:这是Protractor的最佳实践,用于封装页面元素和它们的交互方式。这样可以提高代码的可维护性,因为如果页面布局发生变化,只需要更新页面对象即可。 5. **配置文件...
3. **页面对象模式**:这是一种最佳实践,将页面元素和与其相关的操作封装在单独的模块中,提高代码的可维护性和可读性。在项目中,可能有多个`.page.js`文件,每个代表应用的一个页面。 4. **WebdriverJS**:...
元素定位是Selenium自动化测试的基础,通过各种定位策略找到页面上的元素,然后执行相应的操作。常见的定位策略包括: - **ID**:使用元素的id属性进行定位。 - **Name**:使用元素的name属性进行定位。 - **Class ...
为了全面了解和使用这个项目,你需要熟悉JavaScript编程,包括DOM操作和事件处理,以及Protractor的基本用法,如元素定位、断言和测试套件的组织。同时,你可能还需要安装和配置Node.js环境,因为Protractor是基于...
4. **页面对象模式**:这是一种推荐的编码风格,将页面的元素和操作封装为独立的类,提高代码可读性和维护性。 5. **使用`npm install`**:在克隆项目后,`npm install`命令会解析package.json文件,下载并安装所有...
7. **元素定位**: 使用CSS选择器、XPath或其他方法找到页面上的特定元素,然后执行操作或断言,例如`browser.element(by.css('.className'))`或`element(by.model('expression'))`。 8. **期望式断言**: Protractor...
- **ElementFinder 和 By**:在 Protractor 中,我们可以使用 `ElementFinder` 来查找页面上的元素,配合 `By` 函数,可以基于各种策略(如 ID、CSS 选择器等)来定位元素。 - **ExpectedConditions**:这个模块...
3. **页面对象模型(Page Object Model)**:为了提高代码复用性和可维护性,项目可能会采用Page Object模式,将页面元素和与之相关的操作封装在单独的类中。 4. **安装依赖**:`package.json`文件会列出项目所需的...
5. **测试框架**:Protractor自身就是一个测试框架,它提供了丰富的API来编写测试用例,如`expect()`用于断言,`browser.get()`用于导航,`element()`用于定位页面元素等。此外,它还支持Page Object模式,这是一种...
2. **定位元素**:使用 CSS 选择器、XPath 或 AngularJS 特定的选择器找到页面上的元素。 3. **交互**:模拟用户行为,如点击、输入文本、导航等。 4. **断言**:验证预期的结果是否与实际相符,例如检查元素的文本...
5. 验证结果:通过检查页面元素或响应状态码来验证测试结果。 6. 关闭浏览器:测试完成后,记得关闭浏览器实例,如`driver.quit();` 五、Selenium的高级特性 1. Page Object模式:一种设计模式,将页面的元素和操作...
- **页面对象模型(Page Object Model)**:一种设计模式,用于封装页面元素和交互逻辑,使测试代码更易于维护和扩展。 - **断言库**:如JUnit(Java)、pytest(Python),用于验证预期结果与实际结果是否相符。 ...
5. **ElementFinder 和 Locator**: Protractor 提供 ElementFinder 对象来查找和操作页面上的元素。通过 Locator(如 CSS 选择器、XPath、NgModel 等)定位元素,然后可以执行点击、输入等操作。ElementArrayFinder ...
10. **测试**:AngularJS支持单元测试和端到端测试,通过`ngMock`和Protractor等工具,确保代码质量并易于维护。 在"angular-16.2.9"这个目录下,你可能会找到以下文件和子目录: - `app`: 应用的主要模块和配置。...
在Protractor中,测试API提供了丰富的功能,如定位页面元素、模拟用户输入、断言等,使得测试脚本能精确地模拟用户操作。例如,你可以使用`browser.get()`导航到指定URL,使用`element(by.css())`选择器找到页面上的...
1. 将测试组织为Page Object模式,将页面元素和交互逻辑封装在单独的对象中,提高代码复用性和可维护性。 2. 使用describe()和it()语句创建测试套件和测试用例,保持清晰的层次结构。 四、异步控制 1. 理解并熟练...
3. **元素定位**:Protractor提供了多种方式来查找页面元素,如by.model()(根据AngularJS的ng-model绑定),by.css()(CSS选择器),by.repeater()(用于表格或列表),by.buttonText()等。 4. **测试控制**:可以...
1. **页面元素的定位**:Protractor提供了丰富的选择器,如CSS选择器、模型绑定选择器等,用于准确地找到页面上的元素进行操作和验证。 2. **用户交互模拟**:我们可以使用Protractor编写脚本来模拟用户的行为,如...