Karate 1.1.0中获取浏览器窗口句柄及切换窗口异常问题求助
我帮你搞定这个Karate 1.1.0里的窗口切换问题!你遇到的Target.getTargets异常,大概率是新窗口关闭后DevTools和Karate的状态不同步导致的,结合获取窗口句柄的正确姿势,咱们一步步解决:
第一步:提前保存原窗口的句柄(页面ID)
在点击打开新窗口的链接前,先把当前活跃窗口的页面ID存下来,这是后续切回的关键:
# 保存原窗口的页面ID * def originalPageId = driver.currentPageId
第二步:操作新窗口并等待其关闭
点击链接打开新窗口后,切换到新窗口完成操作,然后等待窗口自动关闭。这里可以用driver.switchPage('new')快速切换到最新打开的窗口,或者通过driver.pages获取所有窗口列表来定位:
# 点击打开新窗口的链接 * driver.click('//a[@id="your-new-window-link"]') # 切换到新窗口('new'关键字会自动定位到最新打开的窗口) * driver.switchPage('new') # 在新窗口执行你的业务操作,比如填写表单、提交等 * driver.input('//input[@name="username"]', 'test_user') * driver.click('//button[@id="submit-action"]') # 等待新窗口自动关闭,确保窗口已从页面列表中移除 * retry(5, 1000) driver.pages.length == 1
第三步:安全切回原窗口(解决异常的核心)
直接用之前保存的originalPageId切换回原窗口,同时添加重试机制——因为新窗口关闭后,DevTools的目标列表需要一点时间同步,直接切换可能会触发你遇到的通信异常,重试可以规避这种临时的状态不一致:
# 重试3次,每次间隔500ms,确保切换成功 * retry(3, 500) driver.switchPage(originalPageId) # 现在可以继续原窗口的后续操作了 * driver.click('//button[@id="continue-on-main-window"]')
为什么会出现那个异常?
当新窗口自动关闭后,Karate调用switchPage时会向Chrome DevTools发送Target.getTargets请求获取所有窗口,但此时DevTools可能还没完成已关闭窗口的状态清理,导致请求无法得到有效响应,抛出PolyglotException。添加重试和等待窗口列表更新的步骤,就能解决这个同步问题。
完整示例代码
Feature: 跨窗口UI自动化测试 Scenario: 操作新窗口后成功切回原窗口 Given driver = { type: 'chrome', target: 'chrome' } And driver.url('https://your-app-url.com') # 1. 保存原窗口ID * def originalPageId = driver.currentPageId # 2. 打开新窗口并操作 * driver.click('//a[@data-action="open-new-window"]') * driver.switchPage('new') * driver.input('//input[@id="form-email"]', 'test@example.com') * driver.click('//button[@id="submit-form"]') # 等待新窗口关闭,确认仅原窗口存在 * retry(5, 1000) driver.pages.length == 1 # 3. 切回原窗口(带重试规避异常) * retry(3, 500) driver.switchPage(originalPageId) # 继续原窗口操作 * assert driver.text('//h1') == '回到主页面' # 清理资源 * driver.quit()
内容的提问来源于stack exchange,提问作者Pankaj Bhambhani
相关产品推荐
相关产品推荐

