使用实习生,我有以下目录结构:
/intern
/tests
globals.js
pageElements.js
/functional
/site1
site1test1.js
/site2
site2test1.js
/page_objects
loginPage.js
我想要做的是将常用函数存储在page_objects目录中,用于各种页面,例如loginPage.js,并在实际测试中调用这些函数,例如site1test1.js等。我已经尝试了很多种方法,最新的基于此处发布的解决方案:Use helper modules for repeated, ordered tasks when functional testing in intern。通过这种方法,我发现" TypeError:对象#没有方法' setFindTimeout'"。我对实习生来说很新,对node.js来说很新,所以请原谅我的无知。我只想获得有关最佳方法的信息。
site1test1.js看起来像这样:
define([
'intern!object',
'intern/chai!assert',
'require',
'intern',
'intern/dojo/node!../globals.js',
'intern/dojo/node!./page_objects/loginPage.js'
], function (registerSuite, assert, require, intern, globals, loginPage) {
registerSuite({
name: 'index',
'login': function () {
var current_env = intern.config.environment;
var user = globals.getData(current_env).USER1;
var url = globals.getData(current_env).url;
return this.remote
.get(url)
.then(loginPage.login(user, globals.PASSWORD));
}
});
});
我的loginPage.js目前看起来像这样:
var pageElements = require('../../pageElements');
var globals = require('../../globals')
module.exports = {
login: function(email, password) {
return new this.constructor(this.session)
.setFindTimeout(globals.TIMEOUT)
.findById(pageElements.TEXTFIELD_ID_EMAIL)
.click()
.clearValue()
.type(email)
.end()
.findById(pageElements.TEXTFIELD_ID_PASSWORD)
.click()
.clearValue()
.type(password)
.end()
.findById(pageElements.BUTTON_ID_LOGIN)
.click()
.end()
}
};
答案 0 :(得分:0)
我能够通过AMD化loginPage模块解决问题,如下所示:
define([
'intern!object',
'intern/chai!assert',
'require',
'intern',
'../../globals.js',
'../../pageElements.js'
], function (loginPage,
assert,
require,
intern,
globals,
pageElements) {
var loginPage = {
login : function (email, password) {
return this
.setFindTimeout(globals.TIMEOUT)
.findById(pageElements.TEXTFIELD_ID_EMAIL).click()
.clearValue()
.type(email)
.end()
.findById(pageElements.TEXTFIELD_ID_PASSWORD).click()
.clearValue()
.type(password)
.end()
.findById(pageElements.BUTTON_ID_LOGIN).click()
.end()
}
};
return loginPage;
});
然后我可以在site1test1.js中调用它,如下所示:
return this.remote
.get(url)
.then(function(){ return loginPage.login.call(this, user, globals.PASSWORD); });
答案 1 :(得分:0)
我能够按照以下方式工作。 (根据tera_incognita的回答)
site1test1.js:
define([
'intern!object',
'intern/chai!assert',
'intern/dojo/node!leadfoot/Command',
'intern/dojo/node!leadfoot/lib/util',
'require',
'intern',
'../page_objects/loginPage.js'
], function (registerSuite, assert, Command, util, require, intern, loginPage) {
registerSuite({
name: 'index',
'login': function () {
var session = this.remote;
var command = new Command(session);
var current_env = intern.config.environment;
var user = 'john_appleseed@apple.com';
var url = 'http://localhost/hello.html';
return command
.get(url)
.then(function(){ return loginPage.login(session, user, 'password1');});
}
});
});
loginPage.js:
define([
'intern!object',
'intern/chai!assert',
'require',
'intern'
], function (loginPage,
assert,
require,
intern) {
var loginPage = {
login : function (session, email, password) {
return session
.findById('email').click()
.clearValue()
.type(email)
.end()
.findById('password').click()
.clearValue()
.type(password)
.end()
.findById('login').click()
.end()
}
};
return loginPage;
});
hello.html的:
<html>
Hello!
<form>
Email:<input id="email" type='text' name="email"><br>
Password: <input id="password" type='text' name="password"><br>
<input id="login" type="submit" value="Log in">
</form>
</html>
答案 2 :(得分:0)
以下是我如何使用ES6(typescript)中的胖箭头函数来减少输入效果。
return this.remote
.then( () => { login(this.remote, 'admin', 'password'); })