Selenium获取浏览器上下文变量及自动设置XHR断点问题
问题1:Selenium能否访问DevTools控制台的同一上下文?
不能直接通过execute_script访问。DevTools断点暂停时的变量t属于调试器的临时执行上下文,而Selenium的execute_script是在页面全局JavaScript上下文中运行,两者不属于同一个环境。
如果要获取这个t变量,得借助Selenium的Chrome DevTools Protocol(CDP)API,调用调试器命令读取当前暂停帧的变量。示例代码如下:
# 确保页面因断点触发处于暂停状态 driver.execute_cdp_cmd('Debugger.pause', {}) # 获取当前调用栈帧 call_frames = driver.execute_cdp_cmd('Debugger.getCallFrames', {}) # 取当前暂停的第一个栈帧ID frame_id = call_frames['callFrames'][0]['callFrameId'] # 在该栈帧上下文里执行代码获取t变量 result = driver.execute_cdp_cmd('Debugger.evaluateOnCallFrame', { 'callFrameId': frame_id, 'expression': 't', 'returnByValue': True }) # 打印t变量的值 print(result['result']['value'])
问题2:能否通过Selenium自动设置XHR断点?
可以,通过Selenium调用CDP的调试器命令就能实现,无需手动操作DevTools。示例代码如下:
# 启用调试器 driver.execute_cdp_cmd('Debugger.enable', {}) # 设置XHR断点,空字符串匹配所有XHR请求,也可指定特定URL如'/api/*' driver.execute_cdp_cmd('Debugger.setXHRBreakpoint', { 'url': '' }) # 可选:也可用Network拦截方式实现类似效果(无需暂停页面,直接获取请求数据) driver.execute_cdp_cmd('Network.enable', {}) driver.execute_cdp_cmd('Network.setRequestInterception', { 'patterns': [{'urlPattern': '*', 'resourceType': 'XHR', 'interceptionStage': 'HeadersReceived'}] }) # 监听拦截到的XHR请求,打印请求详情 def handle_xhr(request_data): print(request_data['request']['url'], request_data['request']['postData']) driver.add_cdp_listener('Network.requestIntercepted', handle_xhr)
内容的提问来源于stack exchange,提问作者LF-DevJourney
相关产品推荐
相关产品推荐

