Mac端Appium自動化測試環(huán)境配置及使用說明

前言

參考這篇博客,我搭建了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來進行驗證。

  1. $ appium-doctor --ios


    image

如果是全綠色表示都是成功的,如果沒有安裝或者缺少組件,那肯定看不到這種狀態(tài)。

安裝

$ npm install appium-doctor -g

如果順利安裝,則會出現(xiàn)如下:


image

這是部分截圖,如果出現(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,安裝方式如下:

  1. $ gem install appium_lib
    我同樣遇到了權限的問題,需要sudo權限。
  2. $ sudo gem install appium_lib 然后報錯了
    image

    報錯,我的ruby版本過低了,那當然是升級ruby啊。在網(wǎng)上找的方案中,是通過rubygems-update來升級ruby,我試了一下,發(fā)現(xiàn)并不方便。所以我選擇安裝rvm,使用rvm來升級ruby。

升級ruby的方式有多種,這里簡單介紹一下。

  1. 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

image
這是安裝成功后的畫面,但是我遇到了一個error,
image
有點懵,谷歌了一下。提示我需要更新bash。好的。我隨之更新了 brew upgrade bash
再執(zhí)行安裝命令,還是報同樣的錯誤。
發(fā)現(xiàn)問題其實是在于libreadline.6.dylib不能成功loaded,試著根據(jù)目錄找到這個庫,發(fā)現(xiàn)沒找到。
image
創(chuàng)建軟鏈接做個重定向吧。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來獲取。以及錄制腳本的相關操作。會在下一篇補充了。

補充

建議參考Appium的官方文檔,有很大的參考價值。
這是Appium的示例代碼
python示例

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容