前言
參考這篇博客,我搭建了iOS的自動化測試環(huán)境,基于Appium。以下就是在搭建的過程中遇到的若干問題。
框架選擇
基于這幾項標準:
- 同時支持iOS、Android、H5,且盡量能保持接口統(tǒng)一,減少開發(fā)維護成本;
- 編程語言支持Python/Ruby;
- 用戶量大,文檔豐富。
最后確定的是Appium
Appium簡介
Appium的具體介紹,參考Appium。
這里是幾點比較好的理念。
- 采用Appium時,無需對被測應用做任何修改,也無需嵌入任何東西;
- Appium對iOS和Android的原生自動化測試框架進行了封裝,并提供了統(tǒng)一的API,減少了自動化測試代碼的維護工作量;
- Appium采用Client-Server的架構設計,并采用標準的HTTP通信協(xié)議;Server端負責與iOS/Android原生測試框架交互,無需測試人員關注細節(jié)實現(xiàn);Client端基本上可以采用任意主流編程語言編寫測試用例,減少了學習成本。
環(huán)境準備(iOS)
這個部分是根據(jù)博客的流程來的,也是此篇的重點,介紹中間集成中遇到的各種問題,以及解決方式。
在Appium中測試iOS時,依賴于Apple開發(fā)環(huán)境,比如Xcode(大于4.6.3)、Apple Developer Tools,當然,這對于我而言肯定是已經(jīng)具備好的。
在安裝Appium之前,為了確保Appium的相關依賴已經(jīng)準備就緒,可以使用Appium-doctor來進行驗證。
-
$ appium-doctor --ios
image
如果是全綠色表示都是成功的,如果沒有安裝或者缺少組件,那肯定看不到這種狀態(tài)。
安裝
$ npm install appium-doctor -g
如果順利安裝,則會出現(xiàn)如下:

這是部分截圖,如果出現(xiàn)了紅色error信息的話,那就是安裝失敗了。比如:ERR! { Error: EACCES: permission denied, access '/usr/local/lib/node_modules' 這樣的提示,那就是沒有權限。需要再剛剛的命令行中添加sudo,或直接切換到root模式下。我選擇添加sudo
即 $ sudo npm install appium-doctor -g
appium-doctor 驗證失敗
目前我這里只出現(xiàn)了一種驗證失敗的情況,后續(xù)發(fā)現(xiàn)更多的話會及時補充。
我遇到的問題是:AppiumDoctor ? Carthage was NOT found!
提示我沒有Carthage,直接安裝一個即可。
$ brew install carthage
( #carthage:類似cocoapods管理第三方代碼,自動將工程編譯為動態(tài)庫 )我采用 homebrew 來安裝。安裝成功了,但是提示我brew有點老舊,需要升級(brew update),這算是題外話
$ appium-doctor --ios 再次驗證,發(fā)現(xiàn)已經(jīng)全部驗證成功。好了,到下一步。
經(jīng)過以上兩步已經(jīng)安裝好了Appium的相關依賴。
安裝Appium
有多種方式安裝。Appium采用Client-Server的架構方式,我們這里指的安裝是Server部分。
- 源代碼編譯安裝;
- Terminal中通過npm命令安裝;
- 直接下載appium.dmg安裝
這里比較推薦第三個,直接安裝應用程序,雖然看起來沒有那么高大上,但是比較方便,除了GUI界面操作更直觀以外,更重要的原因是,相比于命令行運行方式,Appium app多了一個Inspector模塊,可以調用模擬器運行被測應用程序,并且可以更方便地在預覽頁面中查看UI元素的層級結構和詳細控件屬性,極大地提高了編寫測試腳本的效率。
Client部分是編寫腳本。其實我們原本可以不安裝任何東西,只需要選擇任意一門開發(fā)語言,然后直接基于WebDriver的C/S協(xié)議即可編寫自動化測試代碼。
我們現(xiàn)在安裝,主要就是安裝Library。
比如選擇ruby,那么需要安裝的Library就是appium_lib,安裝方式如下:
- $ gem install appium_lib
我同樣遇到了權限的問題,需要sudo權限。 -
$ sudo gem install appium_lib 然后報錯了image
報錯,我的ruby版本過低了,那當然是升級ruby啊。在網(wǎng)上找的方案中,是通過rubygems-update來升級ruby,我試了一下,發(fā)現(xiàn)并不方便。所以我選擇安裝rvm,使用rvm來升級ruby。
升級ruby的方式有多種,這里簡單介紹一下。
-
gem install rubygems-update
update_rubygems
這是通過rubygems來升級。我完成了第一步之后,遇到了另外一個問題,AML safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0).有點連鎖反應啊,遂換成了其他的方案升級。當然,這個方案也是有效的,我遇到的這些問題興許你們不會遇到的。
通過rvm安裝
$ curl -L get.rvm.io | bash -s stable


brew upgrade bash再執(zhí)行安裝命令,還是報同樣的錯誤。
發(fā)現(xiàn)問題其實是在于libreadline.6.dylib不能成功loaded,試著根據(jù)目錄找到這個庫,發(fā)現(xiàn)沒找到。

ln -s /usr/local/opt/readline/lib/libreadline.7.dylib /usr/local/opt/readline/lib/libreadline.6.dylib
再次執(zhí)行安裝命令,出現(xiàn)了成功的畫面。BingGo!rvm安裝好了。接下來看下一步。
-
$ ruby -v 查詢當前版本,發(fā)現(xiàn)我的版本不高 image
-
$ rvm list known
image -
$ rvm install 2.4
image
這就是安裝好了。再次檢查,$ ruby -v嗯?可能你會出現(xiàn)版本還是舊的情況,當然如果沒有出現(xiàn),就繼續(xù)執(zhí)行接下來的。 安裝好了,但是檢查的版本依舊是舊的,十有八九ruby的環(huán)境變量路徑錯了。兩個辦法。第一個辦法:添加ruby至環(huán)境變量。
vim .profile
vim .bashrc
vim .bash_profile
然后重啟source
source .profile
source .bash_profile
第二個辦法,如果是iterm2的話,選擇菜單欄--profiles--選擇login shell,打開新的窗口。執(zhí)行 $ rvm use 2.4.1(我的是2.4.1的版本),然后執(zhí)行ruby -v 就可以發(fā)現(xiàn)是最新的了。
真是一步一個腳印??!
3.通過homebrew安裝
$ brew install ruby
安裝后檢查ruby版本,如果出現(xiàn)了上述一樣的情況,那么也可以采用那兩種方案。
至此,ruby的Library就搭建好了。
接下來看python。python比較簡單。
`$ pip install Appium-Python-Client` 搞定
Appium使用
先記住這個:
{
"platformName": "iOS",
"platformVersion": "11.0",
"deviceName": "iPhone 7",
"automationName": "XCUITest",
"app": "/path/to/my.app"
}
很重要!很重要!很重要!
Appium開始
前面介紹的只是desktop的使用而已。接下來介紹重點的服務端和客戶端的配合使用。以python為例。
服務端
brew install node //get node.js
npm install -g appium //get appium
npm install wd //get appium client
appium & //start appium
這幾步每一步都可能出問題。我在第一步和第二步均出現(xiàn)了問題。我安裝了node,但是link錯了。
此乃解決之道(源自Stack Overflow):
sudo brew uninstall node
brew update
brew upgrade
brew cleanup
brew install node
sudo chown -R $(whoami) /usr/local
brew link --overwrite node
brew postinstall node
后面幾步算是比較順利的。
直到我啟動之后執(zhí)行腳本。因為我使用的是python,所以命令是:
python appiumSimpleDemo.py
然并卵,失敗了。原因是我安裝了好幾個python版本,在不同的路徑之下,解決的辦法是:修改路徑;或者直接使用python3啟動即可。不更換路徑了。
python3 appiumSimpleDemo.py
客戶端
任重而道遠。
其實上文已經(jīng)介紹過了。
附腳本文件:
import unittest
import os
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction
class appiumSimpleTezt (unittest.TestCase):
def setUp(self):
app = os.path.abspath('/Users/Jeffrey/Desktop/CareVoice.app')
self.driver = webdriver.Remote(
command_executor = 'http://127.0.0.1:4723/wd/hub',
desired_capabilities = {
'app':app,
'platformName': 'iOS',
'platformVersion': '11.2',
'deviceName': 'iPhone 8',
'bundleId': 'co.kangyu.Kangyu',
'automationName':'XCUITest',
"noReset": 'true'
# 'udid': '45751dc8cd8d737bbcea48a0307d50419161afb8'
}
)
def test_ui_computation(self):
print ("Hello world")
sleep(2)
print ("nihaoa")
driver = self.driver
el1 = driver.find_element_by_accessibility_id("Profile")
el1.click()
print ('點擊profile')
el2 = driver.find_element_by_accessibility_id("Sign In")
el2.click()
print ('點擊signIn')
el3 = driver.find_element_by_xpath("http://XCUIElementTypeApplication[@name=\"The CareVoice\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeScrollView/XCUIElementTypeOther[1]/XCUIElementTypeScrollView")
el3.click()
print ('點擊密碼登錄')
el4 = driver.find_element_by_accessibility_id("phone")
print ('點擊用戶名')
el4.send_keys("12345678902")
print ('輸入用戶名')
el5 = driver.find_element_by_xpath("http://XCUIElementTypeApplication[@name=\"The CareVoice\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeScrollView/XCUIElementTypeOther[3]/XCUIElementTypeOther[1]/XCUIElementTypeSecureTextField")
print ('點擊密碼')
el5.send_keys("111111")
print ('輸入密碼')
el5.click()
el6 = driver.find_element_by_accessibility_id("Sign In")
el6.click()
print ('點擊登錄')
def tearDown(self):
sleep(20)
print ('退出程序')
self.driver.quit()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)
unittest.TextTestRunner(verbosity=2).run(suite)
其中使用了錄制的功能,簡化書寫腳本的過程。
關于取控件的部分(基本算是python測試案例的事情了),需要根據(jù)Appium-desktop來獲取。以及錄制腳本的相關操作。會在下一篇補充了。




