Appium+Android屏幕底部中央悬浮按钮导致无法滚动,求替代解决方案
Appium Android 滚动被底部悬浮按钮阻挡的解决方案
你之前使用的UiScrollable默认以全屏作为滑动区域,底部悬浮按钮覆盖了滑动热区后,会拦截滑动动作或导致滑动距离不足,因此滚动逻辑失效。可选用以下方案解决:
方案1:调整UiScrollable滑动死区,避开悬浮区域
直接在原有UiAutomator代码中添加死区配置,将底部悬浮按钮所占的区域设为滑动不触发区,无需修改原有滚动逻辑:
driver.findElement(MobileBy.AndroidUIAutomator( "new UiScrollable(new UiSelector().scrollable(true).instance(0))" + // 可根据悬浮按钮高度调整百分比,以下为设置底部15%区域为滑动死区 ".setSwipeDeadZonePercentage(0.15)" + ".scrollIntoView(new UiSelector().textContains(\"5000666\").instance(0))" ));
滚动到列表底部的代码同理添加死区配置即可:
driver.findElement(MobileBy.AndroidUIAutomator( "new UiScrollable(new UiSelector().scrollable(true))" + ".setSwipeDeadZonePercentage(0.15)" + ".scrollToEnd(10)" ));
方案2:自定义坐标滑动,完全避开悬浮区域
如果UiAutomator原生滚动仍然不生效,可以通过TouchAction自定义滑动坐标,滑动的起点避开底部悬浮按钮的高度范围:
import org.openqa.selenium.Dimension; import io.appium.java_client.TouchAction; import io.appium.java_client.touch.WaitOptions; import io.appium.java_client.touch.offset.PointOption; import java.time.Duration; // 获取屏幕尺寸 Dimension screenSize = driver.manage().window().getSize(); int width = screenSize.width; int height = screenSize.height; // 计算滑动坐标:水平方向取屏幕中线,垂直滑动范围避开底部15%区域 int startX = width / 2; int startY = (int) (height * 0.7); // 滑动起点从屏幕70%高度的位置开始 int endX = width / 2; int endY = (int) (height * 0.2); // 滑动终点到屏幕20%高度的位置停止 // 执行滑动 new TouchAction<>(driver) .press(PointOption.point(startX, startY)) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(800))) .moveTo(PointOption.point(endX, endY)) .release() .perform();
可将上述滑动逻辑封装为循环,每次滑动后判断目标元素是否存在,直到找到目标元素或滚动到底部为止。
方案3:临时隐藏悬浮按钮
如果悬浮按钮为第三方应用的悬浮球/辅助功能按钮,可在测试执行前临时关闭:
- 若悬浮按钮支持手动收起,可先通过定位点击收起按钮,执行完滚动逻辑后再恢复
- 若为系统级悬浮窗,可通过adb命令临时关闭对应应用的悬浮窗权限,测试结束后恢复:
# 关闭悬浮窗权限,<package_name>替换为悬浮按钮对应应用的包名 adb shell appops set <package_name> SYSTEM_ALERT_WINDOW deny # 测试结束后恢复权限 adb shell appops set <package_name> SYSTEM_ALERT_WINDOW allow
内容的提问来源于stack exchange,提问作者Rahul Juyal
相关产品推荐
相关产品推荐

