You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:05:10