Nightwatch.js如何在所有测试步骤中复用Page Object变量
解决Nightwatch.js中Page Object实例复用的问题
我明白你现在的困扰——每个测试步骤都重复写var gmail = client.page.gmail()确实很繁琐,而且你尝试的几种抽离方法都踩了Nightwatch Page Object的一个核心坑:你混淆了Page Object的定义对象和初始化后的实例。
直接通过require('./../pages/gmail')拿到的只是Page Object的配置结构(包含commands、sections这些定义),而composeClick这类方法是Nightwatch在调用client.page.gmail()初始化实例时,动态挂载到实例上的——配置对象本身并没有这个方法,所以直接调用gmail.composeClick()肯定会抛出TypeError。
下面给你两个可行的解决方案:
方案1:用beforeEach钩子全局初始化实例
这是最简洁的方式,在测试文件的钩子中完成Page Object的初始化,并挂载到client对象上,所有测试步骤都能直接复用:
// 先引入Page Object的配置(注意:这里只是拿到配置,不是实例) const gmailPageConfig = require('./../pages/gmail'); module.exports = { // 每个测试步骤执行前初始化一次Page Object实例 beforeEach: function(client) { client.gmail = client.page.gmail(); }, '1st step': function (client) { // 直接通过client.gmail调用方法 client.gmail.composeClick(); }, '2d step': function (client) { client.gmail.composeClick(); }, // 可选:测试结束后关闭会话 afterEach: function(client) { client.end(); } };
方案2:封装一个获取实例的工具函数
如果不想修改client对象,可以封装一个简单的工厂函数,减少重复代码:
// 封装获取Gmail Page实例的函数 const getGmailPage = (client) => client.page.gmail(); module.exports = { '1st step': function (client) { const gmail = getGmailPage(client); gmail.composeClick(); }, '2d step': function (client) { const gmail = getGmailPage(client); gmail.composeClick(); } };
为什么之前的尝试失败?
- 直接在测试文件顶部require后调用:你拿到的是Page Object的配置对象,不是经过Nightwatch初始化的实例,
composeClick方法还不存在。 - 在globals.js中配置:globals的代码在测试环境初始化前就执行了,此时
client对象还未创建,根本无法生成有效的Page Object实例,自然也调用不了方法。
内容的提问来源于stack exchange,提问作者belatry
相关产品推荐
相关产品推荐

