""" 测试强行注入 Vue 实例修改日期控件的值 """ import sys import time from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from login import get_page, log HOME_URL = "https://yunmes.tftykj.cn/" def test_vue_injection(): log("INFO", "=== 🧪 启动 Vue 实例强行注入测试 ===") page = get_page(port=9222) try: log("INFO", "⚠️ 假设您已经在保活浏览器中手动打开了【质量报表】页面!") # 尝试刷新一下页面,确保处于初始状态 (可选,这里先不刷新,直接找元素) # page.refresh() # page.wait.load_start() # time.sleep(2) date_xpath = 'xpath://*[@id="customTable-search-area"]/div[1]/div/div[2]/div[11]/div[2]/span/input[1]' log("INFO", f"正在当前页面寻找日期输入框: {date_xpath}") date_input = page.ele(date_xpath, timeout=5) if date_input: log("INFO", "✅ 找到输入框!准备执行 Vue 实例劫持注入...") # 黑客核心:拿到 DOM 元素,获取其上的 __vue__ 实例,然后修改其父组件的 value 或 model 值 # ElementUI 的 el-date-picker 绑定的值通常在自身或其父组件实例上 # 这里尝试了多种可能的 Vue 内部变量名以确保万无一失 vue_hack_js = """ var el = arguments[0]; if (el.__vue__) { // 尝试修改自身绑定的值 el.__vue__.value = '2026-05-01 00:00:00'; el.__vue__.$emit('input', '2026-05-01 00:00:00'); el.__vue__.$emit('change', '2026-05-01 00:00:00'); } // 如果外层有包裹的 el-date-picker 父组件 var parent = el.closest('.el-date-editor'); if (parent && parent.__vue__) { parent.__vue__.value = '2026-05-01 00:00:00'; if (parent.__vue__.userInput) { parent.__vue__.userInput = '2026-05-01 00:00:00'; } parent.__vue__.$emit('input', '2026-05-01 00:00:00'); parent.__vue__.$emit('change', '2026-05-01 00:00:00'); } // 物理备用手段,防止 Vue 版本差异 el.value = '2026-05-01 00:00:00'; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); """ try: page.run_js(vue_hack_js, date_input) log("OK", "✅ Vue 注入指令已发送!请肉眼观察输入框是否有变化。") except Exception as e: log("WARN", f"Vue 注入执行时发生警告: {e}") time.sleep(2) log("INFO", "准备点击【查询】按钮触发网络请求...") query_btn_xpath = 'xpath://*[@id="customTable-search-area"]/div[1]/div/div[1]/a[2]/span/span' query_btn = page.ele(query_btn_xpath, timeout=3) if query_btn: try: query_btn.click() except: page.run_js("arguments[0].click();", query_btn) log("OK", "✅ 已点击【查询】按钮!请在浏览器中观察页面是否开始刷新 2026-05-01 之后的数据。") else: log("ERR", "找不到查询按钮。") else: log("ERR", "找不到日期输入框,请检查 XPath 是否正确!") except Exception as e: log("ERR", f"发生异常: {e}") if __name__ == "__main__": test_vue_injection()