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

Protractor测试切换标签页报错:ReferenceError: window is not defined求协助

解决Protractor切换标签页时的ReferenceError: window is not defined错误

那个ReferenceError: window is not defined的问题很明确:你在Node.js运行环境(Protractor的控制代码跑在这里)里直接调用了浏览器专属的window全局对象——Node环境根本没有这个东西,所有浏览器窗口的操作都得用Protractor提供的browser API来完成。

先给你梳理正确的操作流程,再给修正后的代码:

核心逻辑说明

  1. 获取所有窗口句柄:handles[0]是初始的标签页1,handles[1]是新打开的标签页2(注意你代码里的注释搞反了,这点要修正)
  2. 切换到标签页2,再切回标签页1关闭它(因为browser.close()只能关闭当前聚焦的窗口)
  3. 重新切回标签页2,执行后续操作

基于Promise链的修正代码

browser.getAllWindowHandles().then(function(handles) {
  const tab1Handle = handles[0]; // 初始标签页1
  const tab2Handle = handles[1]; // 新打开的标签页2

  // 先切换到标签页2
  return browser.switchTo().window(tab2Handle);
}).then(function() {
  // 切换回标签页1并关闭它
  return browser.switchTo().window(tab1Handle).then(function() {
    browser.close(); // 用browser.close()替代window.close(),这是关键!
  });
}).then(function() {
  // 重新切换回标签页2,确保焦点正确
  return browser.switchTo().window(tab2Handle);
}).then(function() {
  // 如果标签页2是非Angular页面,需要禁用Angular等待
  browser.waitForAngularEnabled(false);

  // 在这里执行标签页2的操作,比如点击元素、断言
  element(by.id('your-target-element')).click();
  // 示例断言:验证页面标题
  expect(browser.getTitle()).toEqual('目标页面标题');

  // 如果后续还要操作Angular页面,记得重新开启等待
  browser.waitForAngularEnabled(true);
});

更简洁的async/await版本(推荐,可读性更高)

如果你的Protractor版本支持ES6+语法,用async/await会更清晰:

async function switchAndOperateTabs() {
  const handles = await browser.getAllWindowHandles();
  const tab1Handle = handles[0];
  const tab2Handle = handles[1];

  // 切换到标签页2
  await browser.switchTo().window(tab2Handle);

  // 切回标签页1并关闭
  await browser.switchTo().window(tab1Handle);
  await browser.close();

  // 重新切回标签页2
  await browser.switchTo().window(tab2Handle);

  // 处理非Angular页面的情况
  await browser.waitForAngularEnabled(false);

  // 执行标签页2的操作
  await element(by.css('.target-class')).sendKeys('测试内容');
  await expect(element(by.css('.result')).getText()).toBe('预期结果');

  await browser.waitForAngularEnabled(true);
}

关键注意点

  • 绝对不要直接用window.close()、window.open()这类浏览器端API,所有窗口操作都通过browser对象完成
  • 如果新标签页打开的是非Angular页面,一定要调用browser.waitForAngularEnabled(false),否则Protractor会一直等待Angular加载超时
  • 窗口句柄的顺序:通常第一个句柄是测试启动时的初始窗口,第二个是后续打开的新窗口,如果你不确定,可以通过browser.getTitle()来验证每个句柄对应的页面

内容的提问来源于stack exchange,提问作者Snake eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:49