如何将Nightwatch的windowHandles方法Promise化?
如何Promise化Nightwatch的windowHandles方法
问题描述
我尝试在页面对象中Promise化Nightwatch的windowHandles方法。通常可以通过回调语法获取窗口句柄:
this.api.windowHandles(result => result)
但我希望在回调外部访问结果,于是编写了如下代码:
const promisifyCallback = (fn) => new Promise(resolve => fn(result => resolve(result))); const handles = await promisifyCallback(this.api.windowHandles)
该方式对getAttribute等其他Nightwatch函数有效,但此处却抛出错误:
TypeError: Cannot read properties of undefined (reading 'isES6Async')
解决方法
问题根源
这个错误是因为windowHandles方法的上下文(this)丢失了。当你把this.api.windowHandles作为参数传递给promisifyCallback时,它不再绑定到this.api对象上,导致方法内部执行时无法访问到isES6Async属性。
可行方案
方案1:绑定方法上下文
将windowHandles方法的上下文绑定到this.api后再传入封装函数:
const promisifyCallback = (fn) => new Promise(resolve => fn(result => resolve(result))); const handles = await promisifyCallback(this.api.windowHandles.bind(this.api));
方案2:手动封装Promise(保留上下文)
直接封装windowHandles为Promise,确保方法执行时的上下文正确:
const getWindowHandles = () => { return new Promise((resolve) => { this.api.windowHandles((result) => { resolve(result); }); }); }; const handles = await getWindowHandles();
方案3:使用Nightwatch内置Promise支持(推荐)
Nightwatch v1及以上版本原生支持Promise化API调用,无需手动封装,直接执行:
const handles = await this.api.windowHandles();
这种方式简洁且不会出现上下文问题,是最优解。
内容的提问来源于stack exchange,提问作者DannyMoshe
相关产品推荐
相关产品推荐

