文件
OmniCard/mpuniapp/pages/component/scroll-view/scroll-view-custom-refresher-props.test.js

253 行
8.8 KiB
JavaScript

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

const PAGE_PATH = '/pages/component/scroll-view/scroll-view-custom-refresher-props'
const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
const isWeb = platformInfo.startsWith('web')
const isMP = platformInfo.startsWith('mp')
const isAppWebView = process.env.UNI_AUTOMATOR_APP_WEBVIEW == 'true'
const isIos = platformInfo.startsWith('ios')
const isAndroid = platformInfo.startsWith('android')
const isHarmony = platformInfo.startsWith('harmony')
describe('scroll-view-custom-refresher-props-test', () => {
//TODO:临时方案
if (isWeb || isMP) {
// 不支持program.swipe
it('skip', () => {
expect(1).toBe(1)
})
return
}
let page
beforeAll(async () => {
page = await program.reLaunch(PAGE_PATH)
await page.waitFor('view')
await page.waitFor(500)
});
async function getPageData(dataKey) {
return await page.data('data.' + dataKey)
}
/**
* 等待刷新完成(通过轮询状态)
* @param {string} refreshingKey - refreshing 状态的 key(如 'refreshing1')
* @param {string} listCountKey - listCount 的 key(如 'listCount1')
* @param {number} expectedIncrement - 预期增加的数量(默认 5)
* @param {number} timeout - 超时时间(默认 6000ms)
* @returns {Promise<boolean>} 返回是否刷新成功
*/
async function waitForRefreshComplete(refreshingKey, listCountKey, expectedIncrement = 5, timeout = 6000) {
const initialCount = await getPageData(listCountKey)
const startTime = Date.now()
let hasStarted = false
let lastRefreshing = null
let lastCount = initialCount
let pollCount = 0
// 轮询间隔(指数退避,避免高频 IPC)
let interval = 200
console.log(`[waitForRefreshComplete] 开始等待刷新完成: ${refreshingKey}, 初始数量: ${initialCount}`)
while (Date.now() - startTime < timeout) {
pollCount++
const refreshing = await getPageData(refreshingKey)
const currentCount = await getPageData(listCountKey)
console.log(`[waitForRefreshComplete] 第 ${pollCount} 次轮询 - refreshing: ${refreshing}, count: ${currentCount}, hasStarted: ${hasStarted}, interval: ${interval}ms`)
lastRefreshing = refreshing
lastCount = currentCount
if (refreshing) {
hasStarted = true
}
if (hasStarted && !refreshing && currentCount >= initialCount + expectedIncrement) {
const elapsedTime = Date.now() - startTime
console.log(`[waitForRefreshComplete] 刷新成功!共轮询 ${pollCount} 次,耗时 ${elapsedTime}ms`)
return true
}
await page.waitFor(interval)
interval = Math.min(interval * 1.5, 800)
}
// 超时后返回 false
const elapsedTime = Date.now() - startTime
console.log(`[waitForRefreshComplete] 刷新超时!共轮询 ${pollCount} 次,耗时 ${elapsedTime}ms,最终状态: refreshing=${lastRefreshing}, count=${lastCount}`)
return false
}
/**
* 执行下拉刷新操作
* @param {string} elementId - scroll-view 的id
* @param {number} pullDistance - 下拉距离
* @param {number} offsetY - 在scroll-view内部的Y偏移量(默认10,从顶部稍微往下一点开始滑动)
*/
async function performPullRefresh(elementId, pullDistance = 150, offsetY = 10) {
const rect = await page.callMethod('getBoundingClientRectForRefreshing', elementId);
console.log(`Refresher [${elementId}] rect:`, JSON.stringify(rect));
const windowInfo = await program.callUniMethod('getWindowInfo')
// 确保坐标为整数(IDB 要求整数坐标)
const startX = Math.round(rect.left + rect.width / 2);
const startY = Math.round(rect.top + offsetY + windowInfo.safeAreaInsets.top + 44);
const endY = Math.round(startY + pullDistance);
console.log(`Refresher [${elementId}] swipe from (${startX}, ${startY}) to (${startX}, ${endY})`);
await program.swipe({
startPoint: {
x: startX,
y: startY
},
endPoint: {
x: startX,
y: endY
},
duration: 500
})
await page.waitFor(300)
}
async function screenshot() {
const windowInfo = await program.callUniMethod('getWindowInfo')
let topSafeArea = windowInfo.safeAreaInsets.top;
if (isAppWebView) {
if (isIos) {
topSafeArea = 59
if (platformInfo.includes('26')) {
topSafeArea = 62
}
} else if (isAndroid) {
topSafeArea = 24
windowInfo.safeArea.bottom = 867
if (platformInfo.startsWith('android 5')) {
topSafeArea = 25
}if (platformInfo.startsWith('android 6')) {
windowInfo.safeArea.bottom = 592
}if (platformInfo.startsWith('android 8')) {
windowInfo.safeArea.bottom = 534
} else if (platformInfo.startsWith('android 11')) {
topSafeArea = 52
} else if (platformInfo.startsWith('android 12')) {
topSafeArea = 24
windowInfo.safeArea.bottom = 716
} else if (platformInfo.startsWith('android 13') || platformInfo.startsWith('android 15')) {
topSafeArea = 49
windowInfo.safeArea.bottom = 891
} else if (platformInfo.startsWith('android 14')) {
windowInfo.safeArea.bottom = 891
}
} else if (isHarmony) {
topSafeArea = 39
if (platformInfo.includes('nova_12')) {
topSafeArea = 35
}
}
}
const top = topSafeArea + 44
const bottom = Math.min(top + windowInfo.windowHeight, windowInfo.safeArea.bottom)
const left = windowInfo.safeArea.left
const right = windowInfo.safeArea.right
const screenShotOptions = {
deviceShot: true,
area: {
x: left,
y: top,
width: right - left,
height: bottom - top
},
}
const image = await program.screenshot(screenShotOptions)
expect(image).toSaveImageSnapshot()
}
it('test-initial-screenshot', async () => {
await screenshot()
})
if (!isAppWebView) {
// ==================== 第1个下拉刷新功能测试 ====================
it('test-refresher-1-pull-to-refresh', async () => {
const initialCount = await getPageData('listCount1')
await performPullRefresh('refreshing1', 180)
// 使用轮询等待刷新完成
const refreshSuccess = await waitForRefreshComplete('refreshing1', 'listCount1', 5, 6000)
expect(refreshSuccess).toBe(true)
// 验证列表数量增加了5个
const finalCount = await getPageData('listCount1')
expect(finalCount).toBe(initialCount + 5)
})
// ==================== 第2个下拉刷新功能测试 ====================
it('test-refresher-2-pull-to-refresh', async () => {
const initialCount = await getPageData('listCount2')
await performPullRefresh('refreshing2', 180)
const refreshSuccess = await waitForRefreshComplete('refreshing2', 'listCount2', 5, 6000)
expect(refreshSuccess).toBe(true)
const finalCount = await getPageData('listCount2')
expect(finalCount).toBe(initialCount + 5)
})
// ==================== 第3个下拉刷新功能测试 ====================
it('test-refresher-3-pull-to-refresh', async () => {
const initialCount = await getPageData('listCount3')
await performPullRefresh('refreshing3', 180)
const refreshSuccess = await waitForRefreshComplete('refreshing3', 'listCount3', 5, 6000)
expect(refreshSuccess).toBe(true)
const finalCount = await getPageData('listCount3')
expect(finalCount).toBe(initialCount + 5)
})
// ==================== 第4个下拉刷新功能测试 ====================
it('test-refresher-4-pull-to-refresh', async () => {
const initialCount = await getPageData('listCount4')
await performPullRefresh('refreshing4', 180)
const refreshSuccess = await waitForRefreshComplete('refreshing4', 'listCount4', 5, 6000)
expect(refreshSuccess).toBe(true)
const finalCount = await getPageData('listCount4')
expect(finalCount).toBe(initialCount + 5)
})
// ==================== 测试部分下拉(不触发刷新)====================
it('test-partial-pull-not-trigger-refresh', async () => {
// 记录初始列表数量
const initialCount = await getPageData('listCount1')
// 验证初始pullingDistance为0
const initialDistance = await getPageData('pullingDistance1')
expect(initialDistance).toBe(0)
// 执行部分下拉 (只下拉30px,小于threshold 45,不应触发刷新)
await performPullRefresh('refreshing1', 30)
await page.waitFor(1000)
// 验证列表数量没有变化(因为没有触发刷新)
const finalCount = await getPageData('listCount1')
expect(finalCount).toBe(initialCount) // 数量应该保持不变
// 验证pullingDistance已重置为0
const finalDistance = await getPageData('pullingDistance1')
expect(finalDistance).toBe(0)
})
}
})