4016636153
1. 新增oss-browser自动定位包装层脚本与注册批处理 2. 优化粘贴行为:焦点在输入框时交给浏览器默认粘贴 3. 新增一批调试与构建辅助脚本 4. 更新oss-browser下载页说明与步骤
88 lines
3.5 KiB
JavaScript
88 lines
3.5 KiB
JavaScript
// 端到端实测:带包装层启动 oss-browser(CDP 远程调试),验证
|
|
// 1) $rootScope.bucketMap['android-o1-images'].region === 'oss-cn-shanghai'
|
|
// 2) 文件列表真实加载出对象(页面文本含已知对象名)
|
|
// 3) 页面文本不含 AccessDenied
|
|
// 用法:node dev_test_scripts/debug/debug_ossbrowser_e2e.js
|
|
const { spawn } = require('child_process')
|
|
const path = require('path')
|
|
|
|
const EXE = path.join(__dirname, '..', '..', 'temp', 'ossbrowser_inspect', 'oss-browser-win32-x64', 'oss-browser.exe')
|
|
const PORT = 9222
|
|
|
|
const sleep = ms => new Promise(r => setTimeout(r, ms))
|
|
|
|
const fetchJson = async url => {
|
|
const res = await fetch(url)
|
|
return res.json()
|
|
}
|
|
|
|
const cdpEval = (ws, expression) => new Promise((resolve, reject) => {
|
|
const id = Math.floor(Math.random() * 1e6)
|
|
const onMsg = ev => {
|
|
try {
|
|
const msg = JSON.parse(ev.data)
|
|
if (msg.id === id) {
|
|
ws.removeEventListener('message', onMsg)
|
|
resolve(msg.result)
|
|
}
|
|
} catch {}
|
|
}
|
|
ws.addEventListener('message', onMsg)
|
|
ws.send(JSON.stringify({ id, method: 'Runtime.evaluate', params: { expression, returnByValue: true } }))
|
|
setTimeout(() => { ws.removeEventListener('message', onMsg); reject(new Error('eval timeout')) }, 8000)
|
|
})
|
|
|
|
const EXPRESSION = `(function () {
|
|
try {
|
|
var inj = window.angular && window.angular.element(document.documentElement).injector();
|
|
var rs = inj && inj.get('$rootScope');
|
|
var input = document.querySelector('input[ng-model="address"]');
|
|
return JSON.stringify({
|
|
bucketMap: rs ? rs.bucketMap : null,
|
|
address: input ? input.value : null,
|
|
dbg: window.__trae_dbg || null,
|
|
text: (document.body && document.body.innerText || '').slice(0, 6000)
|
|
});
|
|
} catch (e) { return JSON.stringify({ err: String(e) }); }
|
|
})()`
|
|
|
|
;(async () => {
|
|
const child = spawn(EXE, [`--remote-debugging-port=${PORT}`], { detached: true, stdio: 'ignore' })
|
|
console.log('spawned pid', child.pid)
|
|
child.unref()
|
|
|
|
let targets = null
|
|
for (let i = 0; i < 40 && !targets; i++) {
|
|
await sleep(1000)
|
|
try {
|
|
const list = await fetchJson(`http://127.0.0.1:${PORT}/json`)
|
|
const page = (list || []).find(t => t.type === 'page' && /index\.html/.test(t.url || ''))
|
|
if (page) targets = page
|
|
} catch {}
|
|
}
|
|
if (!targets) { console.log('[FAIL] 未找到 CDP page target'); process.exit(1) }
|
|
|
|
const ws = new WebSocket(targets.webSocketDebuggerUrl)
|
|
await new Promise((res, rej) => { ws.onopen = res; ws.onerror = rej })
|
|
|
|
let ok = false
|
|
for (let i = 0; i < 20 && !ok; i++) {
|
|
await sleep(1500)
|
|
try {
|
|
const r = await cdpEval(ws, EXPRESSION)
|
|
const v = JSON.parse(r.result.value || '{}')
|
|
if (!v.bucketMap) continue
|
|
const region = v.bucketMap['android-o1-images'] && v.bucketMap['android-o1-images'].region
|
|
const hasFile = /jianpian\.rar|cover\.png/.test(v.text || '')
|
|
const denied = /AccessDenied/.test(v.text || '')
|
|
console.log(`probe#${i} address=${v.address} region=${region} hasFile=${hasFile} denied=${denied} dbg=${JSON.stringify(v.dbg)}`)
|
|
if (region === 'oss-cn-shanghai' && hasFile && !denied && v.address === 'oss://android-o1-images/trae-files-temp/') ok = true
|
|
} catch (e) { /* 页面可能还在加载 */ }
|
|
}
|
|
|
|
ws.close()
|
|
try { process.kill(child.pid, 'SIGTERM') } catch {}
|
|
console.log(ok ? '[PASS] 地址栏定位 + region 正确 + 列表加载成功,无 AccessDenied' : '[FAIL] 未达到预期状态')
|
|
process.exit(ok ? 0 : 1)
|
|
})().catch(e => { console.error('[FAIL]', e.message); process.exit(1) })
|