1. 程式人生 > >Appium + Python史上最全最簡環境搭建步驟

Appium + Python史上最全最簡環境搭建步驟

一,為什麼是Appium

借一張圖:


1.1 Appium優點

l  開源

l  跨架構:NativeApp、Hybird App、Web App

l  跨裝置:Android、iOS、Firefox OS

l  不依賴原始碼

l  使用任何WebDriver 相容的語言來編寫測試用例。比如 Java, Objective-C, JavaScript with Node.js, PHP, Python, Ruby, C#, Clojure, 或者 Perl.

l  不需要重新編譯APP

1.2 Appium理念

l  你無需為了自動化,而重新編譯或者修改你的應用。

l  你不必侷限於某種語言或者框架來寫和執行測試指令碼。

l  一個移動自動化的框架不應該在介面上重複造輪子。(WebDriver)

l  無論是精神上,還是名義上,都必須開源。

1.3 Appium架構

借一張圖:


iOS: 蘋果的UIAutomation
Android 4.2+: Google的UiAutomator
Android 2.3+: Google’s Instrumentation. (由單獨的專案Selendroid提供支援 )

Appium 1.6版本以上增加了UiAutomator2

為了滿足上面跨平臺,把這些三方框架封裝成一套API —— WebDriver Api(客戶端到服務端的協議)

事實上 WebDriver 已經成為 web 瀏覽器自動化的標準,也成了 W3C 的標準 —— 

W3CWorking Draft,所以Appium在原有基礎上擴充了移動自動化相關的API。

投資 WebDriver 意味著你可以押寶在一個已經成為標準的獨立,自由和開放的協議。你不會被任何專利限制。

核心架構:Appium使用C/S架構,執行時候Service端會監聽Client端傳送的命令,接著在移動裝置上執行這些命令,然後將執行結果放在 HTTP 響應中返還給客戶端。

基於這架構可以做什麼?

可以用任何實現了該客戶端的語言來寫測試程式碼

可以把服務端放在不同的機器上

可以只寫測試程式碼,然後利用類似Testin 雲服務解決方案來解釋命令.

二,Appium環境搭建

需要用到的軟體如下:

1. jdk-8u121-window(32位的就下載32位的,64位的就下載64位的)。

2.Android-sdk_r24.3.4-windows(下載這個adt-bundle-windows-x86-20140624)

3.Python:(V3.6也可以)

4.appium:1.4.13.1

5.Node.js:node-v4.4.7-x64

6.Appium-python-Client

7.pycharm

其中1-5是可以先下載的,6則需要在完成前面的五個步驟後才進行,7為可選Ide工具。

2.1 JDK

 注意:

classpath值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 

path值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;是有“.”這個符號的不能漏掉

按快捷鍵win+r,在執行內輸入cmd,並輸入Java,回車,如果出來的是些用法中文,那說明這是正確的,在接下來輸入javac,回車,如果出現些用法中文,說明是環境變數配好了。

2.2 下載SDK

直接下載adt/Android studio完美整合,下載好後並進行解壓,然後開始配置三個變數:

1.解壓adt整合包到合適的路徑下面,比如D:\adt\

2.設定安卓環境變數

配置環境變數,

設定ANDROID_HOME系統變數為你的android SDK路徑,並把tools和platform-tools兩個目錄加入到系統的Path路徑裡。

eg:新增變數名:ANDROID_HOME 變數值: D:\adt\sdk

並把這句新增到 %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools記得要加上";"

配置完環境後,可以在執行cmd後輸入 adb(能看到當前版本號),再輸入android-h(tools目錄下的,如果出來一堆文字則是可以的) 

2.3 安裝python

進入官網或百度下載python下載好後安裝到所需安裝路徑,如在D盤中新建一個python資料夾,如d:\python34

安裝完成後將D:\python和D:\python\Scripts,新增到環境變數path下

開啟cmd輸入python,出現版本號,然後輸入print("helloworld!")這樣python就是安裝好了。

進入官網地址並下載:https://nodejs.org/en/download/

下載後一路傻瓜式安裝,安裝完成後,執行cmd,輸入node –v檢視版本號,然後輸入npm 

2.5 安裝appium服務端

方法一:進入官網地址並下載

https://bitbucket.org/appium/appium.app/downloads/

完整安裝帶UI的appium,可以從官網直接下載dmg(mac)或者zip(Windows),執行裡面的app即可。

appium安裝好後:

找到這個檔案安裝目錄D:\appium\node_modules\.bin

將上面的地址新增到環境變數path下;

方法二node.js包管理安裝

npm install -g appium

appium –v

npm install -g appium-doctor

appium-doctor

命令安裝的appium是控制檯程式,沒有UI介面。可到github搜尋appium的appiumDesktop專案中下載最新版本

但是由於GFW關係,此方法會在安裝過程中卡住或是直接報錯,解決辦法:掛VPN代理FQ;為了滿足國內開發人員的需要,淘寶npm映象cnpmjs.org可替代官方版本。開啟輸入:

npm install -g appium --registry=https://registry.npm.taobao.org

方法三:百度pan

直接下載appiumGUI介面安裝包,下載地址:https://pan.baidu.com/s/1jGvAISu#list/path=%2FWindows最新版本是AppiumForWindows_1.4.16.1.zipMacOS最新版本是appium1.5.3.dmg。筆者以windows為例,下載的AppiumForWindows_1.4.16.1.zip 進行解壓安裝,啟動appium,彈出錯誤提示框

很容易在網上查到錯誤原因,因為node.js需要.NETFramework框架的支援,所以在這裡需要安裝net framework4.5。當.net framework 4.5安裝完成,再次啟動Appium

開啟appium

appium安裝好後:

找到這個檔案安裝目錄D:\appium\node_modules\.bin

將上面的地址新增到環境變數path下;

Tips:檢查appium的所有需求環境

npm install -g appium-doctor

appium-doctor

開啟cmd,輸入appium-doctor,檢查環境是否OK,出現allchecks were successful,說明環境OK;

2.6 安裝Appium-Python-Client

進入cmd 輸入:pip install Appium-Python-Client。通過Python安裝等待安裝完成。

如果從官方的資源庫下載AppiumPythonClient失敗,請自行更換下載源重新下載。在命令列輸入"pip install Appium-Python-Client -ihttp://pypi.douban.com/simple"重試

Tips:檢查selenium版本3.3.3

安裝 Appium-Python-Client 的同時會安裝一個selenium模組.試著進入python3互動命令列,然後執行下面命令:

import selenium

selenium.__version__

如果你顯示的 selenium 版本是當前最新版本3.3.3的話,那麼最好使用下面命令將版本裝成3.0.2,網傳某些Api的話會報錯。

pip3 install -I selenium==3.0.2

2.7 安裝pycharm

需要啟用可以購買正版或網上搜索啟用碼。

三,簡單自動化測試用例編寫

3.1 新建Python unit test檔案

新建Python unit test型別檔案,對test類補充setup及teardown函式

對類MyTestCase新增setUp函式(這是測試用例執行前的準備動作,負責告訴appium監聽那個埠、與那個手機連線、安裝那個應用等資訊)

對類MyTestCase新增TearDown函式(這是測試用例執行結束後的動作,可以執行儲存執行結果等操作)

3.2 編寫測試用例

簡單例項點位兩個控制元件,執行點選事件

# MyTestCase.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import unittest
import selenium
import time
from appium import webdriver

class MyTestCase(unittest.TestCase):

    @classmethod
    def setUp(self):
        # super().setUp()
        print('selenium version = ', selenium.__version__)
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.4'
        desired_caps['deviceName'] = '192.168.1.54:5555'
        desired_caps['appPackage'] = 'com. xx'
        #desired_caps['app'] = 'F:// debug.apk'
        desired_caps['appActivity'] = 'com.xx.MainActivity'
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)


    def test_something(self):
        print('test_something click ------ ')

        # xpath:
        time.sleep(2)
        self.driver.find_element_by_xpath("//android.widget.ListView/android.widget.TextView[contains(@text,'測試')]").click()

        # uiautomator -UiSelector:
        # name方式在1.5版本後已廢除,能找到介面,不可使用,使用new UiSelector().text替代
        # self.driver.find_element_by_android_uiautomator("newUiSelector().text(\"測試\")").click()

        # class_name - child:
        # items =self.driver.find_elements_by_class_name('android.widget.TextView')
        # items[1].click()

        # id:
        time.sleep(2)
        self.driver.find_element_by_id('com.hisense.vod:id/test_video_resize').click()

    @classmethod
    def tearDown(self):
        time.sleep(5)
        print('tearDown ------ ')
        self.driver.quit()


if __name__ == '__main__':
    unittest.main()

四,踩坑

1 selenium版本3.3.3相容性

安裝 Appium-Python-Client 的同時會安裝一個selenium模組.試著進入python3互動命令列,然後執行下面命令:

import selenium

selenium.__version__

結果


如果你顯示的 selenium 版本是當前最新版本3.3.3的話,那麼最好使用下面命令將版本裝成3.0.2

pip3 install -I selenium==3.0.2

否則的話,在使用Appium-Python-Client的某些Api的話會報錯.應該是版本相容性的問題,3.11已修復的。

2 findElementByName無效.

Searching by name was deprecated over ayear ago and removed from 1.5. In general, searching by accessibility id isbetter for a variety of reasons.

如上findElementByName這個方法從Appium 1.5之後刪除了,但是API不經能找到並且也沒提示過時,這不坑爹嘛。後來使用下面的程式碼才解決用name,即text查詢元素的方法。

java:

1

2

String query = "new UiSelector().textContains" + "(\"" + locator.value + "\")";

webElements = mDriver.findElementsByAndroidUIAutomator (query);

Python:

self.driver.find_element_by_android_uiautomator("newUiSelector().text(\"測試\")").click()

3 據說Appium 1.6.3可以查詢 Toast 的資訊了.

試了下網上的例子發現不好使,一度以為是Client版本的問題。搞了半天才發現需要加下面的程式碼:

java:

1

capabilities.setCapability (MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);

4 安裝的時候重新簽名

無意中發現測試的時候彈Toast報錯,然後直接編譯安裝卻不儲存,猜測是不是在安裝過程中Appium改了啥,看了下Service日誌,竟然在安裝的時候重新簽名…

App not signed with debug cert.

2017-02-13 18:17:19:848 - info: [debug] [ADB] Resigning apk.

2017-02-13 18:17:23:938 - info: [debug] [ADB] Zip-aligning 'app-debug.apk'

2017-02-13 18:17:24:104 - info: [AndroidDriver] Remote apk path is /data/local/tmp/463eb03788048b4a1dacfe28545ee76e.apk

解決方法:

java:

capabilities.setCapability(AndroidMobileCapabilityType.NO_SIGN, true);