使用UI自动化时能否获取端点响应?寻求替代karate.Intercept()提取Blob URL PDF文本方案
UI自动化中获取端点响应及Blob PDF文本提取方案
一、UI自动化中能否获取端点响应?
可以。主流UI自动化工具都支持通过浏览器DevTools API监听、拦截网络请求,直接获取请求的响应内容,包括状态码、响应头、响应体等。
以常用工具为例:
- Playwright:通过
page.on('response')事件监听所有响应,或用routeAPI精准拦截特定请求,直接提取响应体。 - Selenium:借助Chrome DevTools Protocol(CDP),通过
driver.execute_cdp_cmd()调用Network相关方法,拦截并获取目标请求的响应数据。
二、类似karate.Intercept()的响应获取及Blob URL PDF文本提取替代方案
核心思路
无需重定向,只需拦截PDF的原始请求、获取完整的二进制响应数据——因为Blob URL对应的PDF本质是服务器返回的二进制数据在浏览器本地的映射,拦截原始请求就能拿到PDF的完整数据,跳过Blob URL的处理环节,直接解析文本。
具体实现示例
1. Playwright(JavaScript)
拦截PDF请求,获取响应二进制数据后用pdf-parse提取文本:
const { chromium } = require('playwright'); const pdfParse = require('pdf-parse'); (async () => { const browser = await chromium.launch(); const page = await browser.newPage(); // 拦截目标PDF请求 await page.route('**/*.pdf', async (route) => { // 继续请求不重定向,获取原始响应 const response = await route.fetch(); // 读取二进制响应体 const pdfBuffer = await response.body(); // 解析PDF提取文本 const data = await pdfParse(pdfBuffer); console.log('PDF文本内容:', data.text); // 让页面正常加载Blob URL await route.continue(); }); await page.goto('你的目标页面URL'); await browser.close(); })();
2. Selenium(Python)
通过CDP拦截请求,获取PDF字节流后用PyPDF2提取文本:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from PyPDF2 import PdfReader import io import base64 options = Options() options.add_experimental_option("excludeSwitches", ["enable-logging"]) driver = webdriver.Chrome(options=options) # 启用网络监控 driver.execute_cdp_cmd('Network.enable', {}) # 设置请求拦截规则,仅拦截PDF driver.execute_cdp_cmd('Network.setRequestInterception', { 'patterns': [{'urlPattern': '**/*.pdf', 'interceptionStage': 'HeadersReceived'}] }) def handle_interception(request): # 放行请求并获取响应 driver.execute_cdp_cmd('Network.continueInterceptedRequest', {'interceptionId': request['interceptionId']}) # 获取响应体 response = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': request['requestId']}) # 处理二进制数据 if response['base64Encoded']: pdf_bytes = io.BytesIO(base64.b64decode(response['body'])) else: pdf_bytes = io.BytesIO(response['body']) # 解析PDF文本 reader = PdfReader(pdf_bytes) text = '\n'.join([page.extract_text() for page in reader.pages]) print('PDF文本内容:', text) # 绑定拦截事件处理函数 driver.add_cdp_listener('Network.requestIntercepted', handle_interception) driver.get('你的目标页面URL') driver.quit()
关键注意点
- 必须拦截服务器返回PDF的原始请求,而非Blob URL的本地请求(Blob URL是浏览器内部地址,无法获取实际数据)。
- 不同工具返回的响应体可能是base64编码或原始二进制,需根据实际格式做对应转换。
内容的提问来源于stack exchange,提问作者Sathish Sevukan
相关产品推荐
相关产品推荐

