一、前提
因为使用的Appium是7以后的版本,所以以前的driver.swipe方法不能使用
老版本
最开始的使用API中swipe()方法,通过获取坐标来滑动页面,当我们使用最新appium的java的jar包编写代码是,返现swipe()方法无法找到,查看API和资料发现该方法已经去掉
新版本
而替代者就是TouchAction对象,它是针对手势的一些操作,如滑动页面,按压屏幕,长按,拖动,移动等(可自行查看)
二、实现鼠标上下左右滑动的方法封装
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.android.nativekey.AndroidKey;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;
import org.openqa.selenium.By;
import java.time.Duration;
/**
* 工具类
* Appium 实现上下、左右滑动页面 只适用于Appium 1.6.4及以下
* 1.7 driver.swipe方法不能用了
*/
public class AppiumUtils {
/**
* 向上滑动
* 第一个坐标(x / 2,8 * y / 10):控制x轴在屏幕的中间点和y轴按压屏幕的坐标
* 第二个坐标(x / 2, y / 5):控制x轴在屏幕的中间点和y轴向上滑动的坐标停留点
* @param driver
* @param durtion 下一次滑动的时间
*/
public static void swipeToUp(AndroidDriver<AndroidElement> driver, long durtion) {
//获取手机屏幕的宽度
int x = driver.manage().window().getSize().getWidth();
//获取手机屏幕的高度
int y = driver.manage().window().getSize().getHeight();
new TouchAction(driver).press(PointOption.point(x / 2, 8 * y / 10))
.waitAction(WaitOptions.waitOptions(Duration.ofSeconds(durtion)))
.moveTo(PointOption.point(x / 2, y / 5)).release().perform();
}
/**
* 向下滑动
* @param driver
* @param durtion 下一次滑动的时间
*/
public static void swipeToDown(AndroidDriver<AndroidElement> driver, long durtion) {
//获取手机屏幕的宽度
int x = driver.manage().window().getSize().getWidth();
//获取手机屏幕的高度
int y = driver.manage().window().getSize().getHeight();
new TouchAction(driver).press(PointOption.point(x / 2, y / 5))
.waitAction(WaitOptions.waitOptions(Duration.ofSeconds(durtion)))
.moveTo(PointOption.point(x / 2, 8 * y / 10)).release().perform();
}
/**
* 向左滑动
* @param driver
* @param durtion 下一次滑动的时间
*/
public static void swipeToLeft(AndroidDriver<AndroidElement> driver, Long durtion) {
//获取手机屏幕的宽度
int x = driver.manage().window().getSize().getWidth();
//获取手机屏幕的高度
int y = driver.manage().window().getSize().getHeight();
new TouchAction(driver).press(PointOption.point(8 * x / 10, y / 2))
.waitAction(
WaitOptions.waitOptions(Duration.ofSeconds(durtion)))
.moveTo(PointOption.point(x / 10, y / 2)).release().perform();
}
/**
* 向左滑动
* @param driver
* @param durtion 下一次滑动的时间
*/
public static void swipeToRight(AndroidDriver<AndroidElement> driver, Long durtion) {
//获取手机屏幕的宽度
int x = driver.manage().window().getSize().getWidth();
//获取手机屏幕的高度
int y = driver.manage().window().getSize().getHeight();
new TouchAction(driver).press(PointOption.point(x / 10, y / 2))
.waitAction(
WaitOptions.waitOptions(Duration.ofSeconds(durtion)))
.moveTo(PointOption.point(8 * x / 10, y / 2)).release().perform();
}
}
三、使用方法
import com.appium.driver.AppiumUtils;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.net.URL;
public class TestSwipe {
private AndroidDriver<AndroidElement> driver;
@BeforeTest
public void init() throws Exception {
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(MobileCapabilityType.DEVICE_NAME, "zhihu");
//指定测试平台
cap.setCapability(MobileCapabilityType.PLATFORM_NAME,"Android");
//指定测试机的ID,通过adb命令`adb devices`获取
cap.setCapability(MobileCapabilityType.UDID, "127.0.0.1:62001");
cap.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.zhihu.android");
cap.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.zhihu.android.app.ui.activity.LauncherActivity");
driver = new AndroidDriver<AndroidElement>(
new URL("http://127.0.0.1:4723/wd/hub"), cap);
}
@Test
public void testSwipe() {
AppiumUtils.swipeToLeft(driver,500L);
}
}
注意:如果你的滑动不生效也不报错,这个时候可能是滑动坐标之间的距离不够,或者滑动的时候起始点被其他元素挡住了
滑动的时候可能出现超出边界的错误,或者是一个不知道的异常,在滑动之前我们需要等待几秒钟的时间
原因:在界面切换的过程中,如果界面切换的比较慢,这个时候代码是不会等待界面而直接执行代码,这个时候在执行滑动代码,这个时候界面正在执行切换,所以需要等待界面切换完成。