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来完成。
先给你梳理正确的操作流程,再给修正后的代码:
核心逻辑说明
- 获取所有窗口句柄:
handles[0]是初始的标签页1,handles[1]是新打开的标签页2(注意你代码里的注释搞反了,这点要修正) - 切换到标签页2,再切回标签页1关闭它(因为
browser.close()只能关闭当前聚焦的窗口) - 重新切回标签页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
相关产品推荐
相关产品推荐

