如何使用实习生测试框架正确设计页面对象
How to correctly design page objects using theintern testing framework
我正在使用实习生框架创建功能测试。我想使用"页面对象"对我的测试进行建模,因为我希望代码是可重用的。
在原始文档中,有一个非常简化的示例,演示如何使用一个名为"login"的方法创建页面对象。
在此示例中,此方法的所有逻辑都在方法本身内部。
该对象表示比登录页面稍微复杂的页面,并能够重用页面内的组件以进行不同的操作。
这是我想做的一个例子:
// in tests/support/pages/IndexPage.js
define(function (require) {
// the page object is created as a constructor
// so we can provide the remote Command object
// at runtime
function IndexPage(remote) {
this.remote = remote;
}
function enterUsername(username) {
return this.remote
.findById('login').click().type(username).end();
}
function enterPassword(pass) {
return this.remote
.findById('password').click().type(pass).end();
}
IndexPage.prototype = {
constructor: IndexPage,
// the login function accepts username and password
// and returns a promise that resolves to `true` on
// success or rejects with an error on failure
login: function (username, password) {
return this
.enterUsername(username)
.enterPassword(password)
.findById('loginButton')
.click()
.end()
// then, we verify the success of the action by
// looking for a login success marker on the page
.setFindTimeout(5000)
.findById('loginSuccess')
.then(function () {
// if it succeeds, resolve to `true`; otherwise
// allow the error from whichever previous
// operation failed to reject the final promise
return true;
});
},
// …additional page interaction tasks…
};
return IndexPage;
});
请注意我是如何创建enterUsername
和enterPassword
方法的。
这是因为我想在同一页面对象的其他测试中重用这些方法。这样做的问题是我无法链接这些方法,它不起作用。
可以链接的方法都返回Command
对象,但是当我链接我的方法时,它们没有在Command
方法上定义,因此调用第一个方法(在我的示例中这是enterUsername
),但随后第二个失败,显然是因为enterPassword
没有在Command
对象上定义。
我想知道如何对页面对象进行建模,以便我可以在页面对象中重用部分代码,但仍然具有像这样流畅的语法。
提前致谢:)
最简单的
解决方案是将方法用作then
回调处理程序,例如:
function enterName(username) {
return function () {
return this.parent.findById('login').click().type(username);
}
}
function enterPassword(password) {
return function () {
return this.parent.findById('password').click().type(pass).end();
}
}
IndexPage.prototype = {
constructor: IndexPage,
login: function (username, password) {
return this.remote
.then(enterUsername(username))
.then(enterPassword(password))
.findById('loginButton')
// ...
}
}
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何使用json将对象列表从java转换为javascript
- 序列化数据属性中对象的最可靠方法
- 如何访问声音管理器2创建的声音对象
- FabricJs-限制主对象内添加对象的移动区域
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 值对象在某个变量发生更改后发生更改
- 如何为json对象中的段发送array[]
- 面对的问题,而追加下拉对象与字符串在Jquery