72 lines
2.6 KiB
JavaScript
72 lines
2.6 KiB
JavaScript
import { chromium } from '@playwright/test'
|
||
|
||
/**
|
||
* 用**正确阈值**重测。
|
||
* 之前的探针用 r<246 判"深色",而表头底色是 245 → 被误判成线。
|
||
* 边框线是 217,白底是 255,表头灰是 245。
|
||
* 正确判据:只看接近 217 的像素(容差 ±6),把 245 和 255 都当作"非线"。
|
||
*/
|
||
const BASE = process.env.PROBE_URL || 'http://localhost:5200'
|
||
const LINE = 217
|
||
const TOL = 6
|
||
|
||
const isLine = ([r, g, b]) =>
|
||
Math.abs(r - LINE) <= TOL && Math.abs(g - LINE) <= TOL && Math.abs(b - LINE) <= TOL
|
||
|
||
const browser = await chromium.launch()
|
||
const page = await browser.newPage({ viewport: { width: 1400, height: 1200 } })
|
||
await page.goto(BASE, { waitUntil: 'networkidle' })
|
||
|
||
const clipSample = async (x, y, w, h) => {
|
||
const shot = await page.screenshot({ clip: { x, y, width: w, height: h } })
|
||
return page.evaluate(async (dataUrl) => {
|
||
const img = new Image()
|
||
await new Promise((res) => {
|
||
img.onload = res
|
||
img.src = dataUrl
|
||
})
|
||
const cv = document.createElement('canvas')
|
||
cv.width = img.width
|
||
cv.height = img.height
|
||
const ctx = cv.getContext('2d')
|
||
ctx.drawImage(img, 0, 0)
|
||
const d = ctx.getImageData(0, 0, img.width, img.height).data
|
||
const out = []
|
||
for (let i = 0; i < d.length; i += 4) out.push([d[i], d[i + 1], d[i + 2]])
|
||
return out
|
||
}, `data:image/png;base64,${shot.toString('base64')}`)
|
||
}
|
||
|
||
const heights = [500, 400, 350, 300, 250, 200, 180, 160, 150, 140, 130, 120, 110, 100, 90, 80]
|
||
|
||
console.log('=== 正确阈值(只认 217±6,245/255 均视为非线)===')
|
||
console.log('容器高 | 底边像素(217线) | 线数 | 判定')
|
||
let bad = 0
|
||
for (const h of heights) {
|
||
await page.evaluate((hh) => {
|
||
document.querySelector('[data-testid="table-big-wrap"]').style.height = `${hh}px`
|
||
}, h)
|
||
await page.waitForTimeout(420)
|
||
await page.locator('[data-testid="table-big-wrap"]').scrollIntoViewIfNeeded()
|
||
await page.waitForTimeout(180)
|
||
|
||
const g = await page.evaluate(() => {
|
||
const wrap = document.querySelector('[data-testid="table-big-wrap"]')
|
||
const root = wrap.querySelector('.g3-table')
|
||
const r = root.getBoundingClientRect()
|
||
return { left: Math.round(r.left), bottom: Math.round(r.bottom) }
|
||
})
|
||
const y = Math.max(0, g.bottom - 5)
|
||
if (1200 - y < 12) continue
|
||
const px = await clipSample(g.left + 300, y, 1, 12)
|
||
const vec = px.map((p) => (isLine(p) ? 1 : 0))
|
||
const n = vec.reduce((a, b) => a + b, 0)
|
||
if (n !== 1) bad += 1
|
||
console.log(
|
||
`${String(h).padStart(6)} | ${vec.join('')} | ${String(n).padStart(4)} | ${n === 1 ? '✅ 一条线' : n === 0 ? '❌ 缺线' : '❌ ' + n + ' 条'}`,
|
||
)
|
||
}
|
||
console.log(`\n失败档位: ${bad} 个`)
|
||
|
||
await browser.close()
|