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 的標準 ——
投資 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
直接下載appium的GUI介面安裝包,下載地址:https://pan.baidu.com/s/1jGvAISu#list/path=%2F,Windows最新版本是AppiumForWindows_1.4.16.1.zip,MacOS最新版本是appium-1.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安裝等待安裝完成。
如果從官方的資源庫下載Appium-Python-Client失敗,請自行更換下載源重新下載。在命令列輸入"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);