Selenium切换iframe后getPageSource返回空白HTML,无法定位子iframe
问题分析与解决方案
核心问题点
- ID不匹配:页面里的iframe ID是
iframe01和iframe02,但你的代码里用的是iframe1和iframe2,这直接导致后续定位元素失败,切换后的iframe也不是目标对象。 - 未等待iframe加载:切换iframe后,内部页面(page2.html)还没加载完成就获取pageSource,自然得到空body;后续定位iframe02时,页面还没渲染出该元素,所以找不到。
- HTML拼写错误:你的示例HTML里把
<body>写成了<doby>,如果实际页面也是如此,浏览器解析会出问题,iframe无法正常加载内容。
修正后的代码
// 初始化等待器,设置10秒超时 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 等待iframe01可用并直接切换进去,无需单独定位 wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("iframe01"))); // 此时page2.html已加载,可正常获取源码 String test1 = driver.getPageSource(); // 继续等待iframe02可用并切换 wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("iframe02"))); // 获取page3.html的源码 String test2 = driver.getPageSource(); // 若需回到外层主页面,执行以下代码 driver.switchTo().defaultContent();
额外说明
frameToBeAvailableAndSwitchToIt方法会自动等待iframe加载完成并完成切换,比先定位元素再切换的方式更稳定。- 如果iframe内的元素是动态渲染的,可额外添加等待逻辑,比如等待iframe内某个关键元素可见:
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("某个内部元素ID"))); - 务必修正实际页面中的
<body>拼写错误,否则浏览器无法正确解析页面结构,iframe加载会异常。
内容的提问来源于stack exchange,提问作者Eduardo Moritz
相关产品推荐
相关产品推荐

