Mac端Appium自动化测试环境配置及使用说明

前言

参考这篇博客,我搭建了iOS的自动化测试环境,基于Appium。以下就是在搭建的过程中遇到的若干问题。

框架选择

基于这几项标准:

  • 同时支持iOS、Android、H5,且尽量能保持接口统一,减少开发维护成本;
  • 编程语言支持Python/Ruby;
  • 用户量大,文档丰富。

最后确定的是Appium

Appium简介

Appium的具体介绍,参考Appium
这里是几点比较好的理念。

  • 采用Appium时,无需对被测应用做任何修改,也无需嵌入任何东西;
  • Appium对iOS和Android的原生自动化测试框架进行了封装,并提供了统一的API,减少了自动化测试代码的维护工作量;
  • Appium采用Client-Server的架构设计,并采用标准的HTTP通信协议;Server端负责与iOS/Android原生测试框架交互,无需测试人员关注细节实现;Client端基本上可以采用任意主流编程语言编写测试用例,减少了学习成本。

环境准备(iOS)

这个部分是根据博客的流程来的,也是此篇的重点,介绍中间集成中遇到的各种问题,以及解决方式。

在Appium中测试iOS时,依赖于Apple开发环境,比如Xcode(大于4.6.3)、Apple Developer Tools,当然,这对于我而言肯定是已经具备好的。

在安装Appium之前,为了确保Appium的相关依赖已经准备就绪,可以使用Appium-doctor来进行验证。

  1. $ appium-doctor --ios


    image

如果是全绿色表示都是成功的,如果没有安装或者缺少组件,那肯定看不到这种状态。

安装

$ npm install appium-doctor -g

如果顺利安装,则会出现如下:


image

这是部分截图,如果出现了红色error信息的话,那就是安装失败了。比如:ERR! { Error: EACCES: permission denied, access '/usr/local/lib/node_modules' 这样的提示,那就是没有权限。需要再刚刚的命令行中添加sudo,或直接切换到root模式下。我选择添加sudo
即 $ sudo npm install appium-doctor -g

appium-doctor 验证失败

目前我这里只出现了一种验证失败的情况,后续发现更多的话会及时补充。
我遇到的问题是:AppiumDoctor ✖ Carthage was NOT found!
提示我没有Carthage,直接安装一个即可。

$ brew install carthage
( #carthage:类似cocoapods管理第三方代码,自动将工程编译为动态库 )我采用 homebrew 来安装。安装成功了,但是提示我brew有点老旧,需要升级(brew update),这算是题外话

$ appium-doctor --ios 再次验证,发现已经全部验证成功。好了,到下一步。

经过以上两步已经安装好了Appium的相关依赖。

安装Appium

有多种方式安装。Appium采用Client-Server的架构方式,我们这里指的安装是Server部分。

  • 源代码编译安装;
  • Terminal中通过npm命令安装;
  • 直接下载appium.dmg安装

这里比较推荐第三个,直接安装应用程序,虽然看起来没有那么高大上,但是比较方便,除了GUI界面操作更直观以外,更重要的原因是,相比于命令行运行方式,Appium app多了一个Inspector模块,可以调用模拟器运行被测应用程序,并且可以更方便地在预览页面中查看UI元素的层级结构和详细控件属性,极大地提高了编写测试脚本的效率。

Client部分是编写脚本。其实我们原本可以不安装任何东西,只需要选择任意一门开发语言,然后直接基于WebDriver的C/S协议即可编写自动化测试代码。
我们现在安装,主要就是安装Library。
比如选择ruby,那么需要安装的Library就是appium_lib,安装方式如下:

  1. $ gem install appium_lib
    我同样遇到了权限的问题,需要sudo权限。
  2. $ sudo gem install appium_lib 然后报错了
    image

    报错,我的ruby版本过低了,那当然是升级ruby啊。在网上找的方案中,是通过rubygems-update来升级ruby,我试了一下,发现并不方便。所以我选择安装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
再执行安装命令,还是报同样的错误。
发现问题其实是在于libreadline.6.dylib不能成功loaded,试着根据目录找到这个库,发现没找到。
image
创建软链接做个重定向吧。ln -s /usr/local/opt/readline/lib/libreadline.7.dylib /usr/local/opt/readline/lib/libreadline.6.dylib

再次执行安装命令,出现了成功的画面。BingGo!rvm安装好了。接下来看下一步。

  • $ ruby -v 查询当前版本,发现我的版本不高
    image
  • $ rvm list known


    image
  • $ rvm install 2.4

    image

    这就是安装好了。再次检查,$ ruby -v 嗯?可能你会出现版本还是旧的情况,当然如果没有出现,就继续执行接下来的。

  • 安装好了,但是检查的版本依旧是旧的,十有八九ruby的环境变量路径错了。两个办法。第一个办法:添加ruby至环境变量。

vim .profile
vim .bashrc
vim .bash_profile

然后重启source

source .profile
source .bash_profile

第二个办法,如果是iterm2的话,选择菜单栏--profiles--选择login shell,打开新的窗口。执行 $ rvm use 2.4.1(我的是2.4.1的版本),然后执行ruby -v 就可以发现是最新的了。
真是一步一个脚印啊!

3.通过homebrew安装
$ brew install ruby
安装后检查ruby版本,如果出现了上述一样的情况,那么也可以采用那两种方案。

至此,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

这几步每一步都可能出问题。我在第一步和第二步均出现了问题。我安装了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

后面几步算是比较顺利的。
直到我启动之后执行脚本。因为我使用的是python,所以命令是:
python appiumSimpleDemo.py
然并卵,失败了。原因是我安装了好几个python版本,在不同的路径之下,解决的办法是:修改路径;或者直接使用python3启动即可。不更换路径了。
python3 appiumSimpleDemo.py

客户端

任重而道远。
其实上文已经介绍过了。

附脚本文件:


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("//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("//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测试案例的事情了),需要根据Appium-desktop来获取。以及录制脚本的相关操作。会在下一篇补充了。

补充

建议参考Appium的官方文档,有很大的参考价值。
这是Appium的示例代码
python示例

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容