无法从引用项目访问Page Object Models问题求助
问题描述
我有一个web.testing.dependent项目,需要引用web.testing.referenced项目中的Page Object Models(页面对象模型)。该引用项目已打包发布到本地注册表,并作为依赖项添加到依赖项目中。在Nightwatch测试中可以导入并访问页面对象模型的元素,但执行测试时出现报错。
引用项目配置详情:
- Nightwatch版本:3.3
- 包含
tsconfig.json、nightwatch.conf.js配置文件
场景说明:
- 依赖项目本身已有部分页面对象,希望复用引用项目中可供多项目共享的页面对象
- 尝试过使用简单原生JS类封装驱动函数,问题仍未解决
解决指导
1. 核对页面对象的导出与导入
确保引用项目的页面对象采用正确的导出方式,TypeScript示例:
// web.testing.referenced 中的页面对象 export default class LoginPage { get usernameInput() { return this.element('#username'); } }
依赖项目中导入时,直接使用包名+路径(无需相对路径),如:
import LoginPage from 'web.testing.referenced/pages/LoginPage';
2. 同步TypeScript编译配置
两个项目的tsconfig.json需保持兼容:
- 依赖项目
compilerOptions中,moduleResolution设为NodeNext/Node16,确保npm包模块解析正常 - 开启
allowSyntheticDefaultImports: true,适配默认导出的导入逻辑 - 引用项目需设置
declaration: true,生成.d.ts类型文件,避免依赖项目类型报错
3. 调整Nightwatch配置加载外部页面对象
在依赖项目的nightwatch.conf.js中,将引用项目的页面对象路径加入page_objects_path:
module.exports = { src_folders: ['tests'], page_objects_path: [ './pages', // 本地页面对象目录 './node_modules/web.testing.referenced/pages' // 外部依赖的页面对象目录 ], typescript: { tsconfig_path: './tsconfig.json', auto_compile: true } // 其他配置项... }
4. 确保页面对象绑定Nightwatch上下文
Nightwatch页面对象需要绑定浏览器实例,避免手动实例化导致上下文丢失:
// 测试用例中正确调用外部页面对象 module.exports = { '登录测试': async function (browser) { // 通过browser.page()方法实例化,自动绑定上下文 const loginPage = browser.page('web.testing.referenced/pages/LoginPage')(); await loginPage.navigate(); await loginPage.setValue('@usernameInput', 'test_user'); } }
如果是自定义JS驱动类,需在构造函数中传入浏览器实例:
class AuthDriver { constructor(browser) { this.browser = browser; } async login(username) { const loginPage = this.browser.page('web.testing.referenced/pages/LoginPage')(); await loginPage.navigate(); await loginPage.setValue('@usernameInput', username); } }
5. 检查依赖包的打包完整性
确认引用项目的package.json配置正确,指向打包后的文件:
{ "main": "dist/index.js", "types": "dist/index.d.ts", "files": ["dist"] }
使用打包工具(如tsup、rollup)时,需保留类结构与导出逻辑,避免过度压缩导致Nightwatch无法识别页面对象。
内容的提问来源于stack exchange,提问作者jrao
相关产品推荐
相关产品推荐

