如何在最新版Appium(Java)中滚动到指定元素及解决相关报错
解决Appium元素不可见但
isDisplayed()返回true且onScreen()报错的问题 看起来你碰到了Appium里一个挺常见的坑:元素实际不在屏幕可见区域,但isDisplayed()返回true,而且调用onScreen()还因为未实现报错。下面给你几个可行的解决方案:
1. 替换onScreen(),直接获取元素坐标
RemoteWebElement的onScreen()方法在Appium里并没有被实现,这就是你看到UnsupportedOperationException的原因。你可以改用getLocation()方法直接获取元素的坐标,然后执行滑动操作:
// 直接获取元素的位置坐标,无需onScreen() Point elementLocation = send_mail.getLocation(); int targetX = elementLocation.getX(); int targetY = elementLocation.getY(); // 创建TouchAction滑动到目标位置 TouchAction touchAction = new TouchAction(driver); // 先定位到屏幕中间,再滑动到元素位置(避免起始点在不可点击区域) touchAction.press(PointOption.point(driver.manage().window().getSize().getWidth()/2, driver.manage().window().getSize().getHeight()/2)) .moveTo(PointOption.point(targetX, targetY)) .release() .perform();
2. 用Appium原生滚动方法定位元素
不用自己处理坐标逻辑,直接用Appium提供的滚动策略,比如Android平台的AndroidUIAutomator,可以直接滚动到元素可见:
// 替换成你的元素xpath String targetXpath = "your-element-xpath-here"; MobileElement targetElement = (MobileElement) driver.findElementByAndroidUIAutomator( "new UiScrollable(new UiSelector().scrollable(true))" + ".scrollIntoView(new UiSelector().xpath(\"" + targetXpath + "\"));" );
3. 手动判断元素是否在可见区域,循环滚动
既然isDisplayed()不可靠,你可以结合屏幕尺寸和元素的位置、大小来判断它是否真的在可见区域,然后循环滚动直到元素可见:
Dimension screenSize = driver.manage().window().getSize(); int screenHeight = screenSize.getHeight(); int screenWidth = screenSize.getWidth(); // 获取元素的位置和尺寸 Point elementLoc = send_mail.getLocation(); int elementY = elementLoc.getY(); int elementHeight = send_mail.getSize().getHeight(); // 判断元素是否完全在屏幕可见区域内 boolean isVisibleOnScreen = (elementY + elementHeight) <= screenHeight && elementY >= 0; // 循环滚动直到元素可见 while (!isVisibleOnScreen) { // 模拟向上滚动(可根据需要调整滚动的起始/结束位置) TouchAction scrollAction = new TouchAction(driver); scrollAction.press(PointOption.point(screenWidth/2, screenHeight*3/4)) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(500))) .moveTo(PointOption.point(screenWidth/2, screenHeight/4)) .release() .perform(); // 更新元素位置和可见性状态 elementLoc = send_mail.getLocation(); elementY = elementLoc.getY(); isVisibleOnScreen = (elementY + elementHeight) <= screenHeight && elementY >= 0; }
这些方法都能避开onScreen()的坑,同时解决isDisplayed()返回值不准确的问题,你可以根据自己的测试场景选择合适的方案。
内容的提问来源于stack exchange,提问作者Pranav Madhani
相关产品推荐
相关产品推荐

