Docker 自修

IOS + Appium自动化教程

2021-12-07  本文已影响0人  iLeooooo

转载

前言

项目闲置下来了,终于抽空有时间搞自动化了,看了下网上的教程基本通篇都是android自动化的介绍 ,ios自动化方面的内容网上简介的少之可怜。由于本人对ios自动化也是第一次做,甚至对苹果电脑的使用都不太熟悉,花了大概一周时间粗略的看下ios开发知识,网上随手下载的来源于这两本pdf 《iOS开发从入门到精通.pdf》、《iOS开发指南:从零基础到App上架.pdf 》、至于Mac笔记本的学习完全是边使用边查询操作 ;本文完全秉着指导小白操作的流程带你一步一步搭建IOS自动化测试环境

以下内容参考了如下网站:

IOS 自动化相关框架介绍

自动化测试类工具 随着移动互联网的兴起,APP 测试的越来越被重视!Android 系统因为自己的开源性,测试工具和测试方法比较广为流传,但是 iOS 系统的私密性,导致很多测试的执行都有点麻烦。

为了帮助大家更好的执行 iOS APP 的测试,以下为大家收集了非常全面的 iOS 测试工具,涵盖各大领域,希望各位能有所认识

自动化测试类工具

1. UIAutomation

UIAutomation 是苹果提供的 UI 自动化测试框架,使用 JavaScript 编写。

基于 UIAutomation 有扩展型的工具框架和驱动型的框架。扩展型框架以 JavaScript 扩展库方法提供了很多好用 js 工具,注入式的框架通常会提供一些 Lib 或者是 Framework,要求测试人员在待测应用的代码工程中导入这些内容,框架可以通过他们完成对 app 的驱动。

驱动型 UI Automation 在自动化测试底层使用了 UI Automation 库,通过 TCP 通信的方式驱动 UI Automation 来完成自动化测试,通过这种方式,编辑脚本的语言不再局限于 JavaScript。

这个工具在 iOS UI 自动化测试中使用非常广泛。

具体参考资料:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html

2.XCTest

XCTest 是苹果在 iOS 7 和 Xcode5 引入的一个简单而强大的测试框架,集成在 Xcode 中,用来编写测试代码。它提供了各个层次的测试。

XCTest 测试编写起来非常简单,并且遵循 xUnit 风格。

Xcode 在创建工程时,会默认使用 XCTest,并且默认创建了 Unit Test(单元测试)UI Test(界面测试)两个 Target,其中 Unit Test 主要用于测试代码的大部分基本功能,比如绝大多数 Model 的类和方法测试,业务逻辑测试,网络接口调用测试等等。

UI Test 一般会考虑到用户的交互流程,模拟用户的交互操作,利用 XCTest 的 UI 记录特性来获取界面上的一些列视图元素和操作事件,然后在测试方法中触发事件。

所以这是一个可以提供各个层次的测试的框架,比如单元测试,自动化测试,性能测试等。

具体参考资料:

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html

3. KIF

KIF 是 Keep It Functional 项目的缩写,是一款 iOS app 功能性测试框架,来自 Square,该测试框架只支持 iOS。

所有测试使用 Objective-C 语言编写,对测试人员来讲,需要熟练的掌握 Objective-C 语言 , 对苹果开发者来说非常容易上手,更是一款开发者广为推荐的测试工具。

KIF 使用未公开的 Apple API(私有 API),这对于测试目的而言是安全的,基于第三方 iOS UI 的单元测试框架,所以可以做项目的单元测试,也可以做 UI 集成测试。但缺点是运行较慢。

具体参考资料:https://github.com/kif-framework/KIF

4. Frank

Frank 是 iOS 开发环境下一款实现自动测试的工具,Xcode 环境下开发完成后,通过 Frank 实现结构化的测试用例,其底层语言为 Ruby,作为一款开源的 iOS 测试工具,在国外已经有广泛的应用。

但是国内相关资料却比较少。其最大的优点是允许我们用熟悉的自然语言实现实际的操作逻辑。

它提供了针对 iOS 平台的功能测试能力,可以模拟用户的操作对应用程序进行黑盒测试,并且使用 Cucumber 编写测试用例,使测试用例如同自然语言一样描述功能需求,让测试以“可执行的文档”的形式成为业务客户与交付团队之间的桥梁。

优点: 测试场景是在 Cucumber 的帮助下,用可理解的英语句子写的,还有活跃的社区支持,以及不断扩大中的库。

缺点:对手势的支持有限,所以在设备上运行测试有点难。

具体参考资料:https://www.testingwithfrank.com/

5. Calabash-iOS

Calabash 是一个适用于 iOS 和 Android 开发者的跨平台 app 测试框架,可用来测试屏幕截图、手势和实际功能代码。

Calabash 开源免费并支持 Cucumber 语言,Cucumber 能让你用自然的英语语言表述 app 的行为,实现 BDD(Behavior Driven Development,行为驱动开发)。

而 Calabash-iOS 就是一个基于 Calabash 的 iOS 的功能、自动化测试框架。

优点:

缺点:

具体资料获取路径:https://github.com/calabash/calabash-ios

6. Subliminal

Subliminal 是另一款与 XCTest 集成的框架,也是个不错 iOS 集成测试框架。

与 KIF 不同的是,它基于 UIAutomation 编写,对开发者隐藏 UIAutomation 中一些复杂的细节。可惜近几年没有更新了,若能支持 swift 就好了。

具体资料获取路径:https://github.com/Diaoul/subliminal

7. Kiwi

Kiwi 是对 XCTest 的一个完整替代,使用 xSpec 风格编写测试。Kiwi 带有自己的一套工具集,包括 expectations、mocks、stubs,甚至还支持异步测试。

它是一个适用于 iOS 开发的 Behavior Driven Development(BDD)库,有着非常漂亮的语法。

优点在于其简洁的接口和可用性,易于设置和使用,可以写出结构性强易读测试,非常适合新手开发者

Kiwi 也是使用 Objective-C 语言编写,易于 iOS 开发人员上手。

具体资料获取路径:https://github.com/kiwi-bdd/Kiwi
8. Appium

Appium 是一个开源的、跨平台的自动化测试工具,支持 iOS、Android 和 FirefoxOS 平台。

通过 Appium,开发者无需重新编译 app 或者做任何调整,就可以测试移动应用,可以使测试代码访问后端 API 和数据库。

它是通过驱动苹果的 UIAutomation 框架来实现的 iOS 平台支持。

开发者可以使用 WebDriver 兼容的任何语言编写测试脚本,如 Ruby,C#,Java, JS,OC, PHP,Python,Perl 和 Clojure 语言。

具体资料获取路径:http://appium.io/

内测发布工具

1. fir.im

为开发者提供测试应用极速发布,应用崩溃实时分析、用户反馈收集等一系列开发测试效率工具服务,帮助开发者将更多精力放在产品的开发与应用的优化上。

2. 蒲公英

『蒲公英』是专为 iOS、Android 开发者提供的免费用应用内测、托管的平台,旨在解决开发者将应用分发给内测用户时的繁杂、低效的问题。

3. TestFlight

TestFlight 是苹果提供的应用测试工具,允许开发者邀请用户对应用的预发布版本进行测试,从而在应用正式发布至 App Store 前收集用户反馈。

以上常用框架介绍完了,本篇幅主要以appium进行实践讲解

Appium驱动IOS测试原理

通过上图我们了解到 Appium 很粗暴的把整个 WebDriverAgent 直接集成到自己的项目里,然后通信机制就走 WebDriverAgent,Appium 其实就提供了一个 Client 端的作用。所以 iOS 9.3 系统之后自动化测试核心是 WebDriverAgent,Appium 就提供了一个 Client 端来写脚本和发送指令。

Appium 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:

image.png

从图中可以看出:

关于 WebDriverAgent

FaceBook 出品:

基础环境搭建

基础环境: 一台苹果笔记本、一个iphone手机

基础环境

Macbook Pro(做 iOS 测试,Mac 是绕不开的,我们依赖的软件环境需要运行在 Mac 上,必须要有一台 Mac 本(很贵),得攒银子咬牙买一台 😓~,我用的公司分配的测试本)。

iPhone、iPad:既然测试 iOS 软件,那 iPhone 和 iPad 也自然不用多说了,虽然 Xcode 里有虚拟机,但是实际测试还是以真机为准。本文也主要以真机为准

appium原理

Appium是一个开源、跨平台的测试框架,可以用来测试原生混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar’s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本。

Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架。如果只使用Apple的UIAutomation,我们只能用javascript来编写测试用例,而且只能用Instruction来运行测试用例。同样,如果只使用Google的UIAutomation,我们就只能用java来编写测试用例。Appium实现了真正的跨平台自动化测试。

appium选择了client-server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是appium及webdriver如何做到支持多语言的;

Appium优点

Appium理念

Appium 在 iOS 下工具的变革:

MacBook appstore应用商店搜索下载即可

安装内容

前提环境:

python , selenium , setuptools、pip

通用环境:

Homebrew ,Node & NPM ,Carthage ,Appium ,python-client ,Appium-Doctor , ios-deploy , ideviceinstaller & libimobiledevice , ios_webkit_debug_proxy , authroize-ios

IOS环境:

xCode , Command Line Tools

前提环境

通用环境

     ```
     /usr/bin/ruby homebrew.txt
     
     ```
     
     
     
     注意:此步骤还顺带安装了Xcode命令行工具(xcode-commaindline-tools)。
     ```
     brew install node
     
     ```
     
   
 2.  查看node版本
     
     
 
 ```
 node -v
 
```

 ```
 重新安装: 
 
 ```
 
 ```
 brew reinstall node
 
 ```
 
 3.  默认的npm源再国内都很慢,安装好node之后需要重新配置一个国内源 (非必须)
 
 ```
 npm config set registry https://registry.npm.taobao.org/
 
 ```
     ```
     git clone git@github.com:appium/python-client.git
   
     ```
     
     
 2.  安装python-client
    
    
     
     ```
     cd python-client # 进入python-client目录
     python setup.py install # 安装python-client
     
     ```

iOS 环境

 2.  检验 Command Line Tools 是否安装成功
    
     

 方法一:
 
 ```
 xcode-select --install # 查看是否安装
 xcode-select: error: command line tools are already installed, use "Software Update" to install updates(错误:命令行工具已经安装,请使用“软件更新”安装更新)
 
 ```
 
 方法二:
 
 打开Xcode,创建一个新的项目,在OSX下面选择Application,如果右侧出现Command line tool图 标,表示已经安装成功。
 
 方法三:
 
 打开XCode 新建工程,如果安装了,在新建窗口可以看到
 
 ![image.png](https://img.haomeiwen.com/i293993/9bded08dd71dc85a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 
 3.  安装完成后,在终端中输入以下命令来查看安装版本:
 
 ```
 xcodebuild -version
 
 ```
 
 如果已经安装过xcode,appium-doctor提示未安装,则运行命令即可:

 ```
 sudo xcode-select -r
 
 ```
 
 **附录:**
 
 ```
xcrun simctl list | grep '(Booted)'  # 查看已启动的模拟器udid
 instruments -s devices      # 列出所有设备,包括真机、模拟器、mac
 # 录像功能 
xrecord --quicktime --list
 xrecord --quicktime --name="iPhone" --out="/Users/yong/video/iphone.mp4" --force
 
 ```

至此iOS环境搭建完毕!!!只适用于模拟器,真机的话还需要配置。

iOS 真机调试环境配置

前面我们知道WebDriverAgent是集成Appium测试ios应用的桥梁 (表现形式上:是安装在ios设备上的一个应用),WebDriverAgent 先前是一个独立的项目需要自己从github下载进行编译执行 ,在后来appium已经强行将其绑定在其组件中也就是说当你安装好appium时,WebDriverAgent也自动帮忙将其安装好,只需要手动修改部分内容,重新编译打包即可运行。

方式一:WebDriverAgent通过下载源码进行安装

不推荐通过此种方式安装,该方式先前是为老版本ios 9.4 之前的版本沿用 ,且 github上的源码已经距离现在两年多没有更新了,为避免不必要的问题。尽可能不要使用此种方式

  1. 安装webdriverAgent

(1) 在github上下载最新webdriverAgent代码

git clone https://github.com/facebook/WebDriverAgent

(2)下载依赖

cd /Users/yourname/WebDriverAgent

mkdir -p Resources/WebDriverAgent.bundle

sh ./Scripts/bootstrap.sh

该脚本会使用Carthage下载所有的依赖,使用npm打包响应的js文件。执行完成后,直接双击打开WebDriverAgent.xcodeproj这个文件。

  1. 配置webdriverAgent

    配置WebDriverAgentLib,选择开发者账号

    image.png

    配置WebDriverAgentRunner,选择开发者账号

    image.png
  2. 连接并选择自己的ios设备,运行

image.png image.png image.png

运行成功后,iphone手机上会新建一个无图标的WebDriverAgent的应用,自动打开后马上又返回桌面

image.png
而在xcode控制台会打印如下日志:里面有IP地址与端口号 

image.png
  1. 在网址上输入http://(ip地址):(端口号)/status,如果网页上返回一些json格式的数据,说明运行成功http://10.0.223.58:8100/status,有些iphone手机通过手机的IP和端口号还不能访问,此时需要将手机的端口转发到mac上

    iproxy 8100 8100 # iproxy 8300 8100

    执行命令后,通过访问 http://localhost:8100/ status来验证, 如果网页上返回一些json格式的数据,说明运行成功

    image.png

    而如果是想查看UI的图层,则可访问http://localhost:8100/inspector,方便书写测试用例

    image.png

    备注:

    通常来说为了持续集成,自动化会比较好一些,我们不必每次都通过这种方式来启动xcode、WebDriverAgent,这种方式只在第1次搭建环境时运行即可,我们可以在自动化脚本中加入如下代码,这样只要在以后启动appium后,运行自动化脚本,就会直接启动WebDriverAgent

    desiredCapabilities.setCapability("useNewWDA", true);

如果xcode在先启动wda,而代码中又用此行代码,运行时xcode中会显示执行失败,报 出冲突的错误哦,所以后期只在代码中启动WebDriverAgent即可,不再需要用xcode启动

精简过程如下:

image.png

方式二:WebDriverAgent通过集成appium进行安装

命令行安装: 命令行安装的appium一般安装在/usr/local/bin/appium下,

WebDriverAgent将会在路径:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

桌面版安装: WebDriverAgent的路径是:ls /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

以上两种方式都可以在对应目录看到 WebDriverAgent.xcodeproj 工程,右键选择用xcode打开 ; 在 “Signing&Capabilities” 下将 WebDriverAgentLibWebDriverAgentRunner设置成 “Automatically manage signing” 并在 “Team” 中选择你的开发团队 ;

cLSDFP.png

cLSrJf.png

新用户第一次需要创建Team团队

cLS2Lj.png

cLSWes.png
cLShoq.png

cLS5F0.png

cLSoWT.png

剩下操作步骤和方式一种第3步一样, 不在此列出 ;

IOS自动化-WebDriverAgent-APPIUM框架原理

WebDriverAgent是Facebook开发的基于XCTest.framework的开源项目,实现了在iOS上支持WebDriver协议的服务,可以用来启动/终止APP,点击/滑动页面。

webdriver协议是一套基于HTTP协议的JSON格式规范,协议规定了不同操作对应的格式。之所以需要这层协议,是因为iOS、Android、浏览器等都有自己的UI交互方式,通过这层”驱动层“屏蔽各平台的差异,就可以通过相同的方式进行自动化的UI操作,做网络爬虫常用的selenium是浏览器上实现webdriver的驱动,而WebDriverAgent则是iOS上实现webdriver的驱动。

Appium客户端

在iOS上的客户端实际上就是使用了WebDriverAgent,作为实现webdriver协议的驱动层。

Appium服务端

Appium的服务端是一个桌面应用,用于和客户端通信,启动Appium的服务端之后,会在电脑上启动一个默认端口号是4723的HTTP服务。当我们编写完脚本执行时,脚本代码会被转换为webdriver协议的JSON数据,通过HTTP请求发送到电脑的4723端口。Appium服务端将脚本的执行请求下发给客户端(请求客户端的6100端口),客户端同样使用webdriver协议响应

利用Appium-Python-Client进行iOS的自动化测试

配置 appium 工具

  1. 运行 Appium-Desktop

    cLciBn.png
  2. 开启start server

cLcAA0.png
  1. 点击start new session并且在Desired Capabilities 中输入相关的参数后点击Start Session

cLcNge.png
  1. 运行成功后,会弹出一个控制界面,在该界面中可以控制手机上正在运行的程序

cLcdud.png

开始自动化测试

  1. 打开下载后的appiumSimpleDemo文件,打开appiumSimpleDemo.xcodepro程序,配置下TARGET的签名

  2. 在appiumSimpleDemo的根目录执行编译指令,编译出一个app文件xcodebuild -sdk iphoneos -target appiumSimpleDemo -configuration Release,编译成功后app文件的地址会打印在命令行中 ;此处直接使用 xcode进行编译也可以 ,怎么方便怎么来

cLcc8S.png
  1. 执行appiumSimpleDemo.py 文件路径如下:/Users/jx/PycharmProjects/53ui_ios/venv/bin/python /Users/jx/appiumSimpleDemo/appiumSimpleDemo.py

cLcxV1.png

源码如下:

import unittest
import os
from appium import webdriver
from time  import sleep

class  appiumSimpleTezt (unittest.TestCase):

    def  setUp(self):
        app_path = '/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app'
        app = os.path.abspath(app_path)

        self.driver = webdriver.Remote(
            command_executor = 'http://127.0.0.1:4723/wd/hub',
            desired_capabilities = {

                'app': app,
                'platformName': 'iOS',
                'platformVersion': '14.4',
                'deviceName': 'iPhone 8 plus',
                'bundleId': 'com.yongapps.app',
                'udid': '4c7a46cee7f512ff1463eb3b09dc5329e779355c'
            }
            )

    def test_push_view(self):
        next_view_button = self.driver.find_element_by_accessibility_id("entry next view")
        next_view_button.click()

        sleep(2)

        back_view_button = self.driver.find_element_by_accessibility_id("Back")
        back_view_button.click()

    def tearDown(self):
        sleep(1)
        # self.driver.quit()

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)
    unittest.TextTestRunner(verbosity=2).run(suite)

踩坑笔记

问题1: 如果安装 carthage出现以下错误:

Error: An unexpected error occurred during the brew link step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

原因是carthage已经安装,但是没有 link 到 brew,还有就是文件夹权限问题,在终端输入:

MacBook-pro~ % sudo mkdir /usr/local/Frameworks
MacBook-pro~ % sudo chown $(whoami):admin /usr/local/Frameworks
MacBook-pro~ % brrew link carthage

问题2: 安装 libimobiledevice & ideviceinstaller 遇到: “invalid active developer path”

运行:

MacBook-pro~ % xcode-select --install
MacBook-pro ~ % sudo xcode-select -r 

可能出现的问题

dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib Referenced from:
/usr/local/opt/libimobiledevice/lib/libimobiledevice.6.dylib Reason: image not found

如果遇到如上错误,则先卸载ideviceinstaller 和 libimobiledevice

MacBook-pro ~ % brew uninstall ideviceinstaller
MacBook-pro ~ % brew uninstall libimobiledevice

然后再重安装即可

问题3: ios-webkit-debug-proxy 安装遇到 The following directories are not writable by your user:

详细错误提示:

 The following directories are not writable by your user:

        /usr/local/share/man/man5

        /usr/local/share/man/man7

解决方法:因为是该目录无权限无法写入的问题,所以直接sudo给上权限就可以了,然后再使用安装命令就可以了,示例如下图:

image.png

问题4:xcode-select --install命令行安装提示 Xcode alone is not sufficient on Sierra.

Error: Xcode alone is not sufficient on Sierra.
Install the Command Line Tools:
  xcode-select --install

解决方案: Mac最新场景下安装Xcode时已经没有Command Line了,需要单独安装。根据提示在使用命令xcode-select --install` 安装时最后结果是不能安装该软件。 需要安装如上所示

问题5:方式一 安装WebDriverAgent 执行 ./Scripts/bootsrap.sh 出错如下

image.png

安装最后我们可以看到部分依赖安装需要安装 Carthage 这个东西,如果没注意的话就会造成 RoutingHTTPServer 部分文件缺失,后面 build 就会报错 。

image.png image.png

通过命令 brew install carthage 安装后再执行 ./Scripts/bootstrap.sh 即可。

根据 WebDriverAgent 官网提供的步骤,将参数替换为我们真机的参数后在真机上尝试build 。

image.png

执行完命令后可能会出现如下报错

image.png

从报错信息来看,缺少 development team,那么我们回到 Xcode,将 Automatically manage signing 进行勾选后选择一个 Team,注意要进入 WebDriverAgentRunner 中进行设置 。

在这里插入图片描述

设置好之后又会出现报错,如下:

cqxmfU.png

这个报错信息就和我们之前提到的一样,bundle indentifler 不唯一,保险起见,这里将项目中所有的 Targets 都进行了修改

修改好之后我们再次 build,之前的问题解决了,不幸的是 build 又 fail 了,又出现了新的报错:

cqxKl4.png

解决办法:

没错,我们在报错出双击,进入到报错代码处,将 assign 改为 strong 后再次 build :

cqxJk6.png

Build succeeded !!!老泪纵横…

最终,再执行

最后踩坑:build成功后,ios真机上没有安装WDA
这个问题困扰了我一个星期,然后最后我把ios设备名改成英文后安装成功了。。。

终于在 iOS 真机上看到了 WDA 的身影

cqxa1e.png

问题6:执行 ./Scripts/bootstrap.sh ERROR in ./js/app.js 报错 出错如下

cqx5Bn.png

cqxTA0.png

cqx7NV.png

问题7: 执行时候报 xcodebuild failed with code 65 错误

cqxq9U.png

cqxL3F.png

问题8: 个人证书调试失败

Failed to register bundle identifier.
The app identifier "com.facebook.WebDriverAgentRunner" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.

需要手动更改目标的bundle id,方法是进入“Build Settings”选项,更改“Product bundle Identifier”的值使Xcode将接受,默认为com.facebook.WebDriverAgentRunner,你需要改成不一样的,如:io.automation.WebDriverAgentRunner (此处必须修改为和你在苹果开发者后台申请的bundle Id 一样 )

cLSXwR.png

返回 “Signing&Capabilities” 选项,看到对于文件WebDriverAgentRunner的配置文件已经创建成功了

cLSzY6.png

cLpClD.png

问题9: 解决警告问题

解决方案如下:

cLpP6e.png

问题10: 将WDA安装到被测手机上,安装失败 ,提示如下

报错:
error: No profiles for 'io.uitest.WebDriverAgentRunner.xctrunner' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'io.uitest.WebDriverAgentRunner.xctrunner'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'WebDriverAgentRunner' from project 'WebDriverAgent')

报这个错是因为没有接入相关的设备到MAC上,只要设备接入,并通过XCode菜单:Product->Destnation->"Select Devices"选中要连接的设备就行。

解决方案:

XCode:
Product->Destination->"Select your iphone"

cLpup8.png

Product->Scheme->"Select WebDriverAgentRunner"

cLpQXQ.png

Product -> Test

cLp30s.png

注意:运行Test之前,手机先解锁再通过USB线连接到电脑。

问题10: 解决Product -> Test报错问题,如下所示

cLp87n.png
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj User-supplied CFBundleIdentifier value 'com.facebook.wda.lib' in the Info.plist must be the same as the PRODUCT_BUNDLE_IDENTIFIER build setting value 'com.facebook.WebDriverAgentLib'.

解决方案:

cLpthV.png

运行报错:

cL9AvF.png
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h:16:9: 'CocoaAsyncSocket/GCDAsyncSocket.h' file not found

解决:进入appium-webdriveragent目录,重新执行:

MacBook-pro % cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
MacBook-pro appium-webdriveragent % sh ./Scripts/bootstrap.sh

cL9nER.png

再次执行Product -> Test,弹出密钥授权弹窗,输入密钥(多次输入密钥,直到弹窗消失)

cL9K4x.png

cL93vD.png

最后报错:Command CodeSign failed with a nonzero exit code
解决方案---通过终端命令:

MacBook-pro appium-webdriveragent % xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=000-000080E' test

执行中会弹出密钥弹窗,多次输入密钥,直到弹窗消失

最后机上可以看到一个没有图标的 WebDriverAgentRunner.app 应用,进入设置 -》通用 -》设备管理 -》点击 开发者app下面的证书 -》点击“第一个蓝色字体信任按钮” -》点击信任,再重新执行项目即可正常连接
xcode点击▶️直接运行:

cL9UUI.png

再次报错:

 /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj User-supplied CFBundleIdentifier value 'com.facebook.wda.runner' in the Info.plist must be the same as the PRODUCT_BUNDLE_IDENTIFIER build setting value 'io.uitest.WebDriverAgentRunner'.

解决方案:

cL9B28.png

最终看到这样输出就是成功了:

Test Suite ‘All tests’ started at 2017-01-23 15:49:12.585
Test Suite ‘WebDriverAgentRunner.xctest’ started at 2017-01-23 15:49:12.586
Test Suite ‘UITestingUITests’ started at 2017-01-23 15:49:12.587
Test Case ‘-[UITestingUITests testRunner]’ started.
t = 0.00s Start Test at 2017-01-23 15:49:12.588
t = 0.00s Set Up

备注:

xxx.app为 Xcode 编译后的应用安装包路径

xxx.ipa为应用在本地的路径

问题11: wda安装成功了,但是 验证时访问无结果

image

解决方案:

cLAnVe.png

有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。

使用--HEAD安装最新版本

$ brew install libimobiledevice --HEAD $ iproxy 8100 8100

这时通过访问http://localhost:8100/status确认WDA是否运行成功。

此时你应该可以看到有返回信息,只不过返回的sessionID 为空 ,此处如果有问题见问题12

问题12: Appium 重签名后的 wda 正常启动了,但是没有返回 sessionID

wda 的日志 如下:

Test Suite 'WebDriverAgentRunner.xctest' started at 2020-06-12 15:20:28.188
Test Suite 'UITestingUITests' started at 2020-06-12 15:20:28.188
2020-06-12 15:20:28.215329+0800 WebDriverAgentRunner-Runner[616:123635] [User Defaults] Couldn't write values for keys (
    KeyboardAutocorrection
) in CFPrefsPlistSource<0x282b9ed00> (Domain: com.apple.Preferences, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access
2020-06-12 15:20:28.221426+0800 WebDriverAgentRunner-Runner[616:123635] [User Defaults] Couldn't write values for keys (
    KeyboardPrediction
) in CFPrefsPlistSource<0x282b9ed00> (Domain: com.apple.Preferences, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access
2020-06-12 15:20:28.222215+0800 WebDriverAgentRunner-Runner[616:123635] [User Defaults] Couldn't write values for keys (
    KeyboardShowPredictionBar
) in CFPrefsPlistSource<0x282b9ed00> (Domain: com.apple.Preferences, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access
2020-06-12 15:20:28.224043+0800 WebDriverAgentRunner-Runner[616:123635] [User Defaults] Couldn't write values for keys (
    DidShowGestureKeyboardIntroduction
) in CFPrefsPlistSource<0x282b9ed00> (Domain: com.apple.Preferences, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access
Test Case '-[UITestingUITests testRunner]' started.
    t =     0.00s Start Test at 2020-06-12 15:20:28.224
    t =     0.00s Set Up
2020-06-12 15:20:28.230656+0800 WebDriverAgentRunner-Runner[616:123635] Built at Jun 12 2020 15:19:29
2020-06-12 15:20:28.238785+0800 WebDriverAgentRunner-Runner[616:123635] ServerURLHere->http://172.18.62.8:8100<-ServerURLHere
2020-06-12 15:20:28.239467+0800 WebDriverAgentRunner-Runner[616:123836] Using singleton test manager

使用 postman 发送请求,返回的 sessionID 为 null,但是 xcode 的控制台没有报任何错误

cLA5xx.png

启动应用程序直接返回 400

cLA7qO.png

此问题坑爹至极 ,网上搜索了众多内容都没有此问题的答案 ;但是有人在testhome上已经提出了这个问题但是至今没有人回复答案 ;

解决方案:

  1. 安装usbmuxd

    brew install usbmuxd
    
    
  2. iproxy该工具会将设备上的端口号映射到电脑上的某一个端口

cLZAvq.png

最后使用iproxy 进行端口转发的时候, 一定跟上指定的设备id

即: iproxy local_port device_port -u udid

问题13:解决 XCUITest iproxy exited with code 208

命令行执行

ps -ax|grep -**i** "iproxy"|grep -v grep|awk '{print "kill -9 " $1}'|sh 

问题14:每次测试应用都需要启动 WebDriverAgent , 修改使用脚本方式自动运行

# 解锁keychain,以便可以正常的签名应用,
PASSWORD="YourPassword"
security unlock-keychain -p $PASSWORD ~/Library/Keychains/login.keychain

# 获取设备的UDID,用到了之前的 libimobiledevice
UDID=$(idevice_id -l | head -n1)

# 真机运行测试
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$UDID" test

# 模拟器运行测试
#xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "platform=iOS Simulator,name=iPhone X" test

脚本运行完成后,同样手机/模拟器上会出现一个无图标的 WebDriverAgent 应用,启动之后,马上又返回到桌面。此时终端会输出 IP 地址和端口。

附录

1. 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系

考虑到想要将待测试应用安装到真机 ,首先绕不过去的必须得申请证书,申请证书之前又必须得要开发者账号,以上都具备了开始按步骤申请Certificate、Provisioning Profile、App ID ;可是即使你申请成功,难免对以上三者之间关系感到懵逼,以下对三者之间关系进行简介说明,帮助理清之间的脉络关系

  1. 开发者账号类型
image.png
  1. 概念介绍

    如果你拥有一个开发者账户的话,在iOS Dev Center打开Certificates, Indentifiers & Profiles,你就可以看到如下的列表:

    image.png

    Profile Portal改版有一段时间了,改版之后的结构比以前更清晰明了,易于理解和管理。

    上面的列表就包含了开发、调试和发布iOS应用程序所需的所有内容:Certificates、Identifiers、Devices、Provisioning Profiles。下面将一一解释这几个东东。

    Certificate

    证书是用来给应用程序签名的,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的。在Xcode Build Setting的Code Signing Identity中,你可以设置用于为代码签名的证书。

    众所周知,我们申请一个Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你Mac的Keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。如下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,所以如果没有了私钥,就意味着你不能进行签名了,所以就无法使用这个证书了,此时你只能revoke之前的证书再申请一个。因此在申请完证书时,最好导出并保存好你的私钥。当你想与其他人或其他设备共享证书时,把私钥传给它就可以了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。

    image.png

    证书主要分为两类:Development和Production,Development证书用来开发和调试应用程序,Production主要用来分发应用程序(根据证书种类有不同作用),下面是证书的分类信息:(括号内为证书有效期)

    (注:不同类型的开发者账户所能创建的证书种类不同,关于开发者账户的对比和InHouse证书相关的内容,请见我的另一篇文章)

    • Development

      • App Development (1年):用来开发和真机调试应用程序。
      • Push Development (1年):用来调试Apple Push Notification
    • Production

      • In-House and Ad Hoc (3年):用来发布In-House和AdHoc的应用程序。

      App Store :用来发布提交App Store的应用程序。

      • MDM CSR

      • Push Production (1年):用来在发布版本中使用Apple Push Notification。

      • Pass Type ID Certificate

      • Website Push ID Certificate

    有一些类型的证书我没有使用过,所以也不了解具体的作用。

    App ID

    App ID用于标识一个或者一组App,App ID应该是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有以下两种:

    • Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.ABC.demo1,标识Bundle ID为com.ABC.demo1的程序。
    • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如可以表示所有应用程序,而com.ABC.可以表示以com.ABC开头的所有应用程序。

    每创建一个App ID,我们都可以设置该App ID所使用的APP Services,也就是其所使用的额外服务。每种额外服务都有着不同的要求,例如,如果要使用Apple Push Notification Services,则必须是一个explicit App ID,以便能唯一标识一个应用程序。下面是目前所有可选的服务和相应的配置要求。

    image.png

    如果你的App使用上述的任何一种service,就要按照要求去配置。

    Device

    Device最简单了,就是iOS设备。Devices中包含了该账户中所有可用于开发和测试的设备。 每台设备使用UDID来唯一标识。

    每个账户中的设备数量限制是100个。Disable 一台设备也不会增加名额,只能在membership year 开始的时候才能通过删除设备来增加名额。

    Provisioning Profile

    一个Provisioning Profile文件包含了上述的所有内容:证书、App ID、设备。

    试想一下,如果我们要打包或者在真机上运行一个应用程序,我们首先需要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且验证Bundle ID是否与其一致;再次,如果是真机调试,需要确认这台设备能否用来运行程序。而Provisioning Profile就把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用,这样我们只要在不同的情况下选择不同的profile文件就可以了。而且这个Provisioning Profile文件会在打包时嵌入.ipa的包里。

    例如,如下图所示,一个用于Development的Provisioning Profile中包含了该Provisioning Profile对应的App ID,可使用的证书和设备。这意味着使用这个Provisioning Profile打包程序必须拥有相应的证书,并且是将App ID对应的程序运行到Devices中包含的设备上去。

image.png

如上所述,在一台设备上运行应用程序的过程如下:

image.png

与证书一样,Provisioning Profile也分为Development和Distribution两种:

(注:前面提到不同账户类型所能创建的证书种类不同,显然Profile文件的种类是和你所能创建的证书种类相关的)

In House 与Ad Hoc的不同之处在于:In House没有设备数量限制,而Ad Hoc是用来测试用的,Ad Hoc的包只能运行在该账户内已登记的可用设备上,显然是有最多100个设备的数量限制。所以这两种Provisioning Profile文件的区别就在于其中的设备限制不一样而已,而他们所使用的Certificate是相同的。

  1. 开发/发布流程

了解了上面的概念,再来看开发及发布流程就非常简单了,而且相信你不用看教程也能一步步完成所有的操作了。

开发/真机调试流程

根据上面的介绍,可以知道进行Development主要有以下几个步骤:

事实上第三步通常是不需要的,因为我们通常都是用Xcode生成和管理的iOS Team Provisioning Profile来进行开发,因为它非常方便,所以不需要自己手动生成Provisioning Profile。

iOS Team Provisioning Profile是第一次使用Xcode添加设备时,Xcode自动生成的,它包含了Xcode生成的一个Wildcard App ID(*,匹配所有应用程序),账户里面所有的Devices和所有Development Certificates,如下图所示。因此,team中的所有成员都可以使用这个iOS Team Provisioning Profile在team中的所有设备上调试所有的应用程序。并且当有新设备添加进来时,Xcode会更新这个文件。

image.png

发布流程

网上有很多关于发布App Store的流程,我就不缀述了,不过根据上面的概念介绍,不管是App Store、In-House还是Ad-Hoc,打包流程都是差不多的,都包括了以下几个关键步骤:

2. WebDriverAgent 整体框架设计

image.png

GitHub的描述:

WebDriverAgent is a WebDriver server implementation for iOS that can be used to remote control iOS devices. It allows you to launch & kill applications, tap & scroll views or confirm view presence on a screen. This makes it a perfect tool for application end-to-end testing or general purpose device automation. It works by linking XCTest.framework and calling Apple's API to execute commands directly on a device. WebDriverAgent is developed and used at Facebook for end-to-end testing and is successfully adopted by Appium.

WebDriverAgent在iOS端实现了一个WebDriverServer,可用于远程控制iOS设备。它允许您启动和终止应用程序,点击和滚动视图或确认屏幕上的视图状态。这使其成为应用端到端测试或通用设备自动化的完美工具。它通过链接XCTest.framework和调用Apple的API来直接在设备上执行命令。WebDriverAgent在Facebook上开发并用于端到端测试,并被Appium成功采用。
特性:

WDA Client

WDA Client是基于WebDriverAgent实现的WDA的客户端。

我们在 iOS 设备上启动了 WDA 的服务端。为了运行 Mac OS 上的脚本,我们需要在 Mac OS 上安装 WDA 客户端。

facebook-wda 就是 WDA 的 Python 客户端库,通过直接构造HTTP请求直接跟WebDriverAgent通信。

# 安装 WDA python 客户端
pip3 install --pre facebook-wda
上一篇 下一篇

猜你喜欢

热点阅读