我将测试分为3个组件。主页面对象页面,有问题的页面主页和测试本身。
我希望Page
扩展module.exports = new Page()
个对象。但是我发现 - 如果在Page类中我使用:
ERROR: Class extends value #<Page> is not a function or null
我收到错误module.exports = Page
然而,如果我使用
HomePage
效果很好。
有人可以解释一下为什么会这样吗?是因为Page对象本身只是构造成每个页面的父节点,例如, LoginPage
或class Page {
constructor() {
this.title = 'My Page';
}
open(path) {
browser.url('/' + path);
}
}
module.exports = Page;
或其他任何网页?
var Page = require('../page-models/Page');
class HomePage extends Page {
get username() { return browser.element('#username'); }
open() {
super.open('');
}
}
module.exports = new HomePage();
==
var HomePage = require('../page-models/home.page');
describe('Something great', function(){
it('tests this', function(){
HomePage.open();
...
==测试本身
dumpbin /exports Test.dll
任何帮助表示赞赏。 附:使用nodejs,webdriverio,mocha和chai。
答案 0 :(得分:3)
当你写:
var Page = require('../page-models/Page');
变量Page
是您从&#39; ../ page-models / Page&#39;与module.exports
。如果您导出new Page()
对象,那么您的变量Page
将是您使用Page
创建的new
类的实例,而不是类本身。你不能extend
一个实例。此外,require()
会缓存它的结果,因此您始终可以获得相同的对象。
正如您使用module.exports = Page
一样,您可以导出该类,而任何人require
- 可以自由地创建他们认为合适的实例。
我知道你没有问过,但要考虑的一件事是与你的班级建立一个统一的界面。如果要导出Page
类并要求用户实例化或扩展该类,则应考虑对Homepage
执行相同操作。也许你可能想做类似的事情:
var Homepage = require('../page-models/home.');
class MobileHomePage extends Homepage {
//...
}
使用new HomePage()
导出实例时,您无法做到这一点。这意味着您需要在测试中使用以下内容创建实例:
var HomePageClass = require('../page-models/home.page');
var Homepage = new HomePageClass()
更冗长,但也使您的模块更加灵活。