我正在尝试运行命令以在模拟器上滚动屏幕。我尝试了Action类中的一组action命令,但是它们不一致。我最终偶然发现了下面的代码。
是否需要导入或包含某些内容才能使这些操作正常运行?我的另一个困惑是,此代码在使用Espresso驱动程序时有效,但在UiAutomator2驱动程序下运行时却产生此错误消息。我尝试导入Action类,但这不能解决问题。同样,在UiAutomator2驱动程序上是否需要导入或专门用于这些命令的东西?
此代码在使用Espresso驱动程序时有效,但在UiAutomator2驱动程序下运行时会产生此错误消息。我尝试导入Action类,但这不能解决问题。
WebElement element1 = wait.until(ExpectedConditions.visibilityOfElementLocated(originLocator));
WebElement element2 = wait.until(ExpectedConditions.visibilityOfElementLocated(destinationLocator));
int startY = element1.getLocation().getY() + (element1.getSize().getHeight() / 2);
int startX = element1.getLocation().getX() + (element1.getSize().getWidth() / 2);
int endX = element2.getLocation().getX() + (element2.getSize().getWidth() / 2);
int endY = element2.getLocation().getY() + (element2.getSize().getHeight() / 2);
PointerInput input = new PointerInput(PointerInput.Kind.TOUCH, "input");
Sequence swipeTo = new Sequence(input, 0);
swipeTo.addAction(input.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), startX, startY));
swipeTo.addAction(input.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
swipeTo.addAction(input.createPointerMove(Duration.ofMillis(1000), PointerInput.Origin.viewport(), endX, endY));
swipeTo.addAction(input.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
driver.perform(Arrays.asList(swipeTo));
这应该在模拟器上滚动移动应用程序的可见页面,但是当前在使用UiAutomator2驱动程序运行时会导致以下错误(org.openqa.selenium.UnsupportedCommandException: actions
)。
编辑:应用下面注释中的代码后,我得到以下代码,该代码始终与UiAutomator2驱动程序兼容,但与Espresso驱动程序不兼容(它在屏幕上定位了错误的空间,似乎点击了一个元素而不是触摸按住)。
WebElement element1 = wait.until(ExpectedConditions.visibilityOfElementLocated(originLocator));
WebElement element2 = wait.until(ExpectedConditions.visibilityOfElementLocated(destinationLocator));
int startY = element1.getLocation().getY() + (element1.getSize().getHeight() / 2);
int startX = element1.getLocation().getX() + (element1.getSize().getWidth() / 2);
int endX = element2.getLocation().getX() + (element2.getSize().getWidth() / 2);
int endY = element2.getLocation().getY() + (element2.getSize().getHeight() / 2);
Dimension dim=driver.manage().window().getSize();
int height=(int) dim.getHeight();
int width=(int) dim.getWidth();
int x= width/2;
new TouchAction(driver)
.press(PointOption.point(x,startY))
.waitAction(WaitOptions.waitOptions(Duration.ofMillis(2000)))
.moveTo(PointOption.point(x,endY))
.release()
.perform();
所以我确实为每个驱动程序提供了一个工作版本。有谁知道为什么这些根据所使用的驱动程序而具有不同的行为?
答案 0 :(得分:2)
如果要在android应用上滚动,可以使用触摸动作类。下面的代码将向下滚动。如果要向上滚动,请相应地更改startY和startX。希望能帮助到你。
public void scrollDown() {
Dimension dim=new Dimension();
int height=(int) dim.getHeight();
int width=(int) dim.getWidth();
int x= width/2;
int startY=(int) (height*0.80);
int endY=(int) (height*0.20);
new TouchAction(driver).press(x, startY).waitAction(Duration.ofMillis(2000)).moveTo(x, endY).release().perform();
}
答案 1 :(得分:1)
您可以使用AndroidDriver驱动程序,并且AppiumDriver类中提供了一种支持滑动的方法,因此您无需使用Action类即可滑动页面。
我已经制作了一种通用的参数化方法,可以根据滑动类型垂直向上和向下滑动。
代码如下:
public enum SwipeType {
VerticallyUp, VerticallyDown
}
public void swipeVertically(int swipeValue, SwipeType Move) {
Double swipeHeight = 0.0;
swipeHeight = (double) swipeValue;
Dimension screenSize = driver.manage().window().getSize();
Double screenWidth = Double.valueOf(String.valueOf(screenSize.getWidth())) / 2;
Double screenHeight = Double.valueOf(String.valueOf(screenSize.getHeight())) / 2;
if (screenHeight + swipeValue > screenHeight * 2 || swipeValue == 0) {
swipeHeight = screenHeight / 2;
}
switch (Move) {
case VerticallyUp:
driver.swipe(screenWidth.intValue(), screenHeight.intValue() + swipeHeight.intValue(), screenWidth.intValue(), screenHeight.intValue(), 2000);
break;
case VerticallyDown:
driver.swipe(screenWidth.intValue(), screenHeight.intValue(), screenWidth.intValue(), screenHeight.intValue() + swipeHeight.intValue(), 2000);
break;
}
}
我已将swipeValue用作300,因为它非常适合我的应用。您可以根据自己的应用使用它。
希望对您有帮助!