Appium 測試APK


介紹

Appium是一個開源、跨平台的測試框架,可以用來測試原生及混合的移動端應用。Appium支持iOS、Android及FirefoxOS平台測試。Appium使用WebDriver的json wire協議,來驅動Apple系統的UIAutomation庫、Android系統的UIAutomator框架。

特點:

  • 跨架構
  • 跨設備
  • 跨語言
  • 跨app
  • 不依賴源代碼
  • 不限制測試框架和平台

Appium的加載流程
• 調用android adb完成基本的系統操作

• 向android上部署bootstrap.jar包並啟動

• Forward android的端口到pc機器上
• Pc上監聽端口接受請求,使用webdriver協議

• 分析命令並轉通過forward的端口發給 bootstrap.jar
• Bootstrap.jar接受請求並把命令發給 uiautomator或者插樁體系

如:執行send_keys命令,發送到remote webdriver /wd/hub/session/xxx/keys,然后pc處理請求並轉發給android和iphone,接着Bootstrap.jar調用uiautomator,Uiautomator調用settext方法

實際應用(以Android平台為例)

1、安裝jdk

我裝的jdk1.8.0_20

2、安裝Android studio,使用其中的sdk

3、sdk環境配置

1)在環境變量的系統變量中新建變量ANDROID_HOME,變量值就是adk對應的路徑

2)點擊編輯系統變量path,添加sdk的tools和platform-tools

3)點擊確定,在cmd下運行adb devices 

出現下面的就是正確了

如果只顯示了list of devices attached 則需先在命令行輸入adb connect 127.0.0.1:62001(為了連接到夜神模擬器),再輸入adb devices即可

4、安裝模擬器(模仿Android的環境)

可以使用Android自帶的模擬器,這里我使用的是夜神模擬器(相對較為流暢)

5、啟動模擬器,出現桌面

6、安裝Python

7、安裝appium

8、安裝Appium-client 

注意:ip命令需要到python的scripts目錄下用(因為pip.exe在那)

cmd下跳轉到Python的script目錄下,輸入pip install appium-client,則自動安裝

9、雙擊打開ANDROID_HOME/tools下的uiautomatorviewer.bat

出現以下界面

點擊左上角第二個按鈕,就可以顯示模擬器中的界面

如果報錯,一般是因為abd的問題,則再重復3、3)步驟則可以解決

這個應用是可以對apk中的元素進行定位,方便寫Python腳本

Uiautomator具體的使用方法:

  • 先找index,再找text,若再找不到則嘗試找resource-id,再不行則嘗試找父類,再不行就只能通過坐標

  • 通過xpyth定位:

    findElementByXPath("//android.widget.TextView[10]") xpath下標從1開始,使用完整的classname

  • 通過id定位:findElementById("com.xwtec.zhy.xwlottery:id/grid_item_tv_red"); 
  • find_element_by_name(name對應uiautomator掃描后text的內容)
  • find_element_by_id(id對應resource-id)

  • find_element_by_class_name(class_name對應class)

  • find_element_by_accessibility_id(accessibility_id對應content-desc)

  • 定位到某個文本框,並輸入內容:

    text = driver.find_element_by_id("com.changhong.smartalbum:id/passwd_edit") text.send_keys("123456")

  • 滑動屏幕:
    • 獲取屏幕尺寸 width=self.driver.get_window_size()['width'] height=self.driver.get_window_size()['height']
    • 滑動屏幕 driver.swipe(width*9/10, height*1/2, width*1/10, height*1/2, 1000)

 推薦一個網址里面有一些具體的Appium Python的用法:http://blog.csdn.net/alvin_lam/article/details/50717338

10、編寫Python測試腳本

pyunit介紹:pyunit被稱作python版本的junit,一般python安裝好即帶有unittest,檢驗unittest是否存在的方法:import unittest

下面是一些Python腳本中操作app的用法:

  • 檢查app安裝情況(返回true/false), driver.is_app_installed(package_name)

  • 安裝app driver.install_app("x:/xxx.apk")

  • 卸載app driver.remove_app(package_name)

  • 打開通知欄 driver.open_notifications()

  • 關閉app driver.close_app()

  • 啟動app driver.launch_app()

  • 鎖定屏幕x秒(不是很好用,鎖定后屏幕無法解鎖,導致無法后續,本人未找到解鎖的方法) driver.lock(X)

  • 模擬搖晃設備 driver.shake

  • 重置應用 driver.resetApp()

  • 檢查是否存在某個activity(未找到則返回異常) driver.find_element_by_id(activity)

  • 獲取當前的activity: activity = self.driver.current_activity print(u"當前的activity是:", activity)

  • 等待activity啟動直到x秒超時,每隔y秒掃描一次 driver.wait_activity(activity, x, y)

  • 將app置於后台運行x s(注意:測試發現置於后台數秒后變為前台時,將是重新啟動app,進入首頁,而不是切入后台時的界面) driver.background_app(x)

  • 打印可用的輸入法 IME_LISE = driver.available_ime_engines print(IME_LISE)

  • 檢查設備是否有輸入法服務活動,返回True/False driver.is_ime_active()

  • 激活安卓設備中的指定輸入法(設備可用輸入法可以從“available_ime_engines”獲取)") driver.activate_ime_engine(IME_LISE[-1])

  • 退出鍵盤 driver.hide_keyboard()

 

11、運行Python腳本,若adb沒有啟動,重啟adb http://jingyan.baidu.com/article/d169e186b38f37436611d8fb.html

 如:使用以下模板:(以愛壁紙的登錄頁面為例)

#coding:utf-8
#Import the common package
import os
import unittest
from appium import webdriver
from time import sleep

#設置路徑信息
PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)

class LoginAndroidTests(unittest.TestCase):
    def setUp(self):
        #初始化測試平台
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.4.2'
        desired_caps['deviceName'] = '127.0.0.1:62001'
        #desired_caps['app'] = 'D:\apk\愛壁紙.apk'
        desired_caps['appPackage'] = 'com.lovebizhi.wallpaper'
        desired_caps['appActivity'] = 'com.lovebizhi.wallpaper.WelcomeActivity'
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

        
      
    def tearDown(self):
       
        self.driver.quit()
        
    def test_1(self):
        #測試導航頁
        print("start test1...")

        #判斷是否安裝愛壁紙APP
        wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
        if wallpaper:
            #self.driver.remove_app("com.lovebizhi.wallpaper")
            sleep(8)
            # 點擊某一壁紙圖片
            self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[4].click()
            sleep(4)
            # 點擊設置壁紙
            self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
            sleep(5)
        else:
            self.driver.install_app("D:\apk\愛壁紙.apk")
            sleep(30)

    def test_2(self):
        #測試導航頁
        print("start test2")

        #判斷是否安裝愛壁紙APP
        wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
        #
        if wallpaper:
            sleep(8)
            # 點擊某一壁紙圖片
            self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[5].click()
            sleep(4)
            # 點擊設置壁紙
            self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
            sleep(5)
        #否,安裝
        else:
            self.driver.install_app("D:\apk\愛壁紙.apk")
            sleep(30)
        
                  

if __name__ == '__main__':
    suite =unittest.TestLoader().loadTestsFromTestCase(LoginAndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

開啟Appium

運行Python腳本即可看到APP自動操作實現設置壁紙的整個流程

 


免責聲明!

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



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