Files
datie-bom/browser_login/test_vue_injection.py

87 lines
3.7 KiB
Python

"""
测试强行注入 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()