如何在Selenium或WebdriverIO中获取系统级Chrome窗口及对应标签页

核心原因
Selenium和WebdriverIO原生的getWindowHandles/getAllWindowHandles设计上就是返回标签页级别的句柄,和操作系统层面的可视化窗口不是同一概念,所以无法直接用原生方法区分不同系统窗口的归属。
可行解决方案(WebdriverIO可用)
通过调用Chrome DevTools Protocol (CDP) 接口实现,CDP的Target域提供的browserWindowId字段会标记每个标签页所属的系统级Chrome窗口ID,同个窗口下的所有标签页该字段值完全一致。
具体实现逻辑:
- 调用CDP的
Target.getTargets接口获取所有浏览器目标 - 筛选出类型为
page的目标(即普通标签页) - 按
browserWindowId字段对标签页分组,即可得到每个系统窗口对应的标签页列表,以及每个窗口的标签页数量
示例代码:
// 获取所有浏览器目标 const allTargets = await browser.callCDP('Target.getTargets') // 筛选出普通标签页目标 const pageTargets = allTargets.targetInfos.filter(target => target.type === 'page') // 按系统窗口ID分组 const windowTabMap = {} pageTargets.forEach(target => { const windowId = target.browserWindowId if (!windowTabMap[windowId]) { windowTabMap[windowId] = [] } windowTabMap[windowId].push(target) }) // 遍历输出结果 for (const [windowId, tabs] of Object.entries(windowTabMap)) { console.log(`系统窗口ID:${windowId},包含标签页数量:${tabs.length}`) tabs.forEach(tab => { console.log(`- 标签页标题:${tab.title},标签页句柄:${tab.targetId}`) }) }
补充说明
- 该方案要求Chrome版本≥80,同时对应ChromeDriver版本匹配即可
- 如果需要获取系统窗口的位置、大小、最大化状态等OS层面属性,可以搭配对应系统的UI自动化工具实现,比如Windows端的Win32 API、macOS端的AppleScript、Linux端的X11工具链
内容的提问来源于stack exchange,提问作者ElixirBolt
相关产品推荐
相关产品推荐

