JAVA+Appium 自动化实现手机屏幕滑动点击操作

背景:App某些页面元素无法通过Appium或其他方式抓取到,无法通过传统方式定位到元素。

原理:获取到当前屏幕的尺寸,在要操作的元素的屏幕位置构造像素点位,进而执行点击或滑动操作。

注:坐标定位时采用相对定位方式,可适配其他分辨率。

1、坐标点击屏幕元素

<!-- https://mvnrepository.com/artifact/io.appium/java-client -->
        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>7.1.0</version>
        </dependency>

<dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.10</version>
            <scope>test</scope>
        </dependency>

 前提准备:连接驱动设备

public DesiredCapabilities getCapabilities() {
			    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
				desiredCapabilities.setCapability("platformName", "Android");
				desiredCapabilities.setCapability("platformVersion", "9");
				desiredCapabilities.setCapability("deviceName", "923QEDUK22434");
				desiredCapabilities.setCapability("appPackage", "com.leke.lekechat");
				desiredCapabilities.setCapability("appActivity", "com.leke.lekechat.ui.SplashFirstActivity");
				desiredCapabilities.setCapability("automationName", "UiAutomator2");
				desiredCapabilities.setCapability("noReset", "True");
			return desiredCapabilities;
		}
		
		public AndroidDriver  getDriver() {
			private static final String APPIUM_SERVER_REMOTE = "http://localhost:4723/wd/hub";
			DesiredCapabilities desiredCapabilities =this.getCapabilities();
			URL remoteUrl = null;
			try {
				remoteUrl = new URL(APPIUM_SERVER_REMOTE);
				driver = new AndroidDriver(remoteUrl, desiredCapabilities);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
			return driver;
		}

 实现点击:

public void clickElement_OverScreen( AndroidDriver driver,int [ ][ ]  arr) {
		TouchAction ta = new TouchAction(driver);
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;    
        int P_base_X=arr[0][0];   //元素基准位置坐标
        int P_base_y=arr[0][1];
        int P_base_Screen_X=arr[1][0];//元素所在页的屏幕基准尺寸
        int P_base_Screen_Y=arr[1][1];
        int point_X=this.formatNumber(P_base_X, P_base_Screen_X, width);
        int point_Y=this.formatNumber(P_base_y, P_base_Screen_Y, height);
        PointOption point_Concat=PointOption.point(point_X,point_Y);
        ta.press(point_Concat).release().perform();
		
	}


public int formatNumber(int P_1,int P_2,int P_3) {
	        float dd=(float)P_1/(float)P_2;
	        DecimalFormat df = new DecimalFormat("0.00000000");//格式化小数,不足的补0 
	        String rat = df.format((double)dd);
	        float ff=Float.parseFloat(rat);
	        int formatNum =(int) (ff*P_3);
	       return  formatNum;
	}

示例:

    @Test
	public void clickElement_1() {
        //arr[0]:当前屏幕上元素的坐标;arr[1]:当前屏幕的分辨率
		int[][] keyboardArr = { { 980, 2050 }, { 1080, 2098 } }; //手机键盘的搜索按钮坐标
		AndroidDriver driver = this.getDriver();
		this.clickElement_OverScreen(driver, keyboardArr); //屏幕构造坐标点位并点击
		
	}

2、滑动屏幕

public void executeSlide(AndroidDriver driver,int [ ][ ]  arr) {
		TouchAction ta = new TouchAction(driver);
        int width = driver.manage().window().getSize().width;//当前屏幕的宽度
        int height = driver.manage().window().getSize().height; //当前屏幕的高度
      //new一个TouchAction对象,调用其按压press()方法,输入坐标点,moveTo移动到下一个坐标点,之后调用release()和perform()方法执行
        PointOption P_B=   PointOption.point(width*arr[0][0]/arr[0][1], height*arr[1][0]/arr[1][1]);
        PointOption P_N=   PointOption.point(width*arr[2][0]/arr[2][1], height*arr[3][0]/arr[3][1]);
        WaitOptions waitOption = WaitOptions.waitOptions(Duration.ofSeconds(1));//设置动作持续时间:按压一秒
        ta.press(P_B).waitAction(waitOption).moveTo(P_N).release().perform();//按压一秒——移动——松开释放
	}
	@Test
	public void clickElement_1() {
		//表示沿X轴平移——左滑(0.9X-->0.3X) Y轴坐标为屏幕height的0.8倍
		int[][] arr = { { 9, 10 }, { 4, 5 }, { 3, 10 }, { 4, 5 } };
		AndroidDriver driver = this.getDriver();
		this.executeSlide(driver, arr);
		
	}

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是使用Java语言、Appium和SauceLabs云平台,并通过屏幕分辨率编写iOS App返回上一页的脚本示例: ```java import io.appium.java_client.AppiumDriver; import io.appium.java_client.ios.IOSDriver; import org.openqa.selenium.Dimension; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.net.URL; public class IosAppTest { private AppiumDriver driver; @BeforeClass public void setup() throws Exception { // 设置SauceLabs云平台的配置信息 DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("username", "your-saucelabs-username"); capabilities.setCapability("accessKey", "your-saucelabs-accesskey"); capabilities.setCapability("appiumVersion", "1.20.2"); capabilities.setCapability("platformName", "iOS"); capabilities.setCapability("platformVersion", "14.5"); capabilities.setCapability("deviceName", "iPhone XS Simulator"); capabilities.setCapability("app", "sauce-storage:your-app-name.ipa"); // 替换为你的iOS App文件名 capabilities.setCapability("name", "iOS App Test"); // 创建AppiumDriver对象,连接SauceLabs云平台 driver = new IOSDriver(new URL("https://ondemand.saucelabs.com/wd/hub"), capabilities); } @Test public void testBackButton() { // 在这里执行进入下一页的操作 // 执行返回上一页的操作 Dimension size = driver.manage().window().getSize(); int startX = (int) (size.width * 0.05); int startY = (int) (size.height * 0.95); int endX = (int) (size.width * 0.95); int endY = (int) (size.height * 0.05); driver.swipe(startX, startY, endX, endY, 500); // 假设返回手势为从左上角向右下角滑动 // 验证返回上一页操作是否成功 Assert.assertTrue(driver.findElementByAccessibilityId("PreviousPageTitle").isDisplayed()); // 假设上一页的标题为"PreviousPageTitle" } @AfterClass public void teardown() { // 关闭AppiumDriver对象,断开与SauceLabs云平台的连接 driver.quit(); } } ``` 在这个示例中,我们仍然使用了SauceLabs云平台来运行iOS App自动化测试。在`testBackButton()`方法中,我们执行进入下一页的操作,然后执行返回上一页的操作。不同的是,我们没有找到页面中的返回按钮元素,而是通过屏幕分辨率来模拟返回手势。 具体实现是,我们首先获取窗口的大小,然后计算出起点和终点的坐标。在这个示例中,我们假设返回手势为从左上角向右下角滑动,起点坐标为窗口左上角的5%处,终点坐标为窗口右下角的5%处。最后,我们调用`swipe()`方法,模拟滑动操作。 最后,在`teardown()`方法中,我们关闭AppiumDriver对象,断开与SauceLabs云平台的连接。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值