如何使用Selenium Java读取Chrome Viewer中PDF渲染的aspx文档内容
解决Selenium Java获取动态PDF内容的方案
针对你遇到的动态URL页面、embed标签src为空但能下载PDF的场景,提供两种实用的Selenium Java实现方案:
方法一:拦截网络请求获取PDF原始内容
因为页面的PDF是通过后续网络请求加载的,我们可以利用Chrome DevTools监听网络响应,直接捕获返回PDF的请求并提取内容:
import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v120.network.Network; import java.io.FileOutputStream; import java.io.IOException; import java.util.Optional; public class PdfNetworkExtractor { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "你的chromedriver路径"); ChromeDriver driver = new ChromeDriver(); DevTools devTools = driver.getDevTools(); devTools.createSession(); // 启用网络监听 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 监听响应,筛选PDF类型的请求 devTools.addListener(Network.responseReceived(), response -> { String mimeType = response.getResponse().getMimeType(); if ("application/pdf".equals(mimeType)) { String requestId = response.getRequestId(); // 获取响应体字节流 Network.GetResponseBodyResponse bodyResp = devTools.send(Network.getResponseBody(requestId)); byte[] pdfBytes = bodyResp.getBody().getBytes(); // 保存PDF到本地(也可直接处理字节内容) try (FileOutputStream fos = new FileOutputStream("captured.pdf")) { fos.write(pdfBytes); } catch (IOException e) { e.printStackTrace(); } } }); // 执行点击按钮操作,触发新标签页打开 driver.findElement(By.id("你的按钮ID")).click(); // 等待请求完成(建议替换为WebDriverWait显式等待,更稳定) try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } driver.quit(); } }
方法二:调用Chrome打印API导出PDF
利用Chrome自带的打印功能,直接将Viewer页面导出为PDF,无需关心动态URL:
import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v120.page.Page; import java.io.FileOutputStream; import java.util.Base64; import java.util.Optional; import java.util.concurrent.TimeUnit; public class PdfPrintExtractor { public static void main(String[] args) { ChromeOptions options = new ChromeOptions(); // 可选:无头模式运行,避免弹出浏览器窗口 options.addArguments("--headless=new"); options.addArguments("--disable-gpu"); System.setProperty("webdriver.chrome.driver", "你的chromedriver路径"); ChromeDriver driver = new ChromeDriver(options); DevTools devTools = driver.getDevTools(); devTools.createSession(); // 点击按钮打开新标签页 driver.findElement(By.id("你的按钮ID")).click(); // 切换到新打开的标签页 driver.switchTo().window(driver.getWindowHandles().stream().skip(1).findFirst().get()); // 等待页面加载完成 driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); // 调用打印API生成PDF(参数可按需调整) Page.PrintToPDFResponse pdfResp = devTools.send(Page.printToPDF( Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(true), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty() )); // 解码Base64内容并保存 byte[] pdfBytes = Base64.getDecoder().decode(pdfResp.getData()); try (FileOutputStream fos = new FileOutputStream("printed.pdf")) { fos.write(pdfBytes); } catch (Exception e) { e.printStackTrace(); } driver.quit(); } }
注意事项
- 确保ChromeDriver版本与本地Chrome浏览器版本完全匹配,否则DevTools功能会失效
- 建议将
Thread.sleep替换为WebDriverWait显式等待,根据页面元素或网络状态判断加载完成时机 - 两种方法都会自动继承当前会话的登录Cookie,无需额外处理权限问题
内容的提问来源于stack exchange,提问作者Bhavya S
相关产品推荐
相关产品推荐

