我遵循基于page object pattern for use with WebDriver JS的自动化代码。该教程调用了一个页面对象,它看起来像下面的内容,使用Object.create()来创建一个扩展一个简单的Page对象的对象 - 但是他们的示例并没有涵盖具有引用{{的函数的内容。 1}}来自创建的对象内部。我尝试在属性配置中以几种不同的方式更改对象参数this
和get
,并且到目前为止还没有注意到差异。
page.js:
value
login.page.js:
"use strict";
function Page() {
}
Page.prototype.open = function(path) {
browser.url('/' + path);
};
Page.prototype.getUrl = function() {
return browser.getUrl();
};
module.exports = new Page();
test.spec.js
"use strict";
var Page = require('./page');
var LoginPage = Object.create(Page, {
email: { value: 'input#email' } ,
password: { value: 'input#password' } ,
loginButton: { value: 'button#login-button' },
errorText: { value: 'span.help-block' },
loginErrorMessage: { value: 'These credentials do not match our records.' },
open: { value: function() {
Page.open('login');
}},
loginAsTestUser: { value: function() {
this.open();
browser.logger.info('Logging in');
this.login('test@dev.com', 'test');
}},
login: { value: function(email, password) {
browser.element(this.email).setValue(email);
browser.element(this.password).setValue(password);
browser.element(this.loginButton).click();
}}
});
module.exports = LoginPage;
这是"use strict";
var LoginPage = require('../pages/login.page.js');
var Header = require('../pages/header.page.js');
describe('Navigation bar', function() {
before('open login page', LoginPage.open);
it('should be visible', function() {
browser.isVisibleWithinViewport(Header.navbar).should.be.true;
});
describe('when logged in', function() {
before('login', LoginPage.loginAsTestUser);
it('should have the Add dropdown list displayed', function() {
browser.isVisibleWithinViewport(Header.addDropdownButton).should.be.true;
});
after('logout', Header.logout);
});
});
的错误:
this.open
当1) Navigation bar when logged in "before all" hook:
this.open is not a function
running chrome
TypeError: this.open is not a function
at Context.<anonymous> (/code/tests/test/pages/login.page.js:20:18)
at Promise.F (/code/tests/node_modules/core-js/library/modules/_export.js:35:28)
替换为其功能以使代码进展时,this.open();
也会出现错误:
this.login();
我想我可以看到1) Navigation bar when logged in "before all" hook:
this.login is not a function
running chrome
TypeError: this.login is not a function
at Context.<anonymous> (/code/tests/test/pages/login.page.js:24:18)
at Promise.F (/code/tests/node_modules/core-js/library/modules/_export.js:35:28)
在传递给this
的属性配置对象中没有多大意义,但我不确定你是怎么做的 - {{{ 3}}甚至没有引用以这种方式工作的例子。
编辑:这与建议的重复问题不同:documentation for Object.defineProperties - 我正在讨论在创建对象时引用对象的变量属性,因为变量是相互构建的。建议的副本通常与Object.create
讨论JavaScript范围问题 - 这个特定的问题更加集中,更多的是关于如何在完全创建该对象之前使用该对象的其他属性构建对象的属性。