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);
		
	}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章