appium-desktop集成FaceBook的WebDriverAgent在客户端实现一个WebDriver server,借助这个server远程驱动iOS设备实现自动化。
图1-1-1
1. 图1-1-1中1为iOS电脑。
2. 图1-1-1中2为安装的Python-Appium-client。
3. 图1-1-1中3为编写的自动化用例脚本。
4. 图1-1-1中4为Appium服务器。
5. 图1-1-1中5为被测试手机(iOS测试肯定是iOS手机)。
6. 图1-1-1中6为安装在被测试手机上的WDA(就是在PC和手机被测APP之间通信)。
7. 图1-1-1中7为被测试的APP。
Run流程:准备好自动化脚本后,在iOS电脑上面运行时(当然需要依赖Python-Appium-Client),首先Client跟appium-desktop服务器建立Session连接,再通过Session Driver发送测试命令至appium-desktop服务器,appium-desktop服务器会在连接的iPhone手机(功能参数中设置的手机)上安装运行WebDriverAgentRunner,并跟WebDriverAgentRunner建立通信,然后将测试命令发送给WebDriverAgentRunner,WebDriverAgentRunner接收到测试命令后驱动被测试APP运行动作,然后将驱动结果返回给appium-desktop服务器,appium-desktop服务器返回给Client。
1. Homebrew安装
iOS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
a. 在Mack中打开终端命令行工具,如图1-2-1。
图1-2-1
b. 在打开的命令行工具中输入命令 ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"并执行,执行时需要输入系统密码,如图1-2-2。
图1-2-2
c. 安装完成后有如下提示,如图1-2-3。
图1-2-3
d. 验证Homebrew是否安装成功,在终端中执行命令brew,看到如图1-2-4结果则安装成功。
图1-2-4
2. Node.js安装
运行在服务端的JavaScript。
a. 在该链接https://nodejs.org/en/中下载Mac客户端软件安装。
b. 检测安装,在终端分别执行命令npm –v和node –v 分别出现如图1-2-5则安装成功。
图1-2-5
3. Xcode安装
苹果系统上的集成开发工具,可以为 Mac OS 和 iOS 系统开发新应用。
a. 直接在 Mac 电脑上的 App Store 中搜索 Xcode 关键字,即可在搜索列表中看到它了,点击即可下载,如图1-2-6。
图1-2-6
b. 安装完成后,进行启动同意license。
4. 当然我们是用Python写脚本我们需要安装Python(我用的是Mac自带的Python,直接配置环境变量就好)。
5. 安装Appium客户端,pip install Python-Appium-Client。
6. Appium服务器安装,这里下载安装最新的appium-desktop,简单讲下appium-desktop以便后面的安装讲解。
图1-2-7
如图1-2-7,appium-desktop的iOS部分可以简单的理解为一个AppiumServer和WebDriverAgent,前面讲到自动化脚本运行时appium-desktop会在被测试手机上安装一个WebDriverAgentRunner的APP,这个WebDriverAgentRunner APP就是基于appium-desktop中的WebDriverAgent源码安装的。新下载安装的appium-dekstop,我们需要在appium-desktop安装目录下的WebDriverAgent目录中下载WebDriverAgent的相关依赖,然后用xcode打开WebDriverAgent工程进行证书签名(iOS编译安装的包这是必不可少的),然后再进行编译,安装,启动WebDriverAgentRunner APP看是否可正常运行。
a. https://github.com/appium/appium-desktop/releases/tag/v1.3.1下载安装Mac平台的版本(这个版本是我在写的时候最新的,我自己用的1.2.7)
b. 进入appium-desktop中的WebDriverAgent目录下下载依赖。
i. 打开文件夹-应用程序-找到appium-右键-显示包内容,如图1-2-8。
图1-2-8
ii. 进入WebDriverAgent目录(Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent)。
iii. 执行命令./Scripts/bootstrap.sh,直到下载完成(我已经安装过了,这里就不截图了,有错误一定要根据错误处理)。有问题可以留言或者给订阅号发消息。
iv. 给WDA设置签名证书,打开Xcode点击Open another project..如图1-2-9。
图1-2-9
v. 在打开的文件选择窗口中shift+command+g输入路径/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent,这里的路径根据自己的WebDriverAgent所在路径来确认,点击Go 如图1-2-10进入1-2-11。
图1-2-10
图1-2-11
vi. 选择WebDriverAgent.xcodeproj点击Open进入图1-2-12并且会自动编译,如果编译失败就找下原因,解决失败问题。
图1-2-12
vii. 给WebDriverAgentLib配置证书和修改Bundle Id,勾选自动管理证书,增加开发者账号并选择账号,如图1-2-13。
图1-2-13
viii. 点击WebDriverAgentLib选择WebDriverAgentRunner,以上面同样的方法修改Bundle Id和设置开发者证书,如图1-2-14。
图1-2-14
c. 选择WebDriverAgentRuner和需要安装的手机,键盘执行command+u 如图1-2-15,我用的模拟器iPhone 7.
图1-2-15
d. 检查安装运行情况,我用的是模拟器(iPhone 7),运行成功后你会看到如下日志如图1-2-16,手机上面会有一个WebDriverAgentRunner APP且为运行状态,如图1-2-17。
图1-2-16
图1-2-17
e. 到这里我们的appium-desktop就安装好了,如果WebDriverAgent存在问题又无法解决,可以自己去git上下载WebDriverAgent的最新源码包进行编译安装运行,没问题后再替换掉appium-desktop中的WebDriverAgent目录;git上下载的WebDriverAgent源码编译安装运行起来时日志中的ServerURLHere中端口不会是0(appium-desktop中集成WDA应该被处理成了0),应该是8100,在浏览器中是可以访问的。
appium-Desktop是一款用于Mac、Windows和Linux的开源应用,它提供了Appium自动化服务器UI界面中的强大功能;你可以设置功能选项、启动/停止服务器、查看日志等;你也可以使用Inspector来查看应用程序的元素,了解它们的基本信息,并与它们进行基本的交互,还可以录制生成不同语言的脚本。
1. 前面章节已经介绍如何安装appium-desktop且已经安装好了,找到桌面应用图标进行启动,进入启动界面,如图1-3-1。
图1-3-1
2. 输入Host,此处本机使用就输入127.0.0.1,端口默认端口即可,点击Start Server,启动界面如图1-3-2(这个服务就是启动起来了)。
图1-3-2
图1-3-3
图1-3-4
1. 进入Start Inspector Session的入口,见图1-3-5。
图1-3-5
2. Start Inspector Session界面展示,如图1-3-6。
图1-3-6
a. Custom Server-Remote Host:服务ip地址,本机为127.0.0.1。
b. Custom Server-Remote Port:服务端口,默认4723。
c. Custom Server-Desired Capabilities:功能参数设置,如图1-3-7。
图1-3-7
d. Custom Server-Save Capability Sets:功能配置保存后都在这个列下,如1-3-8。
图1-3-8
3. Inspector使用,主要用于获取UI元素属性,录制脚本等(类似Android的uiautomatorviewer)。
a. Inspector入口,如图1-3-9。
图1-3-9
b. 点击Start Session后appium-desktop会在你的手机上面安装WebDriverAgentRunner,需要注意的是开始编译这个WebDriverAgent用的是开发者证书的话,在安装WebDriverAgentRunner后需要在手机设置-通用-描述文件与设备管理中对你的证书设置信任;如果是正式证书则不用设置。
c. 手机上安装后会先启动WebDriverAgentRunner(如果是需要重新装APP,则会最先重装APP,再安装WebDriverAgentRunner),再启动被测试App,然后可在Inspector中看到如图1-3-10界面。
图1-3-10
d. 属性展示区介绍,如图1-3-11。
图1-3-11
i. 操作区,可对选择的控件进行操作,操作效果会对应在手机上生效(按钮可以点击;输入框可以输入值;输入框可以清除输入框中已经存在的内容)。
ii. 属性区,我们在写自动化脚本的时候就会用到,主要会用到accessibility id,xpath,type,value,name等这些在实战登录脚本中会简单讲到;方法封装章节会详细介绍。
4. 自动化录制功能(Start Recording),这里的录制功能可以给我们写脚本作为参考(特别是小白,不知道到用什么方法时或者不知道用元素的什么属性时),当然不要过多依赖这个,因为多写写就熟悉了。
a. 自动化录制功能入口,如图1-3-12
图1-3-12
b. 点击Start Recording按钮,UI界面展示区选择用户名输入框,点击属性展示区的 SendKeys并输入1234567890并确认输入,此时你会看到连接的手机上的测试APP执行了该操作,Inspector的UI展示界面也执行了该操作,会看到如图1-3-13 Python脚本的脚本,如图1-3-14 Java脚本的脚本,如图1-3-15 Ruby脚本的脚本。
图1-3-13
图1-3-14
图1-3-15
1. 我们需要获取被测试手机设备信息
a. 手机平台:当然我们这是iOS。
b. 被测试手机系统版本,被测手机连接电脑,打开xcode-Window-Devices and Simulators-Devices,这里我是真机系统为11.2.1 如图1-4-1;模拟器就在Simulators里面查看如图1-4-2。
图1-4-1
图1-4-2
c. 手机设备名称如图1-4-3,这里是iPhone 6s。
图1-4-3
d. 手机的udid,如图1-4-4,模拟器不需要。
图1-4-4
2. 我们需要获取被测试APP的包名,这个可以直接找开发GGMM要,我这里用的小超人APP,包名为com.yatang.xc.xcr,大家如果要用这个APP可以自己下载哈,登录用例也是用这个APP哈。
3. 我们需要获取登录流程中使用到的控件的属性(如id……)
这里参照前面1.3.4的Inspector使用,连接手机—>启动appium-desktop—>输入基本信息启动—>Start Inspector Session—>Custom Server—>配置Desired Capabilities—>Start Session。
a. 流程:启动APP—>输入“用户名”—>输入“密码”—>点击“登录”。
b. 获取“加盟商账号”输入框控件id属性:loginName,方法如图1-4-5所示:
图1-4-5
c. 同样的方法获取其他控件属性,“密码输入框”:loginPassword;“登录按钮”:loginBtn。
4. 配置并启动Appium服务器
a. 打开Appium服务器程序,因为是本机测试,设置中默认配置端口和本机IP,如图1-4-6所示:
图1-4-6
b. 启动Appium服务 如图1-4-7所示:
图1-4-7
开始开发自动化登录脚本
a. 在脚本开始位置添加对Appium的Python客户端库的引入,代码如下:
from appium import webdriver
b. 添加一个字典变量,我定义名称为desiredCaps,并向desiredCaps添加键和值,代码如下:
#定义功能参数字典
desiredCapabilities = {}
#设置app安装包存放路径,不需要安装可不带这个参数
# desiredCapabilities["app"]="/Users/yatang/.jenkins/workspace/XCR-iOS-Release/build/XCR-Beta.ipa"
#设置平台
desiredCapabilities["platformName"]="iOS"
#设置被测试手机的设备名称
desiredCapabilities["deviceName"]="iPhone 6s"
#设置被测试手机版本
desiredCapabilities["platformVersion"]="11.2.1"
#设置被测试手机的uiid,模拟器可以不用设置
desiredCapabilities["udid"]="b114400000000003a35df9746d5b090000000000"
#设置被测试app的包名
desiredCapabilities["bundleId"]="com.yatang.xc.xcr"
c. 以desiredCaps作为参数初始化Webdriver,代码如下,代码解释如图1-4-8所示:
#建立会话获取driver
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desiredCapabilities)
图1-4-8
d. 登录流程测试代码如下
#等待app启动
time.sleep(5)
#查找用户名输入框,并输入登录名
driver.driver.find_element_by_accessibility_id("loginName").send_keys("1234567890")
#等待输入用户名
time.sleep(5)
#查找密码输入框,并输入密码
driver.driver.find_element_by_accessibility_id("loginPassword").send_keys("123456")
#等待输入密码
time.sleep(5)
#查找登录按钮,并点击登录
driver.driver.find_element_by_accessibility_id("loginBtn").click()
#等待登录
time.sleep(5)
#断开会话
driver.quit()
PS:Webdriver提供的查找控件方法有好几种:通过控件ID,控件的类型和值组合,控件的XPath路径,我建议小伙伴们首选控件ID,因为ID查找效率高且比较稳定,一般很少改变。当然有些控件可能没有ID或者存在多个控件ID相同,在框架方法封装章节我会详细讲解策略和方法。
这样我们的自动化登录脚本就开发完了,保存脚本,运行就能看到效果了。
完整代码如下:
#-*- coding:utf-8 -*-
from appium import webdriver
import time
#定义功能参数字典
desiredCapabilities = {}
#设置app安装包存放路径,不需要安装可不带这个参数
# desiredCapabilities["app"]="/Users/yatang/.jenkins/workspace/XCR-iOS-Release/build/XCR-Beta.ipa"
#设置平台
desiredCapabilities["platformName"]="iOS"
#设置被测试手机的设备名称
desiredCapabilities["deviceName"]="iPhone 6s"
#设置被测试手机版本
desiredCapabilities["platformVersion"]="11.2.1"
#设置被测试手机的uiid,模拟器可以不用设置
desiredCapabilities["udid"]="b114400000000003a35df9746d5b090000000000"
#设置被测试app的包名
desiredCapabilities["bundleId"]="com.yatang.xc.xcr"
#建立会话获取driver
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desiredCapabilities)
#等待app启动
time.sleep(5)
#查找用户名输入框,并输入登录名
driver.driver.find_element_by_accessibility_id("loginName").send_keys("1234567890")
#等待输入用户名
time.sleep(5)
#查找密码输入框,并输入密码
driver.driver.find_element_by_accessibility_id("loginPassword").send_keys("123456")
#等待输入密码
time.sleep(5)
#查找登录按钮,并点击登录
driver.driver.find_element_by_accessibility_id("loginBtn").click()
#等待登录
time.sleep(5)
#断开会话
driver.quit()
上面这个自动化登录脚本样例,仅用于小伙伴们入门如何下手去写一个appium-desktop iOS的测试脚本。它是很脆弱的执行效率较低的,会受环境和App本身影响很大,比如固定等待时间(这个时间不可控,该方式不可取),另外对脚本运行过程中出现的异常没有做处理,如果脚本异常会导致整个脚本失败。我们心中的自动化肯定是想高效稳定的!这些问题在框架方法封装章节会进行详细讲解。