從零學習安卓自動化(java+appium方向):如何使用java進行手機操作(三)


我的目標是打開我的軟件,

輸入賬號密碼

登錄成功

退出成功

 

第一步打開我的eclipse

1.創建項目:跟正常創建javaproject 一樣

2.導入jar包,有的沒的我都導進去,肯定沒錯。

 

 

 3.寫啟動軟件的主函數

這里的代碼是固定寫法,在網上一查一堆。

package com.run;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.remote.DesiredCapabilities;

import com.mysql.jdbc.Driver;
import com.toolkit.Swipe;
import com.toolkit.andriodAction;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.remote.MobileCapabilityType;
 
import java.net.URL;


public class Run {

    public static void main(String[] args)throws MalformedURLException, InterruptedException {
        // TODO 自動生成的方法存根
        
        //1.添加配置,創建DesiredCapabilities對象
        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        //指定測試設備的名稱
        desiredCapabilities.setCapability("deviceName", "JQYNW18C12004061");
        //添加操作系統配置
        desiredCapabilities.setCapability("platformName", "Android");
        //添加操作系統版本設置
        desiredCapabilities.setCapability("platformVersion", "9");
        //指定想要測試應用的包名
        desiredCapabilities.setCapability("appPackage", "com.hlzt.commercial");
        //指定想要測試應用的入口activity
        desiredCapabilities.setCapability("appActivity", "com.hlzt.flutter_commercial_app.MainActivity");
        //2.創建驅動...URL是appium的固定地址;指定appium通訊的地址,將相對應的配置傳入到驅動里邊
        AndroidDriver androidDriver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
        //加線程等待
        Thread.sleep(5000);
            

        //退出
 //       androidDriver.quit();
    }

}
啟動APP函數

 如果不報錯,並且通過真機看到軟件打開。證明你相當於,執行了java中的hello world的一步。

app自動化已經向你敞開了大門,接下來只需要完成一點點代碼就OK了

 

 

 4.接下來我開始分析我的APP步驟,你可以通過借鑒我的思路來分你的要測試的APP步驟

1.進入之后是3張廣告業,需要向右滑動。

2.第三張廣告業需要點擊圖片進入APP默認界面。

3.點擊APP默認界面的“消息”按鈕,進入登錄頁面(不要問為啥這么設計,老板喜歡,干就完了)

4.點擊登錄注冊按鈕

5.點擊其他登錄文字

6.點擊賬號密碼登錄文字

7.輸入賬號密碼

8.點擊登錄

9登錄成功進入主頁,確認主頁進入正確

10.退出

 

5.好我們一步一個坎的往下走

第一步 3張廣告業,需要向右滑動

第一個坑。由於appium Java-client 新版本不支持swipe,所以沒有官方API來管滑動  WTF

還好網上大神多,查詢到代碼,使用后好使     出處:https://www.cnblogs.com/tianyumuhe/p/9123350.html

package com.toolkit;

import java.time.Duration;

import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;

public class Swipe {
    
    static Duration duration=Duration.ofSeconds(1);
    
    //向上滑動
    public void swipeToUp(AndroidDriver driver) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        TouchAction action1=new TouchAction(driver).press(PointOption.point(width/2, height*3/4)).waitAction(WaitOptions.waitOptions(duration))
                                .moveTo(PointOption.point(width/2, height/4)).release();
        action1.perform();
    }

 
    //向下滑動
    public void swipeToDown(AndroidDriver driver) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        TouchAction action2=new TouchAction(driver).press(PointOption.point(width/2, height/4)).waitAction(WaitOptions.waitOptions(duration))
                                .moveTo(PointOption.point(width/2, height*3/4)).release();
        action2.perform();
    }

    //向左滑動
    public void swipeToLeft(AndroidDriver driver) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        TouchAction action3=new TouchAction(driver).press(PointOption.point(width*3/4, height/2)).waitAction(WaitOptions.waitOptions(duration))
                            .moveTo(PointOption.point(width/4,height/2)).release();
       action3.perform();
    }


    //向右滑動
    public void swipeToRight(AndroidDriver driver) {
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        TouchAction action4=new TouchAction(driver).press(PointOption.point(width / 4, height / 2)).waitAction(WaitOptions.waitOptions(duration))
                                .moveTo(PointOption.point(width*3/4,height/2)).release();
        action4.perform();
    }

}
View Code

然后循環2次,進入到最后一個廣告業,一定要有sleep,讓系統緩一會

            for(int i = 0 ; i<2; i++){
            
                swipe.swipeToLeft(androidDriver);
            
            Thread.sleep(2000);
            
        }
循環2次

第二步,第三張廣告業需要點擊圖片進入APP默認界面

第二個坑:一整張廣告業沒有ID XPATH也沒法用。因為整個屏幕就是一個圖片,點擊這個圖片才能進入首頁

解決辦法:使用className定位:androidDriver.findElementByClassName("android.widget.ImageView").click();

可算點擊圖片好使了。

第三步.點擊APP默認界面的“消息”按鈕,進入登錄頁面(不要問為啥這么設計,老板喜歡,干就完了)

還沒開始就遇到坑。因為會彈出系統彈窗提示問你是不是,同意APP使用相機,使用文件等等

這里經過我百般考證最后解決辦法:androidDriver.switchTo().alert().accept();     出處http://www.cnblogs.com/xiaoxi-3-/

終於關閉了系統彈窗。

第四步。第五步。第六步一起說了。因為是三個相同的內容

邏輯就是定位到手機元素位置。然后點擊他

使用的定位方法是xpath,關於XPATH的用法可以參考https://www.cnblogs.com/cnkemi/p/9180525.html   和selenium大同小異

大概的樣子就是這個格式:androidDriver.findElementByXPath("//*[contains(@content-desc,'登錄/注冊')]").click();

這里有一個好用的tip就是

 

 

第七步:7.輸入賬號密碼

這里遇到了一個驚天深坑,看起來平平淡淡,但是無法解決:我無法使用sendkey向輸入框內輸入任何數據

然后我開始填坑之旅:根據百度查詢

1.加一個clear動作,把輸入框里的原始內容刪除就好了-----------------失敗

2.有時候clear動作不好使,可以手動寫一個方法進行刪除-------------失敗

3.在輸入之前點擊一下,我就是這么正好的------------------------------失敗

4.使用安卓自帶的定位方式:uiautomator,來定位就好了,我又找jar,又學習如何寫,-------------失敗

5.把uiautomator改成uiautomator2就好了---------------------------失敗

6.卸載華為自帶的百度輸入法,就好了-------------------------失敗

7.問其他公司同事,發現他們從來遇到過這個問題--------------失敗

最后我實在是沒招了,我合計用一下別的APP看看是不是都這樣,還就只是我這個APP這樣。

選擇飛豬------------登錄頁面在模擬器無法加載出來,應該是保護模式

選擇學而思----------好使!!!!好使!!!!好使!!!!好使!!!!

最終結果是:是因為我測試的軟件的開發語言是flutter,雖然可以在安卓手機上安裝這個軟件。但是本質上他不是android語言開發的。所以導致。無法在輸入框輸入內容

這里我要表揚一下學而思APP的安卓開發和他們的開發領導,代碼寫的是真的好,清晰明了,每一個元素都有ID,我之前一直在糞坑蝶泳,突然發現這么好的代碼習慣,讓我感覺到原來還真的有寫的好的APP,愛了。

 

所以接下來自動化的測試工作我打算放在學而思了

 

而且就當我已經登錄成功了。接下來會開新章進行下面的嘗試工作

 

 

說一個飛豬讓我學習的新知識點

他們的軟件下面的

 

在定位的時候非常不好定位,隱藏的非常深而且是嵌套。

而且他們的ID都是:com.taobao.trip:id/fixed_bottom_navigation_icon

所以需要吧這些ID保存成list然后選擇某一個進行點擊

實現方法是

ArrayList<AndroidElement> eleList = new ArrayList<AndroidElement>();
eleList = (ArrayList<AndroidElement>) androidDriver.findElementsById("com.taobao.trip:id/fixed_bottom_navigation_icon");

eleList.get(3).click();

 

不能直接androidDriver.findElementsById("com.taobao.trip:id/fixed_bottom_navigation_icon").get(3).click;這樣會報錯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM