我正在尝试使用 Appium 和 WebdriverIO 在 Android 本机应用程序中执行精确滚动。
最终目标是在包含可滚动内容的 Android 视图(例如:ScrollViews/WebViews)中执行快照测试(比较屏幕截图),因此需要像素完美的结果。
似乎有几种滚动方式,例如 touchAction 或 performActions。
使用
touchAction
:
这看起来是最直接的方法(事实上,这就是 Appium Inspector 在记录滑动手势时产生的结果)
await driver.touchAction([
{ action: 'press', x: 200, y: 400 },
{ action: 'moveTo', x: 200, y: 200 },
'release'
])
这可以很好地滚动内容,但是存在以下问题:
使用Appium的performActions
:
await driver.performActions([
{
type: 'pointer',
id: 'finger1',
parameters: { pointerType: 'touch' },
actions: [
{ type: 'pointerMove', duration: 0, x: 200, y: 400 },
{ type: 'pointerDown', button: 0 },
{ type: 'pause', duration: 100 },
{ type: 'pointerMove', duration: 1000, origin: 'pointer', x: 200, y: 200 },
{ type: 'pointerUp', button: 0 },
],
},
])
这似乎适用于所有类型的内容(ScrollViews 或 WebViews),但滚动距离根本不一致。在所有情况下,滚动距离似乎会根据手势的持续时间而有很大差异,但即使像 10000 毫秒这样非常长的持续时间也不会导致 100% 一致的滚动距离。
在摆弄
performActions
时,我还尝试在
pointerMove
和
pointerUp
操作之间加入额外的暂停,试图消除手势速度作为失败因素:
...
{ type: 'pointerMove', duration: 1000, origin: 'pointer', x: 200, y: 200 },
{ type: 'pause', duration: 1000 },
{ type: 'pointerUp', button: 0 },
...
但是一旦发生 pointerUp
操作,内容就会滚动一点,再次导致不可预测的滚动距离。问题
scrollGesture
?
import { driver } from '@wdio/globals';
export class CommonAction{
async scrollUp(){
const screenSize = await driver.getWindowSize();
await driver.executeScript("mobile: scrollGesture", [
{ direction: "up", left: screenSize.width * 0.5, top: screenSize.height * 0.5, width: screenSize.width * 0.9, height: screenSize.height * 0.9, percent: 0.25}
]);
}
async scrollDown(){
const screenSize = await driver.getWindowSize();
await driver.executeScript("mobile: scrollGesture", [
{ direction: "down", left: screenSize.width * 0.025, top: screenSize.height * 0.025, width: screenSize.width * 0.9, height: screenSize.height * 0.9, percent: 0.25}
]);
}
}
export default new CommonAction();
我的 GitHub 存储库上的完整示例:
https://github.com/ahmadazerichandrabhuana/wdioandroid/blob/main/test/pageobjects/common.action.js
希望它能有所帮助,很抱歉这么晚才回复。