我的目標是打開我的軟件,
輸入賬號密碼
登錄成功
退出成功
第一步打開我的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(); } }
如果不報錯,並且通過真機看到軟件打開。證明你相當於,執行了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(); } }
然后循環2次,進入到最后一個廣告業,一定要有sleep,讓系統緩一會
for(int i = 0 ; i<2; i++){ swipe.swipeToLeft(androidDriver); Thread.sleep(2000); }
第二步,第三張廣告業需要點擊圖片進入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;這樣會報錯
